summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/p5_crpt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/p5_crpt.c')
-rw-r--r--src/lib/libcrypto/evp/p5_crpt.c33
1 files changed, 11 insertions, 22 deletions
diff --git a/src/lib/libcrypto/evp/p5_crpt.c b/src/lib/libcrypto/evp/p5_crpt.c
index 294cc90d87..7ecfa8dad9 100644
--- a/src/lib/libcrypto/evp/p5_crpt.c
+++ b/src/lib/libcrypto/evp/p5_crpt.c
@@ -82,8 +82,6 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen,
82 unsigned char *salt; 82 unsigned char *salt;
83 const unsigned char *pbuf; 83 const unsigned char *pbuf;
84 int mdsize; 84 int mdsize;
85 int rv = 0;
86 EVP_MD_CTX_init(&ctx);
87 85
88 /* Extract useful info from parameter */ 86 /* Extract useful info from parameter */
89 if (param == NULL || param->type != V_ASN1_SEQUENCE || 87 if (param == NULL || param->type != V_ASN1_SEQUENCE ||
@@ -106,38 +104,29 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen,
106 if(!pass) passlen = 0; 104 if(!pass) passlen = 0;
107 else if(passlen == -1) passlen = strlen(pass); 105 else if(passlen == -1) passlen = strlen(pass);
108 106
109 if (!EVP_DigestInit_ex(&ctx, md, NULL)) 107 EVP_MD_CTX_init(&ctx);
110 goto err; 108 EVP_DigestInit_ex(&ctx, md, NULL);
111 if (!EVP_DigestUpdate(&ctx, pass, passlen)) 109 EVP_DigestUpdate(&ctx, pass, passlen);
112 goto err; 110 EVP_DigestUpdate(&ctx, salt, saltlen);
113 if (!EVP_DigestUpdate(&ctx, salt, saltlen))
114 goto err;
115 PBEPARAM_free(pbe); 111 PBEPARAM_free(pbe);
116 if (!EVP_DigestFinal_ex(&ctx, md_tmp, NULL)) 112 EVP_DigestFinal_ex(&ctx, md_tmp, NULL);
117 goto err;
118 mdsize = EVP_MD_size(md); 113 mdsize = EVP_MD_size(md);
119 if (mdsize < 0) 114 if (mdsize < 0)
120 return 0; 115 return 0;
121 for (i = 1; i < iter; i++) { 116 for (i = 1; i < iter; i++) {
122 if (!EVP_DigestInit_ex(&ctx, md, NULL)) 117 EVP_DigestInit_ex(&ctx, md, NULL);
123 goto err; 118 EVP_DigestUpdate(&ctx, md_tmp, mdsize);
124 if (!EVP_DigestUpdate(&ctx, md_tmp, mdsize)) 119 EVP_DigestFinal_ex (&ctx, md_tmp, NULL);
125 goto err;
126 if (!EVP_DigestFinal_ex (&ctx, md_tmp, NULL))
127 goto err;
128 } 120 }
121 EVP_MD_CTX_cleanup(&ctx);
129 OPENSSL_assert(EVP_CIPHER_key_length(cipher) <= (int)sizeof(md_tmp)); 122 OPENSSL_assert(EVP_CIPHER_key_length(cipher) <= (int)sizeof(md_tmp));
130 memcpy(key, md_tmp, EVP_CIPHER_key_length(cipher)); 123 memcpy(key, md_tmp, EVP_CIPHER_key_length(cipher));
131 OPENSSL_assert(EVP_CIPHER_iv_length(cipher) <= 16); 124 OPENSSL_assert(EVP_CIPHER_iv_length(cipher) <= 16);
132 memcpy(iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)), 125 memcpy(iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)),
133 EVP_CIPHER_iv_length(cipher)); 126 EVP_CIPHER_iv_length(cipher));
134 if (!EVP_CipherInit_ex(cctx, cipher, NULL, key, iv, en_de)) 127 EVP_CipherInit_ex(cctx, cipher, NULL, key, iv, en_de);
135 goto err;
136 OPENSSL_cleanse(md_tmp, EVP_MAX_MD_SIZE); 128 OPENSSL_cleanse(md_tmp, EVP_MAX_MD_SIZE);
137 OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH); 129 OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH);
138 OPENSSL_cleanse(iv, EVP_MAX_IV_LENGTH); 130 OPENSSL_cleanse(iv, EVP_MAX_IV_LENGTH);
139 rv = 1; 131 return 1;
140 err:
141 EVP_MD_CTX_cleanup(&ctx);
142 return rv;
143} 132}