dev_crypto_md5_update: check result of realloc(md_data->data) and don't leak memory...
[openssl.git] / crypto / evp / evp_test.c
index 52893429538d4974ee9adb5fe8d31b186c77e92a..63d70953949d970e436c3b2f97b36601a4834eee 100644 (file)
@@ -133,6 +133,17 @@ static int test1_exit(int ec)
        return(0);              /* To keep some compilers quiet */
        }
 
+/* Test copying of contexts */
+static void test_ctx_replace(EVP_CIPHER_CTX **pctx)
+       {
+       /* Make copy of context and replace original */
+       EVP_CIPHER_CTX *ctx_copy;
+       ctx_copy = EVP_CIPHER_CTX_new();
+       EVP_CIPHER_CTX_copy(ctx_copy, *pctx);
+       EVP_CIPHER_CTX_free(*pctx);
+       *pctx = ctx_copy;
+       }
+
 static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
                  const unsigned char *iv,int in,
                  const unsigned char *plaintext,int pn,
@@ -141,7 +152,7 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
                  const unsigned char *tag,int tn,
                  int encdec)
     {
-    EVP_CIPHER_CTX ctx;
+    EVP_CIPHER_CTX *ctx = NULL;
     unsigned char out[4096];
     int outl,outl2,mode;
 
@@ -163,30 +174,31 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
                (unsigned long)EVP_CIPHER_key_length(c));
        test1_exit(5);
        }
-    EVP_CIPHER_CTX_init(&ctx);
+    ctx = EVP_CIPHER_CTX_new();
+    EVP_CIPHER_CTX_set_flags(ctx,EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
     if (encdec != 0)
         {
        if (mode == EVP_CIPH_GCM_MODE)
            {
-           if(!EVP_EncryptInit_ex(&ctx,c,NULL,NULL,NULL))
+           if(!EVP_EncryptInit_ex(ctx,c,NULL,NULL,NULL))
                {
                fprintf(stderr,"EncryptInit failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(10);
                }
-           if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, in, NULL))
+           if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, in, NULL))
                {
                fprintf(stderr,"IV length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(11);
                }
-           if(!EVP_EncryptInit_ex(&ctx,NULL,NULL,key,iv))
+           if(!EVP_EncryptInit_ex(ctx,NULL,NULL,key,iv))
                {
                fprintf(stderr,"Key/IV set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(12);
                }
-           if (an && !EVP_EncryptUpdate(&ctx,NULL,&outl,aad,an))
+           if (an && !EVP_EncryptUpdate(ctx,NULL,&outl,aad,an))
                {
                fprintf(stderr,"AAD set failed\n");
                ERR_print_errors_fp(stderr);
@@ -195,58 +207,69 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
            }
        else if (mode == EVP_CIPH_CCM_MODE)
            {
-           if(!EVP_EncryptInit_ex(&ctx,c,NULL,NULL,NULL))
+           if(!EVP_EncryptInit_ex(ctx,c,NULL,NULL,NULL))
                {
                fprintf(stderr,"EncryptInit failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(10);
                }
-           if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_IVLEN, in, NULL))
+           if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, in, NULL))
                {
                fprintf(stderr,"IV length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(11);
                }
-           if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_TAG, tn, NULL))
+           if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, tn, NULL))
                {
                fprintf(stderr,"Tag length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(11);
                }
-           if(!EVP_EncryptInit_ex(&ctx,NULL,NULL,key,iv))
+           if(!EVP_EncryptInit_ex(ctx,NULL,NULL,key,iv))
                {
                fprintf(stderr,"Key/IV set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(12);
                }
-           if (!EVP_EncryptUpdate(&ctx,NULL,&outl,NULL,pn))
+           if (!EVP_EncryptUpdate(ctx,NULL,&outl,NULL,pn))
                {
                fprintf(stderr,"Plaintext length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(12);
                }
-           if (an && !EVP_EncryptUpdate(&ctx,NULL,&outl,aad,an))
+           if (an && !EVP_EncryptUpdate(ctx,NULL,&outl,aad,an))
                {
                fprintf(stderr,"AAD set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(13);
                }
            }
-       else if(!EVP_EncryptInit_ex(&ctx,c,NULL,key,iv))
+       else if (mode == EVP_CIPH_WRAP_MODE)
+           {
+           if(!EVP_EncryptInit_ex(ctx,c,NULL,key,in ? iv : NULL))
+               {
+               fprintf(stderr,"EncryptInit failed\n");
+               ERR_print_errors_fp(stderr);
+               test1_exit(10);
+               }
+           }
+       else if(!EVP_EncryptInit_ex(ctx,c,NULL,key,iv))
            {
            fprintf(stderr,"EncryptInit failed\n");
            ERR_print_errors_fp(stderr);
            test1_exit(10);
            }
-       EVP_CIPHER_CTX_set_padding(&ctx,0);
+       EVP_CIPHER_CTX_set_padding(ctx,0);
 
-       if(!EVP_EncryptUpdate(&ctx,out,&outl,plaintext,pn))
+       test_ctx_replace(&ctx);
+
+       if(!EVP_EncryptUpdate(ctx,out,&outl,plaintext,pn))
            {
            fprintf(stderr,"Encrypt failed\n");
            ERR_print_errors_fp(stderr);
            test1_exit(6);
            }
-       if(!EVP_EncryptFinal_ex(&ctx,out+outl,&outl2))
+       if(!EVP_EncryptFinal_ex(ctx,out+outl,&outl2))
            {
            fprintf(stderr,"EncryptFinal failed\n");
            ERR_print_errors_fp(stderr);
@@ -273,7 +296,7 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
            /* Note: EVP_CTRL_CCM_GET_TAG has same value as 
             * EVP_CTRL_GCM_GET_TAG
             */
-           if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, tn, rtag))
+           if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, tn, rtag))
                {
                fprintf(stderr,"Get tag failed\n");
                ERR_print_errors_fp(stderr);
@@ -293,31 +316,31 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
         {
        if (mode == EVP_CIPH_GCM_MODE)
            {
-           if(!EVP_DecryptInit_ex(&ctx,c,NULL,NULL,NULL))
+           if(!EVP_DecryptInit_ex(ctx,c,NULL,NULL,NULL))
                {
                fprintf(stderr,"EncryptInit failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(10);
                }
-           if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, in, NULL))
+           if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, in, NULL))
                {
                fprintf(stderr,"IV length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(11);
                }
-           if(!EVP_DecryptInit_ex(&ctx,NULL,NULL,key,iv))
+           if(!EVP_DecryptInit_ex(ctx,NULL,NULL,key,iv))
                {
                fprintf(stderr,"Key/IV set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(12);
                }
-           if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, tn, (void *)tag))
+           if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tn, (void *)tag))
                {
                fprintf(stderr,"Set tag failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(14);
                }
-           if (an && !EVP_DecryptUpdate(&ctx,NULL,&outl,aad,an))
+           if (an && !EVP_DecryptUpdate(ctx,NULL,&outl,aad,an))
                {
                fprintf(stderr,"AAD set failed\n");
                ERR_print_errors_fp(stderr);
@@ -326,58 +349,69 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
            }
        else if (mode == EVP_CIPH_CCM_MODE)
            {
-           if(!EVP_DecryptInit_ex(&ctx,c,NULL,NULL,NULL))
+           if(!EVP_DecryptInit_ex(ctx,c,NULL,NULL,NULL))
                {
                fprintf(stderr,"DecryptInit failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(10);
                }
-           if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_IVLEN, in, NULL))
+           if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, in, NULL))
                {
                fprintf(stderr,"IV length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(11);
                }
-           if(!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_TAG, tn, (void *)tag))
+           if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, tn, (void *)tag))
                {
                fprintf(stderr,"Tag length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(11);
                }
-           if(!EVP_DecryptInit_ex(&ctx,NULL,NULL,key,iv))
+           if(!EVP_DecryptInit_ex(ctx,NULL,NULL,key,iv))
                {
                fprintf(stderr,"Key/Nonce set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(12);
                }
-           if (!EVP_DecryptUpdate(&ctx,NULL,&outl,NULL,pn))
+           if (!EVP_DecryptUpdate(ctx,NULL,&outl,NULL,pn))
                {
                fprintf(stderr,"Plaintext length set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(12);
                }
-           if (an && !EVP_EncryptUpdate(&ctx,NULL,&outl,aad,an))
+           if (an && !EVP_EncryptUpdate(ctx,NULL,&outl,aad,an))
                {
                fprintf(stderr,"AAD set failed\n");
                ERR_print_errors_fp(stderr);
                test1_exit(13);
                }
            }
-       else if(!EVP_DecryptInit_ex(&ctx,c,NULL,key,iv))
+       else if (mode == EVP_CIPH_WRAP_MODE)
+           {
+           if(!EVP_DecryptInit_ex(ctx,c,NULL,key,in ? iv : NULL))
+               {
+               fprintf(stderr,"EncryptInit failed\n");
+               ERR_print_errors_fp(stderr);
+               test1_exit(10);
+               }
+           }
+       else if(!EVP_DecryptInit_ex(ctx,c,NULL,key,iv))
            {
            fprintf(stderr,"DecryptInit failed\n");
            ERR_print_errors_fp(stderr);
            test1_exit(11);
            }
-       EVP_CIPHER_CTX_set_padding(&ctx,0);
+       EVP_CIPHER_CTX_set_padding(ctx,0);
 
-       if(!EVP_DecryptUpdate(&ctx,out,&outl,ciphertext,cn))
+       test_ctx_replace(&ctx);
+
+       if(!EVP_DecryptUpdate(ctx,out,&outl,ciphertext,cn))
            {
            fprintf(stderr,"Decrypt failed\n");
            ERR_print_errors_fp(stderr);
            test1_exit(6);
            }
-       if(mode != EVP_CIPH_CCM_MODE && !EVP_DecryptFinal_ex(&ctx,out+outl,&outl2))
+       if(mode != EVP_CIPH_CCM_MODE && !EVP_DecryptFinal_ex(ctx,out+outl,&outl2))
            {
            fprintf(stderr,"DecryptFinal failed\n");
            ERR_print_errors_fp(stderr);
@@ -400,7 +434,7 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn,
            }
        }
 
-    EVP_CIPHER_CTX_cleanup(&ctx);
+    EVP_CIPHER_CTX_free(ctx);
 
     printf("\n");
     }
@@ -505,7 +539,7 @@ int main(int argc,char **argv)
        perror(szTestFile);
        EXIT(2);
        }
-
+    ERR_load_crypto_strings();
     /* Load up the software EVP_CIPHER and EVP_MD definitions */
     OpenSSL_add_all_ciphers();
     OpenSSL_add_all_digests();
@@ -534,7 +568,9 @@ int main(int argc,char **argv)
        char *cipher;
        unsigned char *iv,*key,*plaintext,*ciphertext,*aad,*tag;
        int encdec;
-       int kn,in,pn,cn,an,tn;
+       int kn,in,pn,cn;
+       int an = 0;
+       int tn = 0;
 
        if(!fgets((char *)line,sizeof line,f))
            break;