summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2022-08-03 20:16:06 +0000
committertb <>2022-08-03 20:16:06 +0000
commit65a74ca85df35967792e35e1060f5c4f7cfea35c (patch)
tree2050ca3c5df6f38c2b64ca740e75145adf5ebc5a /src/lib
parent0086325146fe45a6dcc6b30f48bdb72f604e792f (diff)
downloadopenbsd-65a74ca85df35967792e35e1060f5c4f7cfea35c.tar.gz
openbsd-65a74ca85df35967792e35e1060f5c4f7cfea35c.tar.bz2
openbsd-65a74ca85df35967792e35e1060f5c4f7cfea35c.zip
Prepare to provide PKCS12 accessors
In order to be able to make pkcs12/ opaque, we need an entire family of accessors. These are in a particularly nasty tangle since this was done in about a dozen steps while sprinkling const, renaming functions, etc. The public API also adds backward compat macros for functions that were in the tree for half a day and then renamed. Of course some of them got picked up by some ports. Some of the gruesome hacks in here will go away with the next bump, but that doesn't mean that the pkcs12 directory will be prettier afterward. ok jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/Makefile4
-rw-r--r--src/lib/libcrypto/pkcs12/p12_add.c6
-rw-r--r--src/lib/libcrypto/pkcs12/p12_attr.c12
-rw-r--r--src/lib/libcrypto/pkcs12/p12_crt.c8
-rw-r--r--src/lib/libcrypto/pkcs12/p12_kiss.c8
-rw-r--r--src/lib/libcrypto/pkcs12/p12_mutl.c35
-rw-r--r--src/lib/libcrypto/pkcs12/p12_sbag.c224
-rw-r--r--src/lib/libcrypto/pkcs12/p12_utl.c9
-rw-r--r--src/lib/libcrypto/pkcs12/pkcs12.h65
9 files changed, 349 insertions, 22 deletions
diff --git a/src/lib/libcrypto/Makefile b/src/lib/libcrypto/Makefile
index 423fba5f58..714f6e80b4 100644
--- a/src/lib/libcrypto/Makefile
+++ b/src/lib/libcrypto/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.77 2022/07/24 08:16:47 tb Exp $ 1# $OpenBSD: Makefile,v 1.78 2022/08/03 20:16:06 tb Exp $
2 2
3LIB= crypto 3LIB= crypto
4LIBREBUILD=y 4LIBREBUILD=y
@@ -234,7 +234,7 @@ SRCS+= pem_x509.c pem_xaux.c pem_oth.c pem_pk8.c pem_pkey.c pvkfmt.c
234 234
235# pkcs12/ 235# pkcs12/
236SRCS+= p12_add.c p12_asn.c p12_attr.c p12_crpt.c p12_crt.c p12_decr.c 236SRCS+= p12_add.c p12_asn.c p12_attr.c p12_crpt.c p12_crt.c p12_decr.c
237SRCS+= p12_init.c p12_key.c p12_kiss.c p12_mutl.c 237SRCS+= p12_init.c p12_key.c p12_kiss.c p12_mutl.c p12_sbag.c
238SRCS+= p12_utl.c p12_npas.c pk12err.c p12_p8d.c p12_p8e.c 238SRCS+= p12_utl.c p12_npas.c pk12err.c p12_p8d.c p12_p8e.c
239 239
240# pkcs7/ 240# pkcs7/
diff --git a/src/lib/libcrypto/pkcs12/p12_add.c b/src/lib/libcrypto/pkcs12/p12_add.c
index 08bb75d312..e423c76411 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.17 2018/05/13 14:24:07 tb Exp $ */ 1/* $OpenBSD: p12_add.c,v 1.18 2022/08/03 20:16:06 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 */
@@ -89,6 +89,9 @@ PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1, int nid2)
89 return safebag; 89 return safebag;
90} 90}
91 91
92#if !defined(LIBRESSL_NEXT_API)
93#undef PKCS12_MAKE_KEYBAG
94#undef PKCS12_MAKE_SHKEYBAG
92/* Turn PKCS8 object into a keybag */ 95/* Turn PKCS8 object into a keybag */
93 96
94PKCS12_SAFEBAG * 97PKCS12_SAFEBAG *
@@ -136,6 +139,7 @@ PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass, int passlen,
136 139
137 return bag; 140 return bag;
138} 141}
142#endif
139 143
140/* Turn a stack of SAFEBAGS into a PKCS#7 data Contentinfo */ 144/* Turn a stack of SAFEBAGS into a PKCS#7 data Contentinfo */
141PKCS7 * 145PKCS7 *
diff --git a/src/lib/libcrypto/pkcs12/p12_attr.c b/src/lib/libcrypto/pkcs12/p12_attr.c
index a35a148b11..01a7a3ea8c 100644
--- a/src/lib/libcrypto/pkcs12/p12_attr.c
+++ b/src/lib/libcrypto/pkcs12/p12_attr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_attr.c,v 1.15 2022/05/09 19:19:33 jsing Exp $ */ 1/* $OpenBSD: p12_attr.c,v 1.16 2022/08/03 20:16:06 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 */
@@ -138,12 +138,18 @@ PKCS12_get_attr_gen(const STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid)
138char * 138char *
139PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag) 139PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag)
140{ 140{
141 ASN1_TYPE *atype; 141 const ASN1_TYPE *atype;
142 142
143 if (!(atype = PKCS12_get_attr(bag, NID_friendlyName))) 143 if (!(atype = PKCS12_SAFEBAG_get0_attr(bag, NID_friendlyName)))
144 return NULL; 144 return NULL;
145 if (atype->type != V_ASN1_BMPSTRING) 145 if (atype->type != V_ASN1_BMPSTRING)
146 return NULL; 146 return NULL;
147 return OPENSSL_uni2asc(atype->value.bmpstring->data, 147 return OPENSSL_uni2asc(atype->value.bmpstring->data,
148 atype->value.bmpstring->length); 148 atype->value.bmpstring->length);
149} 149}
150
151const STACK_OF(X509_ATTRIBUTE) *
152PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag)
153{
154 return bag->attrib;
155}
diff --git a/src/lib/libcrypto/pkcs12/p12_crt.c b/src/lib/libcrypto/pkcs12/p12_crt.c
index f8ba3357e7..dbcfd25478 100644
--- a/src/lib/libcrypto/pkcs12/p12_crt.c
+++ b/src/lib/libcrypto/pkcs12/p12_crt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_crt.c,v 1.18 2018/05/13 13:46:55 tb Exp $ */ 1/* $OpenBSD: p12_crt.c,v 1.19 2022/08/03 20:16:06 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. 3 * project.
4 */ 4 */
@@ -232,12 +232,12 @@ PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, EVP_PKEY *key, int key_usage,
232 if (key_usage && !PKCS8_add_keyusage(p8, key_usage)) 232 if (key_usage && !PKCS8_add_keyusage(p8, key_usage))
233 goto err; 233 goto err;
234 if (nid_key != -1) { 234 if (nid_key != -1) {
235 bag = PKCS12_MAKE_SHKEYBAG(nid_key, pass, -1, NULL, 0, 235 bag = PKCS12_SAFEBAG_create_pkcs8_encrypt(nid_key, pass, -1,
236 iter, p8); 236 NULL, 0, iter, p8);
237 PKCS8_PRIV_KEY_INFO_free(p8); 237 PKCS8_PRIV_KEY_INFO_free(p8);
238 p8 = NULL; 238 p8 = NULL;
239 } else { 239 } else {
240 bag = PKCS12_MAKE_KEYBAG(p8); 240 bag = PKCS12_SAFEBAG_create0_p8inf(p8);
241 if (bag != NULL) 241 if (bag != NULL)
242 p8 = NULL; 242 p8 = NULL;
243 } 243 }
diff --git a/src/lib/libcrypto/pkcs12/p12_kiss.c b/src/lib/libcrypto/pkcs12/p12_kiss.c
index 6bbfa2aeef..42a84a5458 100644
--- a/src/lib/libcrypto/pkcs12/p12_kiss.c
+++ b/src/lib/libcrypto/pkcs12/p12_kiss.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_kiss.c,v 1.23 2022/07/24 18:51:16 tb Exp $ */ 1/* $OpenBSD: p12_kiss.c,v 1.24 2022/08/03 20:16:06 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 */
@@ -224,14 +224,14 @@ parse_bag(PKCS12_SAFEBAG *bag, const char *pass, int passlen, EVP_PKEY **pkey,
224{ 224{
225 PKCS8_PRIV_KEY_INFO *p8; 225 PKCS8_PRIV_KEY_INFO *p8;
226 X509 *x509; 226 X509 *x509;
227 ASN1_TYPE *attrib; 227 const ASN1_TYPE *attrib;
228 ASN1_BMPSTRING *fname = NULL; 228 ASN1_BMPSTRING *fname = NULL;
229 ASN1_OCTET_STRING *lkid = NULL; 229 ASN1_OCTET_STRING *lkid = NULL;
230 230
231 if ((attrib = PKCS12_get_attr(bag, NID_friendlyName))) 231 if ((attrib = PKCS12_SAFEBAG_get0_attr(bag, NID_friendlyName)))
232 fname = attrib->value.bmpstring; 232 fname = attrib->value.bmpstring;
233 233
234 if ((attrib = PKCS12_get_attr(bag, NID_localKeyID))) 234 if ((attrib = PKCS12_SAFEBAG_get0_attr(bag, NID_localKeyID)))
235 lkid = attrib->value.octet_string; 235 lkid = attrib->value.octet_string;
236 236
237 switch (OBJ_obj2nid(bag->type)) { 237 switch (OBJ_obj2nid(bag->type)) {
diff --git a/src/lib/libcrypto/pkcs12/p12_mutl.c b/src/lib/libcrypto/pkcs12/p12_mutl.c
index 7474bf5ff3..5c9cea90db 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.30 2022/07/25 05:06:06 tb Exp $ */ 1/* $OpenBSD: p12_mutl.c,v 1.31 2022/08/03 20:16:06 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 */
@@ -72,6 +72,39 @@
72#include "hmac_local.h" 72#include "hmac_local.h"
73#include "x509_lcl.h" 73#include "x509_lcl.h"
74 74
75int
76PKCS12_mac_present(const PKCS12 *p12)
77{
78 return p12->mac != NULL;
79}
80
81void
82PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, const X509_ALGOR **pmacalg,
83 const ASN1_OCTET_STRING **psalt, const ASN1_INTEGER **piter,
84 const PKCS12 *p12)
85{
86 if (p12->mac == NULL) {
87 if (pmac != NULL)
88 *pmac = NULL;
89 if (pmacalg != NULL)
90 *pmacalg = NULL;
91 if (psalt != NULL)
92 *psalt = NULL;
93 if (piter != NULL)
94 *piter = NULL;
95 return;
96 }
97
98 if (pmac != NULL)
99 *pmac = p12->mac->dinfo->digest;
100 if (pmacalg != NULL)
101 *pmacalg = p12->mac->dinfo->algor;
102 if (psalt != NULL)
103 *psalt = p12->mac->salt;
104 if (piter != NULL)
105 *piter = p12->mac->iter;
106}
107
75/* Generate a MAC */ 108/* Generate a MAC */
76int 109int
77PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen, 110PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen,
diff --git a/src/lib/libcrypto/pkcs12/p12_sbag.c b/src/lib/libcrypto/pkcs12/p12_sbag.c
new file mode 100644
index 0000000000..4e9f7ed3dd
--- /dev/null
+++ b/src/lib/libcrypto/pkcs12/p12_sbag.c
@@ -0,0 +1,224 @@
1/* $OpenBSD: p12_sbag.c,v 1.4 2022/08/03 20:16:06 tb Exp $ */
2/*
3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
4 * 1999-2018.
5 */
6/* ====================================================================
7 * Copyright (c) 1999 The OpenSSL Project. All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in
18 * the documentation and/or other materials provided with the
19 * distribution.
20 *
21 * 3. All advertising materials mentioning features or use of this
22 * software must display the following acknowledgment:
23 * "This product includes software developed by the OpenSSL Project
24 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25 *
26 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27 * endorse or promote products derived from this software without
28 * prior written permission. For written permission, please contact
29 * licensing@OpenSSL.org.
30 *
31 * 5. Products derived from this software may not be called "OpenSSL"
32 * nor may "OpenSSL" appear in their names without prior written
33 * permission of the OpenSSL Project.
34 *
35 * 6. Redistributions of any form whatsoever must retain the following
36 * acknowledgment:
37 * "This product includes software developed by the OpenSSL Project
38 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51 * OF THE POSSIBILITY OF SUCH DAMAGE.
52 * ====================================================================
53 *
54 * This product includes cryptographic software written by Eric Young
55 * (eay@cryptsoft.com). This product includes software written by Tim
56 * Hudson (tjh@cryptsoft.com).
57 *
58 */
59
60#include <stdio.h>
61
62#include <openssl/err.h>
63#include <openssl/pkcs12.h>
64
65#include "x509_lcl.h"
66
67const ASN1_TYPE *
68PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag, int attr_nid)
69{
70 return PKCS12_get_attr_gen(bag->attrib, attr_nid);
71}
72
73ASN1_TYPE *
74PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid)
75{
76 return PKCS12_get_attr_gen(p8->attributes, attr_nid);
77}
78
79const PKCS8_PRIV_KEY_INFO *
80PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag)
81{
82 if (PKCS12_SAFEBAG_get_nid(bag) != NID_keyBag)
83 return NULL;
84
85 return bag->value.keybag;
86}
87
88const X509_SIG *
89PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag)
90{
91 if (PKCS12_SAFEBAG_get_nid(bag) != NID_pkcs8ShroudedKeyBag)
92 return NULL;
93
94 return bag->value.shkeybag;
95}
96
97const STACK_OF(PKCS12_SAFEBAG) *
98PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag)
99{
100 if (PKCS12_SAFEBAG_get_nid(bag) != NID_safeContentsBag)
101 return NULL;
102
103 return bag->value.safes;
104}
105
106const ASN1_OBJECT *
107PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag)
108{
109 return bag->type;
110}
111
112int
113PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag)
114{
115 return OBJ_obj2nid(bag->type);
116}
117
118int
119PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag)
120{
121 int bag_type;
122
123 bag_type = PKCS12_SAFEBAG_get_nid(bag);
124
125 if (bag_type == NID_certBag || bag_type == NID_crlBag ||
126 bag_type == NID_secretBag)
127 return OBJ_obj2nid(bag->value.bag->type);
128
129 return -1;
130}
131
132X509 *
133PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag)
134{
135 if (OBJ_obj2nid(bag->type) != NID_certBag)
136 return NULL;
137 if (OBJ_obj2nid(bag->value.bag->type) != NID_x509Certificate)
138 return NULL;
139 return ASN1_item_unpack(bag->value.bag->value.octet, &X509_it);
140}
141
142X509_CRL *
143PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag)
144{
145 if (OBJ_obj2nid(bag->type) != NID_crlBag)
146 return NULL;
147 if (OBJ_obj2nid(bag->value.bag->type) != NID_x509Crl)
148 return NULL;
149 return ASN1_item_unpack(bag->value.bag->value.octet, &X509_CRL_it);
150}
151
152PKCS12_SAFEBAG *
153PKCS12_SAFEBAG_create_cert(X509 *x509)
154{
155 return PKCS12_item_pack_safebag(x509, &X509_it,
156 NID_x509Certificate, NID_certBag);
157}
158
159PKCS12_SAFEBAG *
160PKCS12_SAFEBAG_create_crl(X509_CRL *crl)
161{
162 return PKCS12_item_pack_safebag(crl, &X509_CRL_it,
163 NID_x509Crl, NID_crlBag);
164}
165
166/* Turn PKCS8 object into a keybag */
167
168PKCS12_SAFEBAG *
169PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8)
170{
171 PKCS12_SAFEBAG *bag;
172
173 if ((bag = PKCS12_SAFEBAG_new()) == NULL) {
174 PKCS12error(ERR_R_MALLOC_FAILURE);
175 return NULL;
176 }
177
178 bag->type = OBJ_nid2obj(NID_keyBag);
179 bag->value.keybag = p8;
180
181 return bag;
182}
183
184/* Turn PKCS8 object into a shrouded keybag */
185
186PKCS12_SAFEBAG *
187PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8)
188{
189 PKCS12_SAFEBAG *bag;
190
191 /* Set up the safe bag */
192 if ((bag = PKCS12_SAFEBAG_new()) == NULL) {
193 PKCS12error(ERR_R_MALLOC_FAILURE);
194 return NULL;
195 }
196
197 bag->type = OBJ_nid2obj(NID_pkcs8ShroudedKeyBag);
198 bag->value.shkeybag = p8;
199
200 return bag;
201}
202
203PKCS12_SAFEBAG *
204PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid, const char *pass, int passlen,
205 unsigned char *salt, int saltlen, int iter, PKCS8_PRIV_KEY_INFO *p8info)
206{
207 const EVP_CIPHER *pbe_ciph;
208 X509_SIG *p8;
209 PKCS12_SAFEBAG *bag;
210
211 if ((pbe_ciph = EVP_get_cipherbynid(pbe_nid)) != NULL)
212 pbe_nid = -1;
213
214 if ((p8 = PKCS8_encrypt(pbe_nid, pbe_ciph, pass, passlen, salt, saltlen,
215 iter, p8info)) == NULL)
216 return NULL;
217
218 if ((bag = PKCS12_SAFEBAG_create0_pkcs8(p8)) == NULL) {
219 X509_SIG_free(p8);
220 return NULL;
221 }
222
223 return bag;
224}
diff --git a/src/lib/libcrypto/pkcs12/p12_utl.c b/src/lib/libcrypto/pkcs12/p12_utl.c
index ff3a035d3f..8efe7a2653 100644
--- a/src/lib/libcrypto/pkcs12/p12_utl.c
+++ b/src/lib/libcrypto/pkcs12/p12_utl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: p12_utl.c,v 1.16 2018/05/30 15:32:11 tb Exp $ */ 1/* $OpenBSD: p12_utl.c,v 1.17 2022/08/03 20:16:06 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 */
@@ -148,6 +148,12 @@ d2i_PKCS12_fp(FILE *fp, PKCS12 **p12)
148 return ASN1_item_d2i_fp(&PKCS12_it, fp, p12); 148 return ASN1_item_d2i_fp(&PKCS12_it, fp, p12);
149} 149}
150 150
151#if !defined(LIBRESSL_NEXT_API)
152#undef PKCS12_x5092certbag
153#undef PKCS12_x509crl2certbag
154#undef PKCS12_certbag2x509
155#undef PKCS12_certbag2x509crl
156
151PKCS12_SAFEBAG * 157PKCS12_SAFEBAG *
152PKCS12_x5092certbag(X509 *x509) 158PKCS12_x5092certbag(X509 *x509)
153{ 159{
@@ -183,3 +189,4 @@ PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag)
183 return ASN1_item_unpack(bag->value.bag->value.octet, 189 return ASN1_item_unpack(bag->value.bag->value.octet,
184 &X509_CRL_it); 190 &X509_CRL_it);
185} 191}
192#endif
diff --git a/src/lib/libcrypto/pkcs12/pkcs12.h b/src/lib/libcrypto/pkcs12/pkcs12.h
index 920b4be202..a40659fcf3 100644
--- a/src/lib/libcrypto/pkcs12/pkcs12.h
+++ b/src/lib/libcrypto/pkcs12/pkcs12.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: pkcs12.h,v 1.25 2022/07/12 14:42:50 kn Exp $ */ 1/* $OpenBSD: pkcs12.h,v 1.26 2022/08/03 20:16:06 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 */
@@ -155,12 +155,63 @@ typedef struct pkcs12_bag_st {
155#define M_PKCS12_decrypt_skey PKCS12_decrypt_skey 155#define M_PKCS12_decrypt_skey PKCS12_decrypt_skey
156#define M_PKCS8_decrypt PKCS8_decrypt 156#define M_PKCS8_decrypt PKCS8_decrypt
157 157
158#if !defined(LIBRESSL_NEXT_API)
158#define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type) 159#define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type)
159#define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type) 160#define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type)
160#define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type 161#define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type
162#endif
161 163
162#endif /* !LIBRESSL_INTERNAL */ 164#endif /* !LIBRESSL_INTERNAL */
163 165
166#if defined(LIBRESSL_NEXT_API) || defined(LIBRESSL_INTERNAL)
167
168#define M_PKCS12_bag_type PKCS12_bag_type
169#define M_PKCS12_cert_bag_type PKCS12_cert_bag_type
170#define M_PKCS12_crl_bag_type PKCS12_cert_bag_type
171
172#define PKCS12_bag_type PKCS12_SAFEBAG_get_nid
173#define PKCS12_cert_bag_type PKCS12_SAFEBAG_get_bag_nid
174
175#define PKCS12_certbag2x509 PKCS12_SAFEBAG_get1_cert
176#define PKCS12_certbag2x509crl PKCS12_SAFEBAG_get1_crl
177
178#define PKCS12_x5092certbag PKCS12_SAFEBAG_create_cert
179#define PKCS12_x509crl2certbag PKCS12_SAFEBAG_create_crl
180#define PKCS12_MAKE_KEYBAG PKCS12_SAFEBAG_create0_p8inf
181#define PKCS12_MAKE_SHKEYBAG PKCS12_SAFEBAG_create_pkcs8_encrypt
182
183const ASN1_TYPE *PKCS12_SAFEBAG_get0_attr(const PKCS12_SAFEBAG *bag,
184 int attr_nid);
185const STACK_OF(X509_ATTRIBUTE) *
186 PKCS12_SAFEBAG_get0_attrs(const PKCS12_SAFEBAG *bag);
187int PKCS12_SAFEBAG_get_nid(const PKCS12_SAFEBAG *bag);
188int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag);
189
190X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag);
191X509_CRL *PKCS12_SAFEBAG_get1_crl(const PKCS12_SAFEBAG *bag);
192
193ASN1_TYPE *PKCS8_get_attr(PKCS8_PRIV_KEY_INFO *p8, int attr_nid);
194int PKCS12_mac_present(const PKCS12 *p12);
195void PKCS12_get0_mac(const ASN1_OCTET_STRING **pmac, const X509_ALGOR **pmacalg,
196 const ASN1_OCTET_STRING **psalt, const ASN1_INTEGER **piter,
197 const PKCS12 *p12);
198
199PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_cert(X509 *x509);
200PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl);
201PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8);
202PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_pkcs8(X509_SIG *p8);
203PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_pkcs8_encrypt(int pbe_nid,
204 const char *pass, int passlen, unsigned char *salt, int saltlen, int iter,
205 PKCS8_PRIV_KEY_INFO *p8);
206
207const PKCS8_PRIV_KEY_INFO *PKCS12_SAFEBAG_get0_p8inf(const PKCS12_SAFEBAG *bag);
208const X509_SIG *PKCS12_SAFEBAG_get0_pkcs8(const PKCS12_SAFEBAG *bag);
209const STACK_OF(PKCS12_SAFEBAG) *
210 PKCS12_SAFEBAG_get0_safes(const PKCS12_SAFEBAG *bag);
211const ASN1_OBJECT *PKCS12_SAFEBAG_get0_type(const PKCS12_SAFEBAG *bag);
212
213#else /* !LIBRESSL_NEXT_API && !LIBRESSL_INTERNAL*/
214
164#define PKCS12_get_attr(bag, attr_nid) \ 215#define PKCS12_get_attr(bag, attr_nid) \
165 PKCS12_get_attr_gen(bag->attrib, attr_nid) 216 PKCS12_get_attr_gen(bag->attrib, attr_nid)
166 217
@@ -169,15 +220,20 @@ typedef struct pkcs12_bag_st {
169 220
170#define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0) 221#define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0)
171 222
172
173PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509); 223PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509);
174PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl); 224PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl);
175X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag); 225X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag);
176X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag); 226X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag);
177 227
228PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8);
229PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass,
230 int passlen, unsigned char *salt, int saltlen, int iter,
231 PKCS8_PRIV_KEY_INFO *p8);
232
233#endif /* !LIBRESSL_NEXT_API && !LIBRESSL_INTERNAL */
234
178PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, 235PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it,
179 int nid1, int nid2); 236 int nid1, int nid2);
180PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8);
181PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass, 237PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(const X509_SIG *p8, const char *pass,
182 int passlen); 238 int passlen);
183PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag, 239PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag,
@@ -185,9 +241,6 @@ PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(const PKCS12_SAFEBAG *bag,
185X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, 241X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher,
186 const char *pass, int passlen, unsigned char *salt, int saltlen, int iter, 242 const char *pass, int passlen, unsigned char *salt, int saltlen, int iter,
187 PKCS8_PRIV_KEY_INFO *p8); 243 PKCS8_PRIV_KEY_INFO *p8);
188PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass,
189 int passlen, unsigned char *salt, int saltlen, int iter,
190 PKCS8_PRIV_KEY_INFO *p8);
191PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk); 244PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk);
192STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7); 245STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7);
193PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen, 246PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,