summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pkcs12
diff options
context:
space:
mode:
authormiod <>2014-10-22 18:37:22 +0000
committermiod <>2014-10-22 18:37:22 +0000
commit94bf30fecb343725db81902304e3d1d1e2707172 (patch)
tree511f6871a4419fe2b464d1f7d18736745b807cc9 /src/lib/libcrypto/pkcs12
parentc2e047559db4077d59c47364a006d7b0e33bde76 (diff)
downloadopenbsd-94bf30fecb343725db81902304e3d1d1e2707172.tar.gz
openbsd-94bf30fecb343725db81902304e3d1d1e2707172.tar.bz2
openbsd-94bf30fecb343725db81902304e3d1d1e2707172.zip
In PKCS12_setup_mac(), do not assign p12->mac->salt->length until the allocation
of p12->mac->salt->data has actually succeeded. In one of my trees for a long time already...
Diffstat (limited to 'src/lib/libcrypto/pkcs12')
-rw-r--r--src/lib/libcrypto/pkcs12/p12_mutl.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_mutl.c b/src/lib/libcrypto/pkcs12/p12_mutl.c
index 0c49bf96fd..ac58f50ca7 100644
--- a/src/lib/libcrypto/pkcs12/p12_mutl.c
+++ b/src/lib/libcrypto/pkcs12/p12_mutl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_mutl.c,v 1.18 2014/10/22 13:02:04 jsing Exp $ */ 1/* $OpenBSD: p12_mutl.c,v 1.19 2014/10/22 18:37:22 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 */
@@ -100,7 +100,7 @@ PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen,
100 md_size = EVP_MD_size(md_type); 100 md_size = EVP_MD_size(md_type);
101 if (md_size < 0) 101 if (md_size < 0)
102 return 0; 102 return 0;
103 if (!PKCS12_key_gen (pass, passlen, salt, saltlen, PKCS12_MAC_ID, iter, 103 if (!PKCS12_key_gen(pass, passlen, salt, saltlen, PKCS12_MAC_ID, iter,
104 md_size, key, md_type)) { 104 md_size, key, md_type)) {
105 PKCS12err(PKCS12_F_PKCS12_GEN_MAC, PKCS12_R_KEY_GEN_ERROR); 105 PKCS12err(PKCS12_F_PKCS12_GEN_MAC, PKCS12_R_KEY_GEN_ERROR);
106 return 0; 106 return 0;
@@ -123,11 +123,12 @@ PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen)
123{ 123{
124 unsigned char mac[EVP_MAX_MD_SIZE]; 124 unsigned char mac[EVP_MAX_MD_SIZE];
125 unsigned int maclen; 125 unsigned int maclen;
126
126 if (p12->mac == NULL) { 127 if (p12->mac == NULL) {
127 PKCS12err(PKCS12_F_PKCS12_VERIFY_MAC, PKCS12_R_MAC_ABSENT); 128 PKCS12err(PKCS12_F_PKCS12_VERIFY_MAC, PKCS12_R_MAC_ABSENT);
128 return 0; 129 return 0;
129 } 130 }
130 if (!PKCS12_gen_mac (p12, pass, passlen, mac, &maclen)) { 131 if (!PKCS12_gen_mac(p12, pass, passlen, mac, &maclen)) {
131 PKCS12err(PKCS12_F_PKCS12_VERIFY_MAC, 132 PKCS12err(PKCS12_F_PKCS12_VERIFY_MAC,
132 PKCS12_R_MAC_GENERATION_ERROR); 133 PKCS12_R_MAC_GENERATION_ERROR);
133 return 0; 134 return 0;
@@ -149,17 +150,17 @@ PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen, unsigned char *salt,
149 150
150 if (!md_type) 151 if (!md_type)
151 md_type = EVP_sha1(); 152 md_type = EVP_sha1();
152 if (PKCS12_setup_mac (p12, iter, salt, saltlen, md_type) == 153 if (PKCS12_setup_mac(p12, iter, salt, saltlen, md_type) ==
153 PKCS12_ERROR) { 154 PKCS12_ERROR) {
154 PKCS12err(PKCS12_F_PKCS12_SET_MAC, PKCS12_R_MAC_SETUP_ERROR); 155 PKCS12err(PKCS12_F_PKCS12_SET_MAC, PKCS12_R_MAC_SETUP_ERROR);
155 return 0; 156 return 0;
156 } 157 }
157 if (!PKCS12_gen_mac (p12, pass, passlen, mac, &maclen)) { 158 if (!PKCS12_gen_mac(p12, pass, passlen, mac, &maclen)) {
158 PKCS12err(PKCS12_F_PKCS12_SET_MAC, 159 PKCS12err(PKCS12_F_PKCS12_SET_MAC,
159 PKCS12_R_MAC_GENERATION_ERROR); 160 PKCS12_R_MAC_GENERATION_ERROR);
160 return 0; 161 return 0;
161 } 162 }
162 if (!(M_ASN1_OCTET_STRING_set (p12->mac->dinfo->digest, mac, maclen))) { 163 if (!(M_ASN1_OCTET_STRING_set(p12->mac->dinfo->digest, mac, maclen))) {
163 PKCS12err(PKCS12_F_PKCS12_SET_MAC, 164 PKCS12err(PKCS12_F_PKCS12_SET_MAC,
164 PKCS12_R_MAC_STRING_SET_ERROR); 165 PKCS12_R_MAC_STRING_SET_ERROR);
165 return 0; 166 return 0;
@@ -188,11 +189,11 @@ PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt, int saltlen,
188 } 189 }
189 if (!saltlen) 190 if (!saltlen)
190 saltlen = PKCS12_SALT_LEN; 191 saltlen = PKCS12_SALT_LEN;
191 p12->mac->salt->length = saltlen; 192 if (!(p12->mac->salt->data = malloc(saltlen))) {
192 if (!(p12->mac->salt->data = malloc (saltlen))) {
193 PKCS12err(PKCS12_F_PKCS12_SETUP_MAC, ERR_R_MALLOC_FAILURE); 193 PKCS12err(PKCS12_F_PKCS12_SETUP_MAC, ERR_R_MALLOC_FAILURE);
194 return 0; 194 return 0;
195 } 195 }
196 p12->mac->salt->length = saltlen;
196 if (!salt) 197 if (!salt)
197 arc4random_buf(p12->mac->salt->data, saltlen); 198 arc4random_buf(p12->mac->salt->data, saltlen);
198 else 199 else