diff options
| author | miod <> | 2014-07-13 12:46:44 +0000 | 
|---|---|---|
| committer | miod <> | 2014-07-13 12:46:44 +0000 | 
| commit | 647588f01de02a0172ad3e69083d2205bd5c6f65 (patch) | |
| tree | 520f0beabb718396b79052534cca5b6789a92781 /src | |
| parent | 69cb67782e697a48753f8a3b9d81b89e72aa6ec0 (diff) | |
| download | openbsd-647588f01de02a0172ad3e69083d2205bd5c6f65.tar.gz openbsd-647588f01de02a0172ad3e69083d2205bd5c6f65.tar.bz2 openbsd-647588f01de02a0172ad3e69083d2205bd5c6f65.zip | |
Possible PBEPARAM leak in the error path.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/evp/p5_crpt.c | 14 | ||||
| -rw-r--r-- | src/lib/libssl/src/crypto/evp/p5_crpt.c | 14 | 
2 files changed, 16 insertions, 12 deletions
| diff --git a/src/lib/libcrypto/evp/p5_crpt.c b/src/lib/libcrypto/evp/p5_crpt.c index ec8d816f32..3b1419b545 100644 --- a/src/lib/libcrypto/evp/p5_crpt.c +++ b/src/lib/libcrypto/evp/p5_crpt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: p5_crpt.c,v 1.13 2014/07/11 08:44:48 jsing Exp $ */ | 1 | /* $OpenBSD: p5_crpt.c,v 1.14 2014/07/13 12:46:44 miod Exp $ */ | 
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 
| 3 | * project 1999. | 3 | * project 1999. | 
| 4 | */ | 4 | */ | 
| @@ -86,7 +86,6 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 86 | const unsigned char *pbuf; | 86 | const unsigned char *pbuf; | 
| 87 | int mdsize; | 87 | int mdsize; | 
| 88 | int rv = 0; | 88 | int rv = 0; | 
| 89 | EVP_MD_CTX_init(&ctx); | ||
| 90 | 89 | ||
| 91 | /* Extract useful info from parameter */ | 90 | /* Extract useful info from parameter */ | 
| 92 | if (param == NULL || param->type != V_ASN1_SEQUENCE || | 91 | if (param == NULL || param->type != V_ASN1_SEQUENCE || | 
| @@ -95,6 +94,10 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 95 | return 0; | 94 | return 0; | 
| 96 | } | 95 | } | 
| 97 | 96 | ||
| 97 | mdsize = EVP_MD_size(md); | ||
| 98 | if (mdsize < 0) | ||
| 99 | return 0; | ||
| 100 | |||
| 98 | pbuf = param->value.sequence->data; | 101 | pbuf = param->value.sequence->data; | 
| 99 | if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) { | 102 | if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) { | 
| 100 | EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN, EVP_R_DECODE_ERROR); | 103 | EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN, EVP_R_DECODE_ERROR); | 
| @@ -113,18 +116,16 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 113 | else if (passlen == -1) | 116 | else if (passlen == -1) | 
| 114 | passlen = strlen(pass); | 117 | passlen = strlen(pass); | 
| 115 | 118 | ||
| 119 | EVP_MD_CTX_init(&ctx); | ||
| 120 | |||
| 116 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 121 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 
| 117 | goto err; | 122 | goto err; | 
| 118 | if (!EVP_DigestUpdate(&ctx, pass, passlen)) | 123 | if (!EVP_DigestUpdate(&ctx, pass, passlen)) | 
| 119 | goto err; | 124 | goto err; | 
| 120 | if (!EVP_DigestUpdate(&ctx, salt, saltlen)) | 125 | if (!EVP_DigestUpdate(&ctx, salt, saltlen)) | 
| 121 | goto err; | 126 | goto err; | 
| 122 | PBEPARAM_free(pbe); | ||
| 123 | if (!EVP_DigestFinal_ex(&ctx, md_tmp, NULL)) | 127 | if (!EVP_DigestFinal_ex(&ctx, md_tmp, NULL)) | 
| 124 | goto err; | 128 | goto err; | 
| 125 | mdsize = EVP_MD_size(md); | ||
| 126 | if (mdsize < 0) | ||
| 127 | return 0; | ||
| 128 | for (i = 1; i < iter; i++) { | 129 | for (i = 1; i < iter; i++) { | 
| 129 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 130 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 
| 130 | goto err; | 131 | goto err; | 
| @@ -146,5 +147,6 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 146 | rv = 1; | 147 | rv = 1; | 
| 147 | err: | 148 | err: | 
| 148 | EVP_MD_CTX_cleanup(&ctx); | 149 | EVP_MD_CTX_cleanup(&ctx); | 
| 150 | PBEPARAM_free(pbe); | ||
| 149 | return rv; | 151 | return rv; | 
| 150 | } | 152 | } | 
| diff --git a/src/lib/libssl/src/crypto/evp/p5_crpt.c b/src/lib/libssl/src/crypto/evp/p5_crpt.c index ec8d816f32..3b1419b545 100644 --- a/src/lib/libssl/src/crypto/evp/p5_crpt.c +++ b/src/lib/libssl/src/crypto/evp/p5_crpt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: p5_crpt.c,v 1.13 2014/07/11 08:44:48 jsing Exp $ */ | 1 | /* $OpenBSD: p5_crpt.c,v 1.14 2014/07/13 12:46:44 miod Exp $ */ | 
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 
| 3 | * project 1999. | 3 | * project 1999. | 
| 4 | */ | 4 | */ | 
| @@ -86,7 +86,6 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 86 | const unsigned char *pbuf; | 86 | const unsigned char *pbuf; | 
| 87 | int mdsize; | 87 | int mdsize; | 
| 88 | int rv = 0; | 88 | int rv = 0; | 
| 89 | EVP_MD_CTX_init(&ctx); | ||
| 90 | 89 | ||
| 91 | /* Extract useful info from parameter */ | 90 | /* Extract useful info from parameter */ | 
| 92 | if (param == NULL || param->type != V_ASN1_SEQUENCE || | 91 | if (param == NULL || param->type != V_ASN1_SEQUENCE || | 
| @@ -95,6 +94,10 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 95 | return 0; | 94 | return 0; | 
| 96 | } | 95 | } | 
| 97 | 96 | ||
| 97 | mdsize = EVP_MD_size(md); | ||
| 98 | if (mdsize < 0) | ||
| 99 | return 0; | ||
| 100 | |||
| 98 | pbuf = param->value.sequence->data; | 101 | pbuf = param->value.sequence->data; | 
| 99 | if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) { | 102 | if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) { | 
| 100 | EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN, EVP_R_DECODE_ERROR); | 103 | EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN, EVP_R_DECODE_ERROR); | 
| @@ -113,18 +116,16 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 113 | else if (passlen == -1) | 116 | else if (passlen == -1) | 
| 114 | passlen = strlen(pass); | 117 | passlen = strlen(pass); | 
| 115 | 118 | ||
| 119 | EVP_MD_CTX_init(&ctx); | ||
| 120 | |||
| 116 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 121 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 
| 117 | goto err; | 122 | goto err; | 
| 118 | if (!EVP_DigestUpdate(&ctx, pass, passlen)) | 123 | if (!EVP_DigestUpdate(&ctx, pass, passlen)) | 
| 119 | goto err; | 124 | goto err; | 
| 120 | if (!EVP_DigestUpdate(&ctx, salt, saltlen)) | 125 | if (!EVP_DigestUpdate(&ctx, salt, saltlen)) | 
| 121 | goto err; | 126 | goto err; | 
| 122 | PBEPARAM_free(pbe); | ||
| 123 | if (!EVP_DigestFinal_ex(&ctx, md_tmp, NULL)) | 127 | if (!EVP_DigestFinal_ex(&ctx, md_tmp, NULL)) | 
| 124 | goto err; | 128 | goto err; | 
| 125 | mdsize = EVP_MD_size(md); | ||
| 126 | if (mdsize < 0) | ||
| 127 | return 0; | ||
| 128 | for (i = 1; i < iter; i++) { | 129 | for (i = 1; i < iter; i++) { | 
| 129 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 130 | if (!EVP_DigestInit_ex(&ctx, md, NULL)) | 
| 130 | goto err; | 131 | goto err; | 
| @@ -146,5 +147,6 @@ PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, | |||
| 146 | rv = 1; | 147 | rv = 1; | 
| 147 | err: | 148 | err: | 
| 148 | EVP_MD_CTX_cleanup(&ctx); | 149 | EVP_MD_CTX_cleanup(&ctx); | 
| 150 | PBEPARAM_free(pbe); | ||
| 149 | return rv; | 151 | return rv; | 
| 150 | } | 152 | } | 
