summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2024-01-25 14:15:05 +0000
committertb <>2024-01-25 14:15:05 +0000
commit9a1e86766d1016520d954f0f38495dd1a6e73c60 (patch)
treec1452f0bdd3483ceb550ad4d080770e10c201b6f
parent53af1786bc1ae897480d39ebc05ab1f8d226b3a9 (diff)
downloadopenbsd-9a1e86766d1016520d954f0f38495dd1a6e73c60.tar.gz
openbsd-9a1e86766d1016520d954f0f38495dd1a6e73c60.tar.bz2
openbsd-9a1e86766d1016520d954f0f38495dd1a6e73c60.zip
p12_npas.c: hoist some helpers from the bottom to the top in reverse order
-rw-r--r--src/lib/libcrypto/pkcs12/p12_npas.c117
1 files changed, 53 insertions, 64 deletions
diff --git a/src/lib/libcrypto/pkcs12/p12_npas.c b/src/lib/libcrypto/pkcs12/p12_npas.c
index 927b33a42f..25f85d0809 100644
--- a/src/lib/libcrypto/pkcs12/p12_npas.c
+++ b/src/lib/libcrypto/pkcs12/p12_npas.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_npas.c,v 1.25 2024/01/25 14:09:26 tb Exp $ */ 1/* $OpenBSD: p12_npas.c,v 1.26 2024/01/25 14:15:05 tb 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 */
@@ -68,15 +68,59 @@
68 68
69/* PKCS#12 password change routine */ 69/* PKCS#12 password change routine */
70 70
71static int newpass_bags(STACK_OF(PKCS12_SAFEBAG) *bags, const char *oldpass, 71static int
72 const char *newpass); 72alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen)
73static int newpass_bag(PKCS12_SAFEBAG *bag, const char *oldpass, 73{
74 const char *newpass); 74 PBEPARAM *pbe;
75static int alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen); 75 const unsigned char *p;
76 76
77/* 77 p = alg->parameter->value.sequence->data;
78 * Change the password on a PKCS#12 structure. 78 pbe = d2i_PBEPARAM(NULL, &p, alg->parameter->value.sequence->length);
79 */ 79 if (!pbe)
80 return 0;
81 *pnid = OBJ_obj2nid(alg->algorithm);
82 *piter = ASN1_INTEGER_get(pbe->iter);
83 *psaltlen = pbe->salt->length;
84 PBEPARAM_free(pbe);
85 return 1;
86}
87
88/* Change password of safebag: only needs handle shrouded keybags */
89static int
90newpass_bag(PKCS12_SAFEBAG *bag, const char *oldpass, const char *newpass)
91{
92 PKCS8_PRIV_KEY_INFO *p8;
93 X509_SIG *p8new;
94 int p8_nid, p8_saltlen, p8_iter;
95
96 if (OBJ_obj2nid(bag->type) != NID_pkcs8ShroudedKeyBag)
97 return 1;
98
99 if (!(p8 = PKCS8_decrypt(bag->value.shkeybag, oldpass, -1)))
100 return 0;
101 if (!alg_get(bag->value.shkeybag->algor, &p8_nid, &p8_iter,
102 &p8_saltlen))
103 return 0;
104 if (!(p8new = PKCS8_encrypt(p8_nid, NULL, newpass, -1, NULL, p8_saltlen,
105 p8_iter, p8))) return 0;
106 X509_SIG_free(bag->value.shkeybag);
107 bag->value.shkeybag = p8new;
108 return 1;
109}
110
111static int
112newpass_bags(STACK_OF(PKCS12_SAFEBAG) *bags, const char *oldpass,
113 const char *newpass)
114{
115 int i;
116
117 for (i = 0; i < sk_PKCS12_SAFEBAG_num(bags); i++) {
118 if (!newpass_bag(sk_PKCS12_SAFEBAG_value(bags, i),
119 oldpass, newpass))
120 return 0;
121 }
122 return 1;
123}
80 124
81static int 125static int
82pkcs7_repack_data(PKCS7 *pkcs7, STACK_OF(PKCS7) *safes, const char *oldpass, 126pkcs7_repack_data(PKCS7 *pkcs7, STACK_OF(PKCS7) *safes, const char *oldpass,
@@ -229,58 +273,3 @@ PKCS12_newpass(PKCS12 *pkcs12, const char *oldpass, const char *newpass)
229 return ret; 273 return ret;
230} 274}
231LCRYPTO_ALIAS(PKCS12_newpass); 275LCRYPTO_ALIAS(PKCS12_newpass);
232
233static int
234newpass_bags(STACK_OF(PKCS12_SAFEBAG) *bags, const char *oldpass,
235 const char *newpass)
236{
237 int i;
238
239 for (i = 0; i < sk_PKCS12_SAFEBAG_num(bags); i++) {
240 if (!newpass_bag(sk_PKCS12_SAFEBAG_value(bags, i),
241 oldpass, newpass))
242 return 0;
243 }
244 return 1;
245}
246
247/* Change password of safebag: only needs handle shrouded keybags */
248
249static int
250newpass_bag(PKCS12_SAFEBAG *bag, const char *oldpass, const char *newpass)
251{
252 PKCS8_PRIV_KEY_INFO *p8;
253 X509_SIG *p8new;
254 int p8_nid, p8_saltlen, p8_iter;
255
256 if (OBJ_obj2nid(bag->type) != NID_pkcs8ShroudedKeyBag)
257 return 1;
258
259 if (!(p8 = PKCS8_decrypt(bag->value.shkeybag, oldpass, -1)))
260 return 0;
261 if (!alg_get(bag->value.shkeybag->algor, &p8_nid, &p8_iter,
262 &p8_saltlen))
263 return 0;
264 if (!(p8new = PKCS8_encrypt(p8_nid, NULL, newpass, -1, NULL, p8_saltlen,
265 p8_iter, p8))) return 0;
266 X509_SIG_free(bag->value.shkeybag);
267 bag->value.shkeybag = p8new;
268 return 1;
269}
270
271static int
272alg_get(X509_ALGOR *alg, int *pnid, int *piter, int *psaltlen)
273{
274 PBEPARAM *pbe;
275 const unsigned char *p;
276
277 p = alg->parameter->value.sequence->data;
278 pbe = d2i_PBEPARAM(NULL, &p, alg->parameter->value.sequence->length);
279 if (!pbe)
280 return 0;
281 *pnid = OBJ_obj2nid(alg->algorithm);
282 *piter = ASN1_INTEGER_get(pbe->iter);
283 *psaltlen = pbe->salt->length;
284 PBEPARAM_free(pbe);
285 return 1;
286}