summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pkcs12/p12_add.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/pkcs12/p12_add.c')
-rw-r--r--src/lib/libcrypto/pkcs12/p12_add.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_add.c b/src/lib/libcrypto/pkcs12/p12_add.c
index 11373cda4f..b141851514 100644
--- a/src/lib/libcrypto/pkcs12/p12_add.c
+++ b/src/lib/libcrypto/pkcs12/p12_add.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_add.c,v 1.11 2014/07/11 08:44:49 jsing Exp $ */ 1/* $OpenBSD: p12_add.c,v 1.12 2015/02/14 12:43:07 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 */
@@ -78,11 +78,13 @@ PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1, int nid2)
78 if (!ASN1_item_pack(obj, it, &bag->value.octet)) { 78 if (!ASN1_item_pack(obj, it, &bag->value.octet)) {
79 PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, 79 PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG,
80 ERR_R_MALLOC_FAILURE); 80 ERR_R_MALLOC_FAILURE);
81 PKCS12_BAGS_free(bag);
81 return NULL; 82 return NULL;
82 } 83 }
83 if (!(safebag = PKCS12_SAFEBAG_new())) { 84 if (!(safebag = PKCS12_SAFEBAG_new())) {
84 PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG, 85 PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG,
85 ERR_R_MALLOC_FAILURE); 86 ERR_R_MALLOC_FAILURE);
87 PKCS12_BAGS_free(bag);
86 return NULL; 88 return NULL;
87 } 89 }
88 safebag->value.bag = bag; 90 safebag->value.bag = bag;
@@ -131,6 +133,7 @@ PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, int passlen,
131 if (!(bag->value.shkeybag = PKCS8_encrypt(pbe_nid, pbe_ciph, pass, 133 if (!(bag->value.shkeybag = PKCS8_encrypt(pbe_nid, pbe_ciph, pass,
132 passlen, salt, saltlen, iter, p8))) { 134 passlen, salt, saltlen, iter, p8))) {
133 PKCS12err(PKCS12_F_PKCS12_MAKE_SHKEYBAG, ERR_R_MALLOC_FAILURE); 135 PKCS12err(PKCS12_F_PKCS12_MAKE_SHKEYBAG, ERR_R_MALLOC_FAILURE);
136 PKCS12_SAFEBAG_free(bag);
134 return NULL; 137 return NULL;
135 } 138 }
136 139
@@ -150,15 +153,19 @@ PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk)
150 p7->type = OBJ_nid2obj(NID_pkcs7_data); 153 p7->type = OBJ_nid2obj(NID_pkcs7_data);
151 if (!(p7->d.data = M_ASN1_OCTET_STRING_new())) { 154 if (!(p7->d.data = M_ASN1_OCTET_STRING_new())) {
152 PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, ERR_R_MALLOC_FAILURE); 155 PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, ERR_R_MALLOC_FAILURE);
153 return NULL; 156 goto err;
154 } 157 }
155 158
156 if (!ASN1_item_pack(sk, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), &p7->d.data)) { 159 if (!ASN1_item_pack(sk, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), &p7->d.data)) {
157 PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA, 160 PKCS12err(PKCS12_F_PKCS12_PACK_P7DATA,
158 PKCS12_R_CANT_PACK_STRUCTURE); 161 PKCS12_R_CANT_PACK_STRUCTURE);
159 return NULL; 162 goto err;
160 } 163 }
161 return p7; 164 return p7;
165
166err:
167 PKCS7_free(p7);
168 return NULL;
162} 169}
163 170
164/* Unpack SAFEBAGS from PKCS#7 data ContentInfo */ 171/* Unpack SAFEBAGS from PKCS#7 data ContentInfo */
@@ -190,7 +197,7 @@ PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
190 if (!PKCS7_set_type(p7, NID_pkcs7_encrypted)) { 197 if (!PKCS7_set_type(p7, NID_pkcs7_encrypted)) {
191 PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, 198 PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA,
192 PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE); 199 PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE);
193 return NULL; 200 goto err;
194 } 201 }
195 202
196 pbe_ciph = EVP_get_cipherbynid(pbe_nid); 203 pbe_ciph = EVP_get_cipherbynid(pbe_nid);
@@ -202,7 +209,7 @@ PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
202 209
203 if (!pbe) { 210 if (!pbe) {
204 PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, ERR_R_MALLOC_FAILURE); 211 PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, ERR_R_MALLOC_FAILURE);
205 return NULL; 212 goto err;
206 } 213 }
207 X509_ALGOR_free(p7->d.encrypted->enc_data->algorithm); 214 X509_ALGOR_free(p7->d.encrypted->enc_data->algorithm);
208 p7->d.encrypted->enc_data->algorithm = pbe; 215 p7->d.encrypted->enc_data->algorithm = pbe;
@@ -211,10 +218,14 @@ PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
211 pbe, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), pass, passlen, bags, 1))) { 218 pbe, ASN1_ITEM_rptr(PKCS12_SAFEBAGS), pass, passlen, bags, 1))) {
212 PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA, 219 PKCS12err(PKCS12_F_PKCS12_PACK_P7ENCDATA,
213 PKCS12_R_ENCRYPT_ERROR); 220 PKCS12_R_ENCRYPT_ERROR);
214 return NULL; 221 goto err;
215 } 222 }
216 223
217 return p7; 224 return p7;
225
226err:
227 PKCS7_free(p7);
228 return NULL;
218} 229}
219 230
220STACK_OF(PKCS12_SAFEBAG) * 231STACK_OF(PKCS12_SAFEBAG) *