summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pkcs12
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/pkcs12')
-rw-r--r--src/lib/libcrypto/pkcs12/p12_crt.c6
-rw-r--r--src/lib/libcrypto/pkcs12/p12_key.c8
-rw-r--r--src/lib/libcrypto/pkcs12/p12_kiss.c90
-rw-r--r--src/lib/libcrypto/pkcs12/p12_mutl.c2
-rw-r--r--src/lib/libcrypto/pkcs12/pk12err.c3
-rw-r--r--src/lib/libcrypto/pkcs12/pkcs12.h4
6 files changed, 69 insertions, 44 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_crt.c b/src/lib/libcrypto/pkcs12/p12_crt.c
index 56d88b0759..ee8aed54c7 100644
--- a/src/lib/libcrypto/pkcs12/p12_crt.c
+++ b/src/lib/libcrypto/pkcs12/p12_crt.c
@@ -61,7 +61,7 @@
61#include <openssl/pkcs12.h> 61#include <openssl/pkcs12.h>
62 62
63PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, 63PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
64 STACK *ca, int nid_key, int nid_cert, int iter, int mac_iter, 64 STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter, int mac_iter,
65 int keytype) 65 int keytype)
66{ 66{
67 PKCS12 *p12; 67 PKCS12 *p12;
@@ -103,8 +103,8 @@ PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
103 103
104 /* Add all other certificates */ 104 /* Add all other certificates */
105 if(ca) { 105 if(ca) {
106 for(i = 0; i < sk_num(ca); i++) { 106 for(i = 0; i < sk_X509_num(ca); i++) {
107 tcert = (X509 *)sk_value(ca, i); 107 tcert = sk_X509_value(ca, i);
108 if(!(bag = M_PKCS12_x5092certbag(tcert))) return NULL; 108 if(!(bag = M_PKCS12_x5092certbag(tcert))) return NULL;
109 if(!sk_push(bags, (char *)bag)) { 109 if(!sk_push(bags, (char *)bag)) {
110 PKCS12err(PKCS12_F_PKCS12_CREATE,ERR_R_MALLOC_FAILURE); 110 PKCS12err(PKCS12_F_PKCS12_CREATE,ERR_R_MALLOC_FAILURE);
diff --git a/src/lib/libcrypto/pkcs12/p12_key.c b/src/lib/libcrypto/pkcs12/p12_key.c
index 02fdd20e2f..b364671ed2 100644
--- a/src/lib/libcrypto/pkcs12/p12_key.c
+++ b/src/lib/libcrypto/pkcs12/p12_key.c
@@ -104,6 +104,14 @@ int PKCS12_key_gen_uni (unsigned char *pass, int passlen, unsigned char *salt,
104#ifdef DEBUG_KEYGEN 104#ifdef DEBUG_KEYGEN
105 unsigned char *tmpout = out; 105 unsigned char *tmpout = out;
106 int tmpn = n; 106 int tmpn = n;
107#endif
108
109 if (!pass) {
110 PKCS12err(PKCS12_F_PKCS12_KEY_GEN_UNI,ERR_R_PASSED_NULL_PARAMETER);
111 return 0;
112 }
113
114#ifdef DEBUG_KEYGEN
107 fprintf(stderr, "KEYGEN DEBUG\n"); 115 fprintf(stderr, "KEYGEN DEBUG\n");
108 fprintf(stderr, "ID %d, ITER %d\n", id, iter); 116 fprintf(stderr, "ID %d, ITER %d\n", id, iter);
109 fprintf(stderr, "Password (length %d):\n", passlen); 117 fprintf(stderr, "Password (length %d):\n", passlen);
diff --git a/src/lib/libcrypto/pkcs12/p12_kiss.c b/src/lib/libcrypto/pkcs12/p12_kiss.c
index 08a60556e0..ee257ffbad 100644
--- a/src/lib/libcrypto/pkcs12/p12_kiss.c
+++ b/src/lib/libcrypto/pkcs12/p12_kiss.c
@@ -62,9 +62,17 @@
62 62
63/* Simplified PKCS#12 routines */ 63/* Simplified PKCS#12 routines */
64 64
65static int parse_pk12( PKCS12 *p12, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca); 65static int parse_pk12( PKCS12 *p12, const char *pass, int passlen,
66static int parse_bags( STACK *bags, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca, ASN1_OCTET_STRING **keyid, char *keymatch); 66 EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);
67static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PKEY **pkey, X509 **cert, STACK **ca, ASN1_OCTET_STRING **keyid, char *keymatch); 67
68static int parse_bags( STACK *bags, const char *pass, int passlen,
69 EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
70 ASN1_OCTET_STRING **keyid, char *keymatch);
71
72static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen,
73 EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
74 ASN1_OCTET_STRING **keyid, char *keymatch);
75
68/* Parse and decrypt a PKCS#12 structure returning user key, user cert 76/* Parse and decrypt a PKCS#12 structure returning user key, user cert
69 * and other (CA) certs. Note either ca should be NULL, *ca should be NULL, 77 * and other (CA) certs. Note either ca should be NULL, *ca should be NULL,
70 * or it should point to a valid STACK structure. pkey and cert can be 78 * or it should point to a valid STACK structure. pkey and cert can be
@@ -72,54 +80,59 @@ static int parse_bag( PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PK
72 */ 80 */
73 81
74int PKCS12_parse (PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, 82int PKCS12_parse (PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
75 STACK **ca) 83 STACK_OF(X509) **ca)
76{ 84{
77 85
78/* Check for NULL PKCS12 structure */ 86 /* Check for NULL PKCS12 structure */
79
80if(!p12) {
81 PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
82 return 0;
83}
84 87
85/* Allocate stack for ca certificates if needed */ 88 if(!p12)
86if ((ca != NULL) && (*ca == NULL)) { 89 {
87 if (!(*ca = sk_new(NULL))) { 90 PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_INVALID_NULL_PKCS12_POINTER);
88 PKCS12err(PKCS12_F_PKCS12_PARSE,ERR_R_MALLOC_FAILURE);
89 return 0; 91 return 0;
90 } 92 }
91} 93
94 /* Allocate stack for ca certificates if needed */
95 if ((ca != NULL) && (*ca == NULL))
96 {
97 if (!(*ca = sk_X509_new(NULL)))
98 {
99 PKCS12err(PKCS12_F_PKCS12_PARSE,ERR_R_MALLOC_FAILURE);
100 return 0;
101 }
102 }
92 103
93if(pkey) *pkey = NULL; 104 if(pkey) *pkey = NULL;
94if(cert) *cert = NULL; 105 if(cert) *cert = NULL;
95 106
96/* Check the mac */ 107 /* Check the mac */
97 108
98if (!PKCS12_verify_mac (p12, pass, -1)) { 109 if (!PKCS12_verify_mac (p12, pass, -1))
99 PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_MAC_VERIFY_FAILURE); 110 {
100 goto err; 111 PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_MAC_VERIFY_FAILURE);
101} 112 goto err;
113 }
102 114
103if (!parse_pk12 (p12, pass, -1, pkey, cert, ca)) { 115 if (!parse_pk12 (p12, pass, -1, pkey, cert, ca))
104 PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_PARSE_ERROR); 116 {
105 goto err; 117 PKCS12err(PKCS12_F_PKCS12_PARSE,PKCS12_R_PARSE_ERROR);
106} 118 goto err;
119 }
107 120
108return 1; 121 return 1;
109 122
110err: 123 err:
111 124
112if (pkey && *pkey) EVP_PKEY_free (*pkey); 125 if (pkey && *pkey) EVP_PKEY_free (*pkey);
113if (cert && *cert) X509_free (*cert); 126 if (cert && *cert) X509_free (*cert);
114if (ca) sk_pop_free (*ca, X509_free); 127 if (ca) sk_X509_pop_free (*ca, X509_free);
115return 0; 128 return 0;
116 129
117} 130}
118 131
119/* Parse the outer PKCS#12 structure */ 132/* Parse the outer PKCS#12 structure */
120 133
121static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen, 134static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen,
122 EVP_PKEY **pkey, X509 **cert, STACK **ca) 135 EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
123{ 136{
124 STACK *asafes, *bags; 137 STACK *asafes, *bags;
125 int i, bagnid; 138 int i, bagnid;
@@ -154,7 +167,7 @@ static int parse_pk12 (PKCS12 *p12, const char *pass, int passlen,
154 167
155 168
156static int parse_bags (STACK *bags, const char *pass, int passlen, 169static int parse_bags (STACK *bags, const char *pass, int passlen,
157 EVP_PKEY **pkey, X509 **cert, STACK **ca, 170 EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
158 ASN1_OCTET_STRING **keyid, char *keymatch) 171 ASN1_OCTET_STRING **keyid, char *keymatch)
159{ 172{
160 int i; 173 int i;
@@ -171,7 +184,7 @@ static int parse_bags (STACK *bags, const char *pass, int passlen,
171#define MATCH_ALL 0x3 184#define MATCH_ALL 0x3
172 185
173static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen, 186static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
174 EVP_PKEY **pkey, X509 **cert, STACK **ca, 187 EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca,
175 ASN1_OCTET_STRING **keyid, 188 ASN1_OCTET_STRING **keyid,
176 char *keymatch) 189 char *keymatch)
177{ 190{
@@ -221,7 +234,10 @@ static int parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen,
221 if (lkey) { 234 if (lkey) {
222 *keymatch |= MATCH_CERT; 235 *keymatch |= MATCH_CERT;
223 if (cert) *cert = x509; 236 if (cert) *cert = x509;
224 } else if (ca) sk_push (*ca, (char *)x509); 237 } else {
238 if(ca) sk_X509_push (*ca, x509);
239 else X509_free(x509);
240 }
225 break; 241 break;
226 242
227 case NID_safeContentsBag: 243 case NID_safeContentsBag:
diff --git a/src/lib/libcrypto/pkcs12/p12_mutl.c b/src/lib/libcrypto/pkcs12/p12_mutl.c
index f1094b3840..369257ed4c 100644
--- a/src/lib/libcrypto/pkcs12/p12_mutl.c
+++ b/src/lib/libcrypto/pkcs12/p12_mutl.c
@@ -157,7 +157,7 @@ int PKCS12_setup_mac (PKCS12 *p12, int iter, unsigned char *salt, int saltlen,
157 return 0; 157 return 0;
158 } 158 }
159 if (!salt) { 159 if (!salt) {
160 if (RAND_bytes (p12->mac->salt->data, saltlen) <= 0) 160 if (RAND_pseudo_bytes (p12->mac->salt->data, saltlen) < 0)
161 return 0; 161 return 0;
162 } 162 }
163 else memcpy (p12->mac->salt->data, salt, saltlen); 163 else memcpy (p12->mac->salt->data, salt, saltlen);
diff --git a/src/lib/libcrypto/pkcs12/pk12err.c b/src/lib/libcrypto/pkcs12/pk12err.c
index 9d8de10e1e..12db54f49e 100644
--- a/src/lib/libcrypto/pkcs12/pk12err.c
+++ b/src/lib/libcrypto/pkcs12/pk12err.c
@@ -54,7 +54,8 @@
54 */ 54 */
55 55
56/* NOTE: this file was auto generated by the mkerr.pl script: any changes 56/* NOTE: this file was auto generated by the mkerr.pl script: any changes
57 * made to it will be overwritten when the script next updates this file. 57 * made to it will be overwritten when the script next updates this file,
58 * only reason strings will be preserved.
58 */ 59 */
59 60
60#include <stdio.h> 61#include <stdio.h>
diff --git a/src/lib/libcrypto/pkcs12/pkcs12.h b/src/lib/libcrypto/pkcs12/pkcs12.h
index 254000fa12..dad356c00f 100644
--- a/src/lib/libcrypto/pkcs12/pkcs12.h
+++ b/src/lib/libcrypto/pkcs12/pkcs12.h
@@ -265,9 +265,9 @@ void PKCS12_SAFEBAG_free(PKCS12_SAFEBAG *a);
265void ERR_load_PKCS12_strings(void); 265void ERR_load_PKCS12_strings(void);
266void PKCS12_PBE_add(void); 266void PKCS12_PBE_add(void);
267int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert, 267int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
268 STACK **ca); 268 STACK_OF(X509) **ca);
269PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert, 269PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
270 STACK *ca, int nid_key, int nid_cert, int iter, 270 STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter,
271 int mac_iter, int keytype); 271 int mac_iter, int keytype);
272int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12); 272int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12);
273int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12); 273int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12);