summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authormiod <>2014-07-11 15:35:53 +0000
committermiod <>2014-07-11 15:35:53 +0000
commitf5edd4467e4f88d1ef7a7847590853e8b1de2c29 (patch)
tree0ed14e6ca56f4424dd4baf6992212ae9cab192d6 /src/lib
parent08094f7429da744acb8c2bde71b0b053844f592a (diff)
downloadopenbsd-f5edd4467e4f88d1ef7a7847590853e8b1de2c29.tar.gz
openbsd-f5edd4467e4f88d1ef7a7847590853e8b1de2c29.tar.bz2
openbsd-f5edd4467e4f88d1ef7a7847590853e8b1de2c29.zip
Missing bounds check in do_PVK_body(); OpenSSL RT #2277, from OpenSSL trunk,
but without a memory leak.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/pem/pvkfmt.c14
-rw-r--r--src/lib/libssl/src/crypto/pem/pvkfmt.c14
2 files changed, 20 insertions, 8 deletions
diff --git a/src/lib/libcrypto/pem/pvkfmt.c b/src/lib/libcrypto/pem/pvkfmt.c
index 55cfffa7bc..32fcc181f7 100644
--- a/src/lib/libcrypto/pem/pvkfmt.c
+++ b/src/lib/libcrypto/pem/pvkfmt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pvkfmt.c,v 1.9 2014/07/11 08:44:49 jsing Exp $ */ 1/* $OpenBSD: pvkfmt.c,v 1.10 2014/07/11 15:35:53 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 2005. 3 * project 2005.
4 */ 4 */
@@ -722,13 +722,14 @@ do_PVK_body(const unsigned char **in, unsigned int saltlen,
722 const unsigned char *p = *in; 722 const unsigned char *p = *in;
723 unsigned int magic; 723 unsigned int magic;
724 unsigned char *enctmp = NULL, *q; 724 unsigned char *enctmp = NULL, *q;
725
726 EVP_CIPHER_CTX cctx; 725 EVP_CIPHER_CTX cctx;
726
727 EVP_CIPHER_CTX_init(&cctx); 727 EVP_CIPHER_CTX_init(&cctx);
728 if (saltlen) { 728 if (saltlen) {
729 char psbuf[PEM_BUFSIZE]; 729 char psbuf[PEM_BUFSIZE];
730 unsigned char keybuf[20]; 730 unsigned char keybuf[20];
731 int enctmplen, inlen; 731 int enctmplen, inlen;
732
732 if (cb) 733 if (cb)
733 inlen = cb(psbuf, PEM_BUFSIZE, 0, u); 734 inlen = cb(psbuf, PEM_BUFSIZE, 0, u);
734 else 735 else
@@ -742,8 +743,8 @@ do_PVK_body(const unsigned char **in, unsigned int saltlen,
742 PEMerr(PEM_F_DO_PVK_BODY, ERR_R_MALLOC_FAILURE); 743 PEMerr(PEM_F_DO_PVK_BODY, ERR_R_MALLOC_FAILURE);
743 return NULL; 744 return NULL;
744 } 745 }
745 if (!derive_pvk_key(keybuf, p, saltlen, 746 if (!derive_pvk_key(keybuf, p, saltlen, (unsigned char *)psbuf,
746 (unsigned char *)psbuf, inlen)) { 747 inlen)) {
747 free(enctmp); 748 free(enctmp);
748 return NULL; 749 return NULL;
749 } 750 }
@@ -751,6 +752,11 @@ do_PVK_body(const unsigned char **in, unsigned int saltlen,
751 /* Copy BLOBHEADER across, decrypt rest */ 752 /* Copy BLOBHEADER across, decrypt rest */
752 memcpy(enctmp, p, 8); 753 memcpy(enctmp, p, 8);
753 p += 8; 754 p += 8;
755 if (keylen < 8) {
756 PEMerr(PEM_F_DO_PVK_BODY, PEM_R_PVK_TOO_SHORT);
757 free(enctmp);
758 return NULL;
759 }
754 inlen = keylen - 8; 760 inlen = keylen - 8;
755 q = enctmp + 8; 761 q = enctmp + 8;
756 if (!EVP_DecryptInit_ex(&cctx, EVP_rc4(), NULL, keybuf, NULL)) 762 if (!EVP_DecryptInit_ex(&cctx, EVP_rc4(), NULL, keybuf, NULL))
diff --git a/src/lib/libssl/src/crypto/pem/pvkfmt.c b/src/lib/libssl/src/crypto/pem/pvkfmt.c
index 55cfffa7bc..32fcc181f7 100644
--- a/src/lib/libssl/src/crypto/pem/pvkfmt.c
+++ b/src/lib/libssl/src/crypto/pem/pvkfmt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: pvkfmt.c,v 1.9 2014/07/11 08:44:49 jsing Exp $ */ 1/* $OpenBSD: pvkfmt.c,v 1.10 2014/07/11 15:35:53 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 2005. 3 * project 2005.
4 */ 4 */
@@ -722,13 +722,14 @@ do_PVK_body(const unsigned char **in, unsigned int saltlen,
722 const unsigned char *p = *in; 722 const unsigned char *p = *in;
723 unsigned int magic; 723 unsigned int magic;
724 unsigned char *enctmp = NULL, *q; 724 unsigned char *enctmp = NULL, *q;
725
726 EVP_CIPHER_CTX cctx; 725 EVP_CIPHER_CTX cctx;
726
727 EVP_CIPHER_CTX_init(&cctx); 727 EVP_CIPHER_CTX_init(&cctx);
728 if (saltlen) { 728 if (saltlen) {
729 char psbuf[PEM_BUFSIZE]; 729 char psbuf[PEM_BUFSIZE];
730 unsigned char keybuf[20]; 730 unsigned char keybuf[20];
731 int enctmplen, inlen; 731 int enctmplen, inlen;
732
732 if (cb) 733 if (cb)
733 inlen = cb(psbuf, PEM_BUFSIZE, 0, u); 734 inlen = cb(psbuf, PEM_BUFSIZE, 0, u);
734 else 735 else
@@ -742,8 +743,8 @@ do_PVK_body(const unsigned char **in, unsigned int saltlen,
742 PEMerr(PEM_F_DO_PVK_BODY, ERR_R_MALLOC_FAILURE); 743 PEMerr(PEM_F_DO_PVK_BODY, ERR_R_MALLOC_FAILURE);
743 return NULL; 744 return NULL;
744 } 745 }
745 if (!derive_pvk_key(keybuf, p, saltlen, 746 if (!derive_pvk_key(keybuf, p, saltlen, (unsigned char *)psbuf,
746 (unsigned char *)psbuf, inlen)) { 747 inlen)) {
747 free(enctmp); 748 free(enctmp);
748 return NULL; 749 return NULL;
749 } 750 }
@@ -751,6 +752,11 @@ do_PVK_body(const unsigned char **in, unsigned int saltlen,
751 /* Copy BLOBHEADER across, decrypt rest */ 752 /* Copy BLOBHEADER across, decrypt rest */
752 memcpy(enctmp, p, 8); 753 memcpy(enctmp, p, 8);
753 p += 8; 754 p += 8;
755 if (keylen < 8) {
756 PEMerr(PEM_F_DO_PVK_BODY, PEM_R_PVK_TOO_SHORT);
757 free(enctmp);
758 return NULL;
759 }
754 inlen = keylen - 8; 760 inlen = keylen - 8;
755 q = enctmp + 8; 761 q = enctmp + 8;
756 if (!EVP_DecryptInit_ex(&cctx, EVP_rc4(), NULL, keybuf, NULL)) 762 if (!EVP_DecryptInit_ex(&cctx, EVP_rc4(), NULL, keybuf, NULL))