diff options
Diffstat (limited to 'fips/aes/fips_gcmtest.c')
-rw-r--r-- | fips/aes/fips_gcmtest.c | 571 |
1 files changed, 0 insertions, 571 deletions
diff --git a/fips/aes/fips_gcmtest.c b/fips/aes/fips_gcmtest.c deleted file mode 100644 index 9f50857fb9..0000000000 --- a/fips/aes/fips_gcmtest.c +++ /dev/null @@ -1,571 +0,0 @@ -/* fips/aes/fips_gcmtest.c */ -/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL - * project. - */ -/* ==================================================================== - * Copyright (c) 2011 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * licensing@OpenSSL.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - */ - - -#define OPENSSL_FIPSAPI -#include <openssl/opensslconf.h> - -#ifndef OPENSSL_FIPS -#include <stdio.h> - -int main(int argc, char **argv) -{ - printf("No FIPS GCM support\n"); - return(0); -} -#else - -#include <openssl/bn.h> -#include <openssl/dsa.h> -#include <openssl/fips.h> -#include <openssl/err.h> -#include <openssl/evp.h> -#include <string.h> -#include <ctype.h> - -#include "fips_utl.h" - -static void gcmtest(FILE *in, FILE *out, int encrypt) - { - char buf[2048]; - char lbuf[2048]; - char *keyword, *value; - int keylen = -1, ivlen = -1, aadlen = -1, taglen = -1, ptlen = -1; - int rv; - long l; - unsigned char *key = NULL, *iv = NULL, *aad = NULL, *tag = NULL; - unsigned char *ct = NULL, *pt = NULL; - EVP_CIPHER_CTX ctx; - const EVP_CIPHER *gcm = NULL; - FIPS_cipher_ctx_init(&ctx); - - while(fgets(buf,sizeof buf,in) != NULL) - { - fputs(buf,out); - if (!parse_line(&keyword, &value, lbuf, buf)) - continue; - if(!strcmp(keyword,"[Keylen")) - { - keylen = atoi(value); - if (keylen == 128) - gcm = EVP_aes_128_gcm(); - else if (keylen == 192) - gcm = EVP_aes_192_gcm(); - else if (keylen == 256) - gcm = EVP_aes_256_gcm(); - else - { - fprintf(stderr, "Unsupported keylen %d\n", - keylen); - } - keylen >>= 3; - } - else if (!strcmp(keyword, "[IVlen")) - ivlen = atoi(value) >> 3; - else if (!strcmp(keyword, "[AADlen")) - aadlen = atoi(value) >> 3; - else if (!strcmp(keyword, "[Taglen")) - taglen = atoi(value) >> 3; - else if (!strcmp(keyword, "[PTlen")) - ptlen = atoi(value) >> 3; - else if(!strcmp(keyword,"Key")) - { - key = hex2bin_m(value, &l); - if (l != keylen) - { - fprintf(stderr, "Inconsistent Key length\n"); - exit(1); - } - } - else if(!strcmp(keyword,"IV")) - { - iv = hex2bin_m(value, &l); - if (l != ivlen) - { - fprintf(stderr, "Inconsistent IV length\n"); - exit(1); - } - } - else if(!strcmp(keyword,"PT")) - { - pt = hex2bin_m(value, &l); - if (l != ptlen) - { - fprintf(stderr, "Inconsistent PT length\n"); - exit(1); - } - } - else if(!strcmp(keyword,"CT")) - { - ct = hex2bin_m(value, &l); - if (l != ptlen) - { - fprintf(stderr, "Inconsistent CT length\n"); - exit(1); - } - } - else if(!strcmp(keyword,"AAD")) - { - aad = hex2bin_m(value, &l); - if (l != aadlen) - { - fprintf(stderr, "Inconsistent AAD length\n"); - exit(1); - } - } - else if(!strcmp(keyword,"Tag")) - { - tag = hex2bin_m(value, &l); - if (l != taglen) - { - fprintf(stderr, "Inconsistent Tag length\n"); - exit(1); - } - } - if (encrypt && pt && aad && (iv || encrypt==1)) - { - tag = OPENSSL_malloc(taglen); - FIPS_cipherinit(&ctx, gcm, NULL, NULL, 1); - /* Relax FIPS constraints for testing */ - M_EVP_CIPHER_CTX_set_flags(&ctx, EVP_CIPH_FLAG_NON_FIPS_ALLOW); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, ivlen, 0); - if (encrypt == 1) - { - static unsigned char iv_fixed[4] = {1,2,3,4}; - if (!iv) - iv = OPENSSL_malloc(ivlen); - FIPS_cipherinit(&ctx, NULL, key, NULL, 1); - FIPS_cipher_ctx_ctrl(&ctx, - EVP_CTRL_GCM_SET_IV_FIXED, - 4, iv_fixed); - if (!FIPS_cipher_ctx_ctrl(&ctx, - EVP_CTRL_GCM_IV_GEN, 0, iv)) - { - fprintf(stderr, "IV gen error\n"); - exit(1); - } - OutputValue("IV", iv, ivlen, out, 0); - } - else - FIPS_cipherinit(&ctx, NULL, key, iv, 1); - - - if (aadlen) - FIPS_cipher(&ctx, NULL, aad, aadlen); - if (ptlen) - { - ct = OPENSSL_malloc(ptlen); - rv = FIPS_cipher(&ctx, ct, pt, ptlen); - } - FIPS_cipher(&ctx, NULL, NULL, 0); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, - taglen, tag); - OutputValue("CT", ct, ptlen, out, 0); - OutputValue("Tag", tag, taglen, out, 0); - if (iv) - OPENSSL_free(iv); - if (aad) - OPENSSL_free(aad); - if (ct) - OPENSSL_free(ct); - if (pt) - OPENSSL_free(pt); - if (key) - OPENSSL_free(key); - if (tag) - OPENSSL_free(tag); - iv = aad = ct = pt = key = tag = NULL; - } - if (!encrypt && tag) - { - FIPS_cipherinit(&ctx, gcm, NULL, NULL, 0); - /* Relax FIPS constraints for testing */ - M_EVP_CIPHER_CTX_set_flags(&ctx, EVP_CIPH_FLAG_NON_FIPS_ALLOW); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, ivlen, 0); - FIPS_cipherinit(&ctx, NULL, key, iv, 0); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, taglen, tag); - if (aadlen) - FIPS_cipher(&ctx, NULL, aad, aadlen); - if (ptlen) - { - pt = OPENSSL_malloc(ptlen); - rv = FIPS_cipher(&ctx, pt, ct, ptlen); - } - rv = FIPS_cipher(&ctx, NULL, NULL, 0); - if (rv < 0) - fprintf(out, "FAIL" RESP_EOL); - else - OutputValue("PT", pt, ptlen, out, 0); - if (iv) - OPENSSL_free(iv); - if (aad) - OPENSSL_free(aad); - if (ct) - OPENSSL_free(ct); - if (pt) - OPENSSL_free(pt); - if (key) - OPENSSL_free(key); - if (tag) - OPENSSL_free(tag); - iv = aad = ct = pt = key = tag = NULL; - } - } - FIPS_cipher_ctx_cleanup(&ctx); - } - -static void xtstest(FILE *in, FILE *out) - { - char buf[204800]; - char lbuf[204800]; - char *keyword, *value; - int inlen = 0; - int encrypt = 0; - long l; - unsigned char *key = NULL, *iv = NULL; - unsigned char *inbuf = NULL, *outbuf = NULL; - EVP_CIPHER_CTX ctx; - const EVP_CIPHER *xts = NULL; - FIPS_cipher_ctx_init(&ctx); - - while(fgets(buf,sizeof buf,in) != NULL) - { - fputs(buf,out); - if (buf[0] == '[' && strlen(buf) >= 9) - { - if(!strncmp(buf,"[ENCRYPT]", 9)) - encrypt = 1; - else if(!strncmp(buf,"[DECRYPT]", 9)) - encrypt = 0; - } - if (!parse_line(&keyword, &value, lbuf, buf)) - continue; - else if(!strcmp(keyword,"Key")) - { - key = hex2bin_m(value, &l); - if (l == 32) - xts = EVP_aes_128_xts(); - else if (l == 64) - xts = EVP_aes_256_xts(); - else - { - fprintf(stderr, "Inconsistent Key length\n"); - exit(1); - } - } - else if(!strcmp(keyword,"i")) - { - iv = hex2bin_m(value, &l); - if (l != 16) - { - fprintf(stderr, "Inconsistent i length\n"); - exit(1); - } - } - else if(encrypt && !strcmp(keyword,"PT")) - { - inbuf = hex2bin_m(value, &l); - inlen = l; - } - else if(!encrypt && !strcmp(keyword,"CT")) - { - inbuf = hex2bin_m(value, &l); - inlen = l; - } - if (inbuf) - { - FIPS_cipherinit(&ctx, xts, key, iv, encrypt); - outbuf = OPENSSL_malloc(inlen); - FIPS_cipher(&ctx, outbuf, inbuf, inlen); - OutputValue(encrypt ? "CT":"PT", outbuf, inlen, out, 0); - OPENSSL_free(inbuf); - OPENSSL_free(outbuf); - OPENSSL_free(key); - OPENSSL_free(iv); - iv = key = inbuf = outbuf = NULL; - } - } - FIPS_cipher_ctx_cleanup(&ctx); - } - -static void ccmtest(FILE *in, FILE *out) - { - char buf[200048]; - char lbuf[200048]; - char *keyword, *value; - long l; - unsigned char *Key = NULL, *Nonce = NULL; - unsigned char *Adata = NULL, *Payload = NULL; - unsigned char *CT = NULL; - int Plen = -1, Nlen = -1, Tlen = -1, Alen = -1; - int decr = 0; - EVP_CIPHER_CTX ctx; - const EVP_CIPHER *ccm = NULL; - FIPS_cipher_ctx_init(&ctx); - - while(fgets(buf,sizeof buf,in) != NULL) - { - char *p; - fputs(buf,out); - redo: - if (!parse_line(&keyword, &value, lbuf, buf)) - continue; - - /* If surrounded by square brackets zap them */ - if (keyword[0] == '[') - { - keyword++; - p = strchr(value, ']'); - if (p) - *p = 0; - } - /* See if we have a comma separated list of parameters - * if so copy rest of line back to buffer and redo later. - */ - p = strchr(value, ','); - if (p) - { - *p = 0; - strcpy(buf, p + 1); - strcat(buf, "\n"); - decr = 1; - } - if (!strcmp(keyword,"Plen")) - Plen = atoi(value); - else if (!strcmp(keyword,"Nlen")) - Nlen = atoi(value); - else if (!strcmp(keyword,"Tlen")) - Tlen = atoi(value); - else if (!strcmp(keyword,"Alen")) - Alen = atoi(value); - if (p) - goto redo; - if (!strcmp(keyword,"Key")) - { - if (Key) - OPENSSL_free(Key); - Key = hex2bin_m(value, &l); - if (l == 16) - ccm = EVP_aes_128_ccm(); - else if (l == 24) - ccm = EVP_aes_192_ccm(); - else if (l == 32) - ccm = EVP_aes_256_ccm(); - else - { - fprintf(stderr, "Inconsistent Key length\n"); - exit(1); - } - } - else if (!strcmp(keyword,"Nonce")) - { - if (Nonce) - OPENSSL_free(Nonce); - Nonce = hex2bin_m(value, &l); - if (l != Nlen) - { - fprintf(stderr, "Inconsistent nonce length\n"); - exit(1); - } - } - else if (!strcmp(keyword,"Payload") && !decr) - { - Payload = hex2bin_m(value, &l); - if (Plen && l != Plen) - { - fprintf(stderr, "Inconsistent Payload length\n"); - exit(1); - } - } - else if (!strcmp(keyword,"Adata")) - { - if (Adata) - OPENSSL_free(Adata); - Adata = hex2bin_m(value, &l); - if (Alen && l != Alen) - { - fprintf(stderr, "Inconsistent Payload length\n"); - exit(1); - } - } - else if (!strcmp(keyword,"CT") && decr) - { - CT = hex2bin_m(value, &l); - if (l != (Plen + Tlen)) - { - fprintf(stderr, "Inconsistent CT length\n"); - exit(1); - } - } - if (Payload) - { - FIPS_cipherinit(&ctx, ccm, NULL, NULL, 1); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_CCM_SET_IVLEN, Nlen, 0); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_CCM_SET_TAG, Tlen, 0); - FIPS_cipherinit(&ctx, NULL, Key, Nonce, 1); - - FIPS_cipher(&ctx, NULL, NULL, Plen); - FIPS_cipher(&ctx, NULL, Adata, Alen); - CT = OPENSSL_malloc(Plen + Tlen); - FIPS_cipher(&ctx, CT, Payload, Plen); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_CCM_GET_TAG, Tlen, - CT + Plen); - OutputValue("CT", CT, Plen + Tlen, out, 0); - OPENSSL_free(CT); - OPENSSL_free(Payload); - CT = Payload = NULL; - } - if (CT) - { - int rv; - int len = Plen == 0 ? 1: Plen; - FIPS_cipherinit(&ctx, ccm, NULL, NULL, 0); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_CCM_SET_IVLEN, Nlen, 0); - FIPS_cipher_ctx_ctrl(&ctx, EVP_CTRL_CCM_SET_TAG, - Tlen, CT + Plen); - FIPS_cipherinit(&ctx, NULL, Key, Nonce, 0); - FIPS_cipher(&ctx, NULL, NULL, Plen); - FIPS_cipher(&ctx, NULL, Adata, Alen); - Payload = OPENSSL_malloc(len); - rv = FIPS_cipher(&ctx, Payload, CT, Plen); - if (rv >= 0) - { - if (rv == 0) - Payload[0] = 0; - fputs("Result = Pass" RESP_EOL, out); - OutputValue("Payload", Payload, len, out, 0); - } - else - fputs("Result = Fail" RESP_EOL, out); - OPENSSL_free(CT); - OPENSSL_free(Payload); - CT = Payload = NULL; - } - } - if (Key) - OPENSSL_free(Key); - if (Nonce) - OPENSSL_free(Nonce); - if (Adata) - OPENSSL_free(Adata); - FIPS_cipher_ctx_cleanup(&ctx); - } - -#ifdef FIPS_ALGVS -int fips_gcmtest_main(int argc, char **argv) -#else -int main(int argc, char **argv) -#endif - { - int encrypt; - int xts = 0, ccm = 0; - FILE *in, *out; - if (argc == 4) - { - in = fopen(argv[2], "r"); - if (!in) - { - fprintf(stderr, "Error opening input file\n"); - exit(1); - } - out = fopen(argv[3], "w"); - if (!out) - { - fprintf(stderr, "Error opening output file\n"); - exit(1); - } - } - else if (argc == 2) - { - in = stdin; - out = stdout; - } - else - { - fprintf(stderr,"%s [-encrypt|-decrypt]\n",argv[0]); - exit(1); - } - fips_algtest_init(); - if(!strcmp(argv[1],"-encrypt")) - encrypt = 1; - else if(!strcmp(argv[1],"-encryptIVext")) - encrypt = 2; - else if(!strcmp(argv[1],"-decrypt")) - encrypt = 0; - else if(!strcmp(argv[1],"-ccm")) - ccm = 1; - else if(!strcmp(argv[1],"-xts")) - xts = 1; - else - { - fprintf(stderr,"Don't know how to %s.\n",argv[1]); - exit(1); - } - - if (ccm) - ccmtest(in, out); - else if (xts) - xtstest(in, out); - else - gcmtest(in, out, encrypt); - - if (argc == 4) - { - fclose(in); - fclose(out); - } - - return 0; -} - -#endif |