diff options
| author | djm <> | 2012-10-13 21:23:50 +0000 |
|---|---|---|
| committer | djm <> | 2012-10-13 21:23:50 +0000 |
| commit | 228cae30b117c2493f69ad3c195341cd6ec8d430 (patch) | |
| tree | 29ff00b10d52c0978077c4fd83c33b065bade73e /src/lib/libcrypto/evp/p5_crpt.c | |
| parent | 731838c66b52c0ae5888333005b74115a620aa96 (diff) | |
| download | openbsd-228cae30b117c2493f69ad3c195341cd6ec8d430.tar.gz openbsd-228cae30b117c2493f69ad3c195341cd6ec8d430.tar.bz2 openbsd-228cae30b117c2493f69ad3c195341cd6ec8d430.zip | |
import OpenSSL-1.0.1c
Diffstat (limited to 'src/lib/libcrypto/evp/p5_crpt.c')
| -rw-r--r-- | src/lib/libcrypto/evp/p5_crpt.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/lib/libcrypto/evp/p5_crpt.c b/src/lib/libcrypto/evp/p5_crpt.c index 7ecfa8dad9..294cc90d87 100644 --- a/src/lib/libcrypto/evp/p5_crpt.c +++ b/src/lib/libcrypto/evp/p5_crpt.c | |||
| @@ -82,6 +82,8 @@ 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); | ||
| 85 | 87 | ||
| 86 | /* Extract useful info from parameter */ | 88 | /* Extract useful info from parameter */ |
| 87 | if (param == NULL || param->type != V_ASN1_SEQUENCE || | 89 | if (param == NULL || param->type != V_ASN1_SEQUENCE || |
| @@ -104,29 +106,38 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 104 | if(!pass) passlen = 0; | 106 | if(!pass) passlen = 0; |
| 105 | else if(passlen == -1) passlen = strlen(pass); | 107 | else if(passlen == -1) passlen = strlen(pass); |
| 106 | 108 | ||
| 107 | EVP_MD_CTX_init(&ctx); | 109 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) |
| 108 | EVP_DigestInit_ex(&ctx, md, NULL); | 110 | goto err; |
| 109 | EVP_DigestUpdate(&ctx, pass, passlen); | 111 | if (!EVP_DigestUpdate(&ctx, pass, passlen)) |
| 110 | EVP_DigestUpdate(&ctx, salt, saltlen); | 112 | goto err; |
| 113 | if (!EVP_DigestUpdate(&ctx, salt, saltlen)) | ||
| 114 | goto err; | ||
| 111 | PBEPARAM_free(pbe); | 115 | PBEPARAM_free(pbe); |
| 112 | EVP_DigestFinal_ex(&ctx, md_tmp, NULL); | 116 | if (!EVP_DigestFinal_ex(&ctx, md_tmp, NULL)) |
| 117 | goto err; | ||
| 113 | mdsize = EVP_MD_size(md); | 118 | mdsize = EVP_MD_size(md); |
| 114 | if (mdsize < 0) | 119 | if (mdsize < 0) |
| 115 | return 0; | 120 | return 0; |
| 116 | for (i = 1; i < iter; i++) { | 121 | for (i = 1; i < iter; i++) { |
| 117 | EVP_DigestInit_ex(&ctx, md, NULL); | 122 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) |
| 118 | EVP_DigestUpdate(&ctx, md_tmp, mdsize); | 123 | goto err; |
| 119 | EVP_DigestFinal_ex (&ctx, md_tmp, NULL); | 124 | if (!EVP_DigestUpdate(&ctx, md_tmp, mdsize)) |
| 125 | goto err; | ||
| 126 | if (!EVP_DigestFinal_ex (&ctx, md_tmp, NULL)) | ||
| 127 | goto err; | ||
| 120 | } | 128 | } |
| 121 | EVP_MD_CTX_cleanup(&ctx); | ||
| 122 | OPENSSL_assert(EVP_CIPHER_key_length(cipher) <= (int)sizeof(md_tmp)); | 129 | OPENSSL_assert(EVP_CIPHER_key_length(cipher) <= (int)sizeof(md_tmp)); |
| 123 | memcpy(key, md_tmp, EVP_CIPHER_key_length(cipher)); | 130 | memcpy(key, md_tmp, EVP_CIPHER_key_length(cipher)); |
| 124 | OPENSSL_assert(EVP_CIPHER_iv_length(cipher) <= 16); | 131 | OPENSSL_assert(EVP_CIPHER_iv_length(cipher) <= 16); |
| 125 | memcpy(iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)), | 132 | memcpy(iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)), |
| 126 | EVP_CIPHER_iv_length(cipher)); | 133 | EVP_CIPHER_iv_length(cipher)); |
| 127 | EVP_CipherInit_ex(cctx, cipher, NULL, key, iv, en_de); | 134 | if (!EVP_CipherInit_ex(cctx, cipher, NULL, key, iv, en_de)) |
| 135 | goto err; | ||
| 128 | OPENSSL_cleanse(md_tmp, EVP_MAX_MD_SIZE); | 136 | OPENSSL_cleanse(md_tmp, EVP_MAX_MD_SIZE); |
| 129 | OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH); | 137 | OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH); |
| 130 | OPENSSL_cleanse(iv, EVP_MAX_IV_LENGTH); | 138 | OPENSSL_cleanse(iv, EVP_MAX_IV_LENGTH); |
| 131 | return 1; | 139 | rv = 1; |
| 140 | err: | ||
| 141 | EVP_MD_CTX_cleanup(&ctx); | ||
| 142 | return rv; | ||
| 132 | } | 143 | } |
