diff options
Diffstat (limited to 'src/lib/libcrypto/pkcs12/p12_npas.c')
-rw-r--r-- | src/lib/libcrypto/pkcs12/p12_npas.c | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_npas.c b/src/lib/libcrypto/pkcs12/p12_npas.c index ee71707e2c..a549433eeb 100644 --- a/src/lib/libcrypto/pkcs12/p12_npas.c +++ b/src/lib/libcrypto/pkcs12/p12_npas.c | |||
@@ -66,7 +66,8 @@ | |||
66 | /* PKCS#12 password change routine */ | 66 | /* PKCS#12 password change routine */ |
67 | 67 | ||
68 | static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass); | 68 | static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass); |
69 | static int newpass_bags(STACK *bags, char *oldpass, char *newpass); | 69 | static int newpass_bags(STACK_OF(PKCS12_SAFEBAG) *bags, char *oldpass, |
70 | char *newpass); | ||
70 | static int newpass_bag(PKCS12_SAFEBAG *bag, char *oldpass, char *newpass); | 71 | static int newpass_bag(PKCS12_SAFEBAG *bag, char *oldpass, char *newpass); |
71 | static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen); | 72 | static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen); |
72 | 73 | ||
@@ -104,51 +105,53 @@ return 1; | |||
104 | 105 | ||
105 | static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass) | 106 | static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass) |
106 | { | 107 | { |
107 | STACK *asafes, *newsafes, *bags; | 108 | STACK_OF(PKCS7) *asafes, *newsafes; |
109 | STACK_OF(PKCS12_SAFEBAG) *bags; | ||
108 | int i, bagnid, pbe_nid, pbe_iter, pbe_saltlen; | 110 | int i, bagnid, pbe_nid, pbe_iter, pbe_saltlen; |
109 | PKCS7 *p7, *p7new; | 111 | PKCS7 *p7, *p7new; |
110 | ASN1_OCTET_STRING *p12_data_tmp = NULL, *macnew = NULL; | 112 | ASN1_OCTET_STRING *p12_data_tmp = NULL, *macnew = NULL; |
111 | unsigned char mac[EVP_MAX_MD_SIZE]; | 113 | unsigned char mac[EVP_MAX_MD_SIZE]; |
112 | unsigned int maclen; | 114 | unsigned int maclen; |
113 | if (!(asafes = M_PKCS12_unpack_authsafes(p12))) return 0; | 115 | |
114 | if(!(newsafes = sk_new(NULL))) return 0; | 116 | if (!(asafes = PKCS12_unpack_authsafes(p12))) return 0; |
115 | for (i = 0; i < sk_num (asafes); i++) { | 117 | if(!(newsafes = sk_PKCS7_new_null())) return 0; |
116 | p7 = (PKCS7 *) sk_value(asafes, i); | 118 | for (i = 0; i < sk_PKCS7_num (asafes); i++) { |
119 | p7 = sk_PKCS7_value(asafes, i); | ||
117 | bagnid = OBJ_obj2nid(p7->type); | 120 | bagnid = OBJ_obj2nid(p7->type); |
118 | if (bagnid == NID_pkcs7_data) { | 121 | if (bagnid == NID_pkcs7_data) { |
119 | bags = M_PKCS12_unpack_p7data(p7); | 122 | bags = PKCS12_unpack_p7data(p7); |
120 | } else if (bagnid == NID_pkcs7_encrypted) { | 123 | } else if (bagnid == NID_pkcs7_encrypted) { |
121 | bags = M_PKCS12_unpack_p7encdata(p7, oldpass, -1); | 124 | bags = PKCS12_unpack_p7encdata(p7, oldpass, -1); |
122 | alg_get(p7->d.encrypted->enc_data->algorithm, | 125 | alg_get(p7->d.encrypted->enc_data->algorithm, |
123 | &pbe_nid, &pbe_iter, &pbe_saltlen); | 126 | &pbe_nid, &pbe_iter, &pbe_saltlen); |
124 | } else continue; | 127 | } else continue; |
125 | if (!bags) { | 128 | if (!bags) { |
126 | sk_pop_free(asafes, PKCS7_free); | 129 | sk_PKCS7_pop_free(asafes, PKCS7_free); |
127 | return 0; | 130 | return 0; |
128 | } | 131 | } |
129 | if (!newpass_bags(bags, oldpass, newpass)) { | 132 | if (!newpass_bags(bags, oldpass, newpass)) { |
130 | sk_pop_free(bags, PKCS12_SAFEBAG_free); | 133 | sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); |
131 | sk_pop_free(asafes, PKCS7_free); | 134 | sk_PKCS7_pop_free(asafes, PKCS7_free); |
132 | return 0; | 135 | return 0; |
133 | } | 136 | } |
134 | /* Repack bag in same form with new password */ | 137 | /* Repack bag in same form with new password */ |
135 | if (bagnid == NID_pkcs7_data) p7new = PKCS12_pack_p7data(bags); | 138 | if (bagnid == NID_pkcs7_data) p7new = PKCS12_pack_p7data(bags); |
136 | else p7new = PKCS12_pack_p7encdata(pbe_nid, newpass, -1, NULL, | 139 | else p7new = PKCS12_pack_p7encdata(pbe_nid, newpass, -1, NULL, |
137 | pbe_saltlen, pbe_iter, bags); | 140 | pbe_saltlen, pbe_iter, bags); |
138 | sk_pop_free(bags, PKCS12_SAFEBAG_free); | 141 | sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); |
139 | if(!p7new) { | 142 | if(!p7new) { |
140 | sk_pop_free(asafes, PKCS7_free); | 143 | sk_PKCS7_pop_free(asafes, PKCS7_free); |
141 | return 0; | 144 | return 0; |
142 | } | 145 | } |
143 | sk_push(newsafes, (char *)p7new); | 146 | sk_PKCS7_push(newsafes, p7new); |
144 | } | 147 | } |
145 | sk_pop_free(asafes, PKCS7_free); | 148 | sk_PKCS7_pop_free(asafes, PKCS7_free); |
146 | 149 | ||
147 | /* Repack safe: save old safe in case of error */ | 150 | /* Repack safe: save old safe in case of error */ |
148 | 151 | ||
149 | p12_data_tmp = p12->authsafes->d.data; | 152 | p12_data_tmp = p12->authsafes->d.data; |
150 | if(!(p12->authsafes->d.data = ASN1_OCTET_STRING_new())) goto saferr; | 153 | if(!(p12->authsafes->d.data = ASN1_OCTET_STRING_new())) goto saferr; |
151 | if(!M_PKCS12_pack_authsafes(p12, newsafes)) goto saferr; | 154 | if(!PKCS12_pack_authsafes(p12, newsafes)) goto saferr; |
152 | 155 | ||
153 | if(!PKCS12_gen_mac(p12, newpass, -1, mac, &maclen)) goto saferr; | 156 | if(!PKCS12_gen_mac(p12, newpass, -1, mac, &maclen)) goto saferr; |
154 | if(!(macnew = ASN1_OCTET_STRING_new())) goto saferr; | 157 | if(!(macnew = ASN1_OCTET_STRING_new())) goto saferr; |
@@ -169,12 +172,14 @@ static int newpass_p12(PKCS12 *p12, char *oldpass, char *newpass) | |||
169 | } | 172 | } |
170 | 173 | ||
171 | 174 | ||
172 | static int newpass_bags(STACK *bags, char *oldpass, char *newpass) | 175 | static int newpass_bags(STACK_OF(PKCS12_SAFEBAG) *bags, char *oldpass, |
176 | char *newpass) | ||
173 | { | 177 | { |
174 | int i; | 178 | int i; |
175 | for (i = 0; i < sk_num(bags); i++) { | 179 | for (i = 0; i < sk_PKCS12_SAFEBAG_num(bags); i++) { |
176 | if (!newpass_bag((PKCS12_SAFEBAG *)sk_value(bags, i), | 180 | if (!newpass_bag(sk_PKCS12_SAFEBAG_value(bags, i), |
177 | oldpass, newpass)) return 0; | 181 | oldpass, newpass)) |
182 | return 0; | ||
178 | } | 183 | } |
179 | return 1; | 184 | return 1; |
180 | } | 185 | } |
@@ -189,7 +194,7 @@ static int newpass_bag(PKCS12_SAFEBAG *bag, char *oldpass, char *newpass) | |||
189 | 194 | ||
190 | if(M_PKCS12_bag_type(bag) != NID_pkcs8ShroudedKeyBag) return 1; | 195 | if(M_PKCS12_bag_type(bag) != NID_pkcs8ShroudedKeyBag) return 1; |
191 | 196 | ||
192 | if (!(p8 = M_PKCS12_decrypt_skey(bag, oldpass, -1))) return 0; | 197 | if (!(p8 = PKCS8_decrypt(bag->value.shkeybag, oldpass, -1))) return 0; |
193 | alg_get(bag->value.shkeybag->algor, &p8_nid, &p8_iter, &p8_saltlen); | 198 | alg_get(bag->value.shkeybag->algor, &p8_nid, &p8_iter, &p8_saltlen); |
194 | if(!(p8new = PKCS8_encrypt(p8_nid, NULL, newpass, -1, NULL, p8_saltlen, | 199 | if(!(p8new = PKCS8_encrypt(p8_nid, NULL, newpass, -1, NULL, p8_saltlen, |
195 | p8_iter, p8))) return 0; | 200 | p8_iter, p8))) return 0; |