don't memset(data,0,...) if data is NULL
[openssl.git] / crypto / pem / pem_lib.c
index f5ae9d7cbde63bdc2609bd9a4db1b019a213de8b..7066e67b39a9f791d134de9bab94e421deab9c65 100644 (file)
@@ -193,6 +193,8 @@ static int check_pem(const char *nm, const char *name)
        if(!strcmp(nm,PEM_STRING_DSA) &&
                 !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
 
+       if(!strcmp(nm,PEM_STRING_ECPRIVATEKEY) &&
+                !strcmp(name,PEM_STRING_EVP_PKEY)) return 1;
        /* Permit older strings */
 
        if(!strcmp(nm,PEM_STRING_X509_OLD) &&
@@ -333,7 +335,7 @@ int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x,
                        kstr=(unsigned char *)buf;
                        }
                RAND_add(data,i,0);/* put in the RSA key. */
-               if (RAND_pseudo_bytes(iv,8) < 0)        /* Generate a salt */
+               if (RAND_pseudo_bytes(iv,enc->iv_len) < 0) /* Generate a salt */
                        goto err;
                /* The 'iv' is used as the iv and as a salt.  It is
                 * NOT taken from the BytesToKey function */
@@ -343,12 +345,14 @@ int PEM_ASN1_write_bio(int (*i2d)(), const char *name, BIO *bp, char *x,
 
                buf[0]='\0';
                PEM_proc_type(buf,PEM_TYPE_ENCRYPTED);
-               PEM_dek_info(buf,objstr,8,(char *)iv);
+               PEM_dek_info(buf,objstr,enc->iv_len,(char *)iv);
                /* k=strlen(buf); */
-       
+
+               EVP_CIPHER_CTX_init(&ctx);
                EVP_EncryptInit_ex(&ctx,enc,NULL,key,iv);
                EVP_EncryptUpdate(&ctx,data,&j,data,i);
                EVP_EncryptFinal_ex(&ctx,&(data[j]),&i);
+               EVP_CIPHER_CTX_cleanup(&ctx);
                i+=j;
                ret=1;
                }
@@ -364,8 +368,11 @@ err:
        memset(iv,0,sizeof(iv));
        memset((char *)&ctx,0,sizeof(ctx));
        memset(buf,0,PEM_BUFSIZE);
-       memset(data,0,(unsigned int)dsize);
-       OPENSSL_free(data);
+       if (data != NULL)
+               {
+               memset(data,0,(unsigned int)dsize);
+               OPENSSL_free(data);
+               }
        return(ret);
        }
 
@@ -399,6 +406,7 @@ int PEM_do_header(EVP_CIPHER_INFO *cipher, unsigned char *data, long *plen,
                (unsigned char *)buf,klen,1,key,NULL);
 
        j=(int)len;
+       EVP_CIPHER_CTX_init(&ctx);
        EVP_DecryptInit_ex(&ctx,cipher->cipher,NULL, key,&(cipher->iv[0]));
        EVP_DecryptUpdate(&ctx,data,&i,data,j);
        o=EVP_DecryptFinal_ex(&ctx,&(data[i]),&j);
@@ -466,7 +474,7 @@ int PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher)
                PEMerr(PEM_F_PEM_GET_EVP_CIPHER_INFO,PEM_R_UNSUPPORTED_ENCRYPTION);
                return(0);
                }
-       if (!load_iv((unsigned char **)&header,&(cipher->iv[0]),8)) return(0);
+       if (!load_iv((unsigned char **)&header,&(cipher->iv[0]),enc->iv_len)) return(0);
 
        return(1);
        }