Add a --disable-all option to disable all tests.
[openssl.git] / fips / aes / fips_gcmtest.c
index 5eb7e7f9679dd645e370f73acddcd20ee930c766..bfb6c2700c4c972bec53e6d903ec379a8fbc5e3d 100644 (file)
@@ -263,9 +263,243 @@ static void gcmtest(FILE *in, FILE *out, int encrypt)
                }
        }
 
+static void xtstest(FILE *in, FILE *out)
+       {
+       char buf[204800];
+       char lbuf[204800];
+       char *keyword, *value;
+       int inlen = 0;
+       int encrypt = 0;
+       int rv;
+       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);
+                       rv = 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;
+                       }       
+               }
+       }
+
+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"))
+                       {
+                       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\n", out);
+                               OutputValue("Payload", Payload, len, out, 0);
+                               }
+                       else
+                               fputs("Result = Fail\n", out);
+                       OPENSSL_free(CT);
+                       OPENSSL_free(Payload);
+                       CT = Payload = NULL;
+                       }
+               }
+       if (Key)
+               OPENSSL_free(Key);
+       if (Nonce)
+               OPENSSL_free(Nonce);
+       FIPS_cipher_ctx_cleanup(&ctx);
+       }
+
 int main(int argc,char **argv)
        {
        int encrypt;
+       int xts = 0, ccm = 0;
        FILE *in, *out;
        if (argc == 4)
                {
@@ -292,22 +526,29 @@ int main(int argc,char **argv)
                fprintf(stderr,"%s [-encrypt|-decrypt]\n",argv[0]);
                exit(1);
                }
-       fips_set_error_print();
-       if(!FIPS_mode_set(1))
-               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);
                }
 
-       gcmtest(in, out, encrypt);
+       if (ccm)
+               ccmtest(in, out);
+       else if (xts)
+               xtstest(in, out);
+       else
+               gcmtest(in, out, encrypt);
 
        if (argc == 4)
                {