1*4a925a6aSbeck /* $OpenBSD: pem_pk8.c,v 1.14 2023/07/07 13:40:44 beck Exp $ */
2da347917Sbeck /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3da347917Sbeck * All rights reserved.
4da347917Sbeck *
5da347917Sbeck * This package is an SSL implementation written
6da347917Sbeck * by Eric Young (eay@cryptsoft.com).
7da347917Sbeck * The implementation was written so as to conform with Netscapes SSL.
8da347917Sbeck *
9da347917Sbeck * This library is free for commercial and non-commercial use as long as
10da347917Sbeck * the following conditions are aheared to. The following conditions
11da347917Sbeck * apply to all code found in this distribution, be it the RC4, RSA,
12da347917Sbeck * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13da347917Sbeck * included with this distribution is covered by the same copyright terms
14da347917Sbeck * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15da347917Sbeck *
16da347917Sbeck * Copyright remains Eric Young's, and as such any Copyright notices in
17da347917Sbeck * the code are not to be removed.
18da347917Sbeck * If this package is used in a product, Eric Young should be given attribution
19da347917Sbeck * as the author of the parts of the library used.
20da347917Sbeck * This can be in the form of a textual message at program startup or
21da347917Sbeck * in documentation (online or textual) provided with the package.
22da347917Sbeck *
23da347917Sbeck * Redistribution and use in source and binary forms, with or without
24da347917Sbeck * modification, are permitted provided that the following conditions
25da347917Sbeck * are met:
26da347917Sbeck * 1. Redistributions of source code must retain the copyright
27da347917Sbeck * notice, this list of conditions and the following disclaimer.
28da347917Sbeck * 2. Redistributions in binary form must reproduce the above copyright
29da347917Sbeck * notice, this list of conditions and the following disclaimer in the
30da347917Sbeck * documentation and/or other materials provided with the distribution.
31da347917Sbeck * 3. All advertising materials mentioning features or use of this software
32da347917Sbeck * must display the following acknowledgement:
33da347917Sbeck * "This product includes cryptographic software written by
34da347917Sbeck * Eric Young (eay@cryptsoft.com)"
35da347917Sbeck * The word 'cryptographic' can be left out if the rouines from the library
36da347917Sbeck * being used are not cryptographic related :-).
37da347917Sbeck * 4. If you include any Windows specific code (or a derivative thereof) from
38da347917Sbeck * the apps directory (application code) you must include an acknowledgement:
39da347917Sbeck * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40da347917Sbeck *
41da347917Sbeck * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42da347917Sbeck * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43da347917Sbeck * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44da347917Sbeck * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45da347917Sbeck * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46da347917Sbeck * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47da347917Sbeck * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48da347917Sbeck * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49da347917Sbeck * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50da347917Sbeck * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51da347917Sbeck * SUCH DAMAGE.
52da347917Sbeck *
53da347917Sbeck * The licence and distribution terms for any publically available version or
54da347917Sbeck * derivative of this code cannot be changed. i.e. this code cannot simply be
55da347917Sbeck * copied and put under another distribution licence
56da347917Sbeck * [including the GNU Public Licence.]
57da347917Sbeck */
58da347917Sbeck
59da347917Sbeck #include <stdio.h>
600f777b12Sjsing #include <string.h>
61b6ab114eSjsing
62da347917Sbeck #include <openssl/buffer.h>
63b6ab114eSjsing #include <openssl/err.h>
64da347917Sbeck #include <openssl/evp.h>
65b6ab114eSjsing #include <openssl/objects.h>
66b6ab114eSjsing #include <openssl/pem.h>
67b6ab114eSjsing #include <openssl/pkcs12.h>
68da347917Sbeck #include <openssl/x509.h>
69da347917Sbeck
70a8b5ceceSjsing static int do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid,
71a8b5ceceSjsing const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u);
72a8b5ceceSjsing static int do_pk8pkey_fp(FILE *bp, EVP_PKEY *x, int isder, int nid,
73a8b5ceceSjsing const EVP_CIPHER *enc, char *kstr, int klen, pem_password_cb *cb, void *u);
74da347917Sbeck
75da347917Sbeck /* These functions write a private key in PKCS#8 format: it is a "drop in"
76da347917Sbeck * replacement for PEM_write_bio_PrivateKey() and friends. As usual if 'enc'
77da347917Sbeck * is NULL then it uses the unencrypted private key form. The 'nid' versions
78da347917Sbeck * uses PKCS#5 v1.5 PBE algorithms whereas the others use PKCS#5 v2.0.
79da347917Sbeck */
80da347917Sbeck
81a8b5ceceSjsing int
PEM_write_bio_PKCS8PrivateKey_nid(BIO * bp,EVP_PKEY * x,int nid,char * kstr,int klen,pem_password_cb * cb,void * u)82a8b5ceceSjsing PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid, char *kstr,
83a8b5ceceSjsing int klen, pem_password_cb *cb, void *u)
84da347917Sbeck {
85da347917Sbeck return do_pk8pkey(bp, x, 0, nid, NULL, kstr, klen, cb, u);
86da347917Sbeck }
87*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_PKCS8PrivateKey_nid);
88da347917Sbeck
89a8b5ceceSjsing int
PEM_write_bio_PKCS8PrivateKey(BIO * bp,EVP_PKEY * x,const EVP_CIPHER * enc,char * kstr,int klen,pem_password_cb * cb,void * u)90a8b5ceceSjsing PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
91a8b5ceceSjsing char *kstr, int klen, pem_password_cb *cb, void *u)
92da347917Sbeck {
93da347917Sbeck return do_pk8pkey(bp, x, 0, -1, enc, kstr, klen, cb, u);
94da347917Sbeck }
95*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_PKCS8PrivateKey);
96da347917Sbeck
97a8b5ceceSjsing int
i2d_PKCS8PrivateKey_bio(BIO * bp,EVP_PKEY * x,const EVP_CIPHER * enc,char * kstr,int klen,pem_password_cb * cb,void * u)98a8b5ceceSjsing i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
99a8b5ceceSjsing char *kstr, int klen, pem_password_cb *cb, void *u)
100da347917Sbeck {
101da347917Sbeck return do_pk8pkey(bp, x, 1, -1, enc, kstr, klen, cb, u);
102da347917Sbeck }
103*4a925a6aSbeck LCRYPTO_ALIAS(i2d_PKCS8PrivateKey_bio);
104da347917Sbeck
105a8b5ceceSjsing int
i2d_PKCS8PrivateKey_nid_bio(BIO * bp,EVP_PKEY * x,int nid,char * kstr,int klen,pem_password_cb * cb,void * u)106a8b5ceceSjsing i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid,
107a8b5ceceSjsing char *kstr, int klen, pem_password_cb *cb, void *u)
108da347917Sbeck {
109da347917Sbeck return do_pk8pkey(bp, x, 1, nid, NULL, kstr, klen, cb, u);
110da347917Sbeck }
111*4a925a6aSbeck LCRYPTO_ALIAS(i2d_PKCS8PrivateKey_nid_bio);
112da347917Sbeck
113a8b5ceceSjsing static int
do_pk8pkey(BIO * bp,EVP_PKEY * x,int isder,int nid,const EVP_CIPHER * enc,char * kstr,int klen,pem_password_cb * cb,void * u)114a8b5ceceSjsing do_pk8pkey(BIO *bp, EVP_PKEY *x, int isder, int nid, const EVP_CIPHER *enc,
115a8b5ceceSjsing char *kstr, int klen, pem_password_cb *cb, void *u)
116da347917Sbeck {
117da347917Sbeck X509_SIG *p8;
118da347917Sbeck PKCS8_PRIV_KEY_INFO *p8inf;
119da347917Sbeck char buf[PEM_BUFSIZE];
120da347917Sbeck int ret;
121a8b5ceceSjsing
122da347917Sbeck if (!(p8inf = EVP_PKEY2PKCS8(x))) {
1235067ae9fSbeck PEMerror(PEM_R_ERROR_CONVERTING_PRIVATE_KEY);
124da347917Sbeck return 0;
125da347917Sbeck }
126da347917Sbeck if (enc || (nid != -1)) {
127da347917Sbeck if (!kstr) {
128a8b5ceceSjsing if (!cb)
129a8b5ceceSjsing klen = PEM_def_callback(buf, PEM_BUFSIZE, 1, u);
130a8b5ceceSjsing else
131a8b5ceceSjsing klen = cb(buf, PEM_BUFSIZE, 1, u);
132da347917Sbeck if (klen <= 0) {
1335067ae9fSbeck PEMerror(PEM_R_READ_KEY);
134da347917Sbeck PKCS8_PRIV_KEY_INFO_free(p8inf);
135da347917Sbeck return 0;
136da347917Sbeck }
137da347917Sbeck
138da347917Sbeck kstr = buf;
139da347917Sbeck }
140da347917Sbeck p8 = PKCS8_encrypt(nid, enc, kstr, klen, NULL, 0, 0, p8inf);
141a8b5ceceSjsing if (kstr == buf)
1420f777b12Sjsing explicit_bzero(buf, klen);
143da347917Sbeck PKCS8_PRIV_KEY_INFO_free(p8inf);
144a8b5ceceSjsing if (isder)
145a8b5ceceSjsing ret = i2d_PKCS8_bio(bp, p8);
146a8b5ceceSjsing else
147a8b5ceceSjsing ret = PEM_write_bio_PKCS8(bp, p8);
148da347917Sbeck X509_SIG_free(p8);
149da347917Sbeck return ret;
150da347917Sbeck } else {
151a8b5ceceSjsing if (isder)
152a8b5ceceSjsing ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
153a8b5ceceSjsing else
154a8b5ceceSjsing ret = PEM_write_bio_PKCS8_PRIV_KEY_INFO(bp, p8inf);
155da347917Sbeck PKCS8_PRIV_KEY_INFO_free(p8inf);
156da347917Sbeck return ret;
157da347917Sbeck }
158da347917Sbeck }
159da347917Sbeck
160a8b5ceceSjsing EVP_PKEY *
d2i_PKCS8PrivateKey_bio(BIO * bp,EVP_PKEY ** x,pem_password_cb * cb,void * u)161a8b5ceceSjsing d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u)
162da347917Sbeck {
163da347917Sbeck PKCS8_PRIV_KEY_INFO *p8inf = NULL;
164da347917Sbeck X509_SIG *p8 = NULL;
165da347917Sbeck int klen;
166da347917Sbeck EVP_PKEY *ret;
167da347917Sbeck char psbuf[PEM_BUFSIZE];
168a8b5ceceSjsing
169da347917Sbeck p8 = d2i_PKCS8_bio(bp, NULL);
170a8b5ceceSjsing if (!p8)
171a8b5ceceSjsing return NULL;
172a8b5ceceSjsing if (cb)
173a8b5ceceSjsing klen = cb(psbuf, PEM_BUFSIZE, 0, u);
174a8b5ceceSjsing else
175a8b5ceceSjsing klen = PEM_def_callback(psbuf, PEM_BUFSIZE, 0, u);
176da347917Sbeck if (klen <= 0) {
1775067ae9fSbeck PEMerror(PEM_R_BAD_PASSWORD_READ);
178da347917Sbeck X509_SIG_free(p8);
179da347917Sbeck return NULL;
180da347917Sbeck }
181da347917Sbeck p8inf = PKCS8_decrypt(p8, psbuf, klen);
182da347917Sbeck X509_SIG_free(p8);
183a8b5ceceSjsing if (!p8inf)
184a8b5ceceSjsing return NULL;
185da347917Sbeck ret = EVP_PKCS82PKEY(p8inf);
186da347917Sbeck PKCS8_PRIV_KEY_INFO_free(p8inf);
187a8b5ceceSjsing if (!ret)
188a8b5ceceSjsing return NULL;
189da347917Sbeck if (x) {
190a8b5ceceSjsing EVP_PKEY_free(*x);
191da347917Sbeck *x = ret;
192da347917Sbeck }
193da347917Sbeck return ret;
194da347917Sbeck }
195*4a925a6aSbeck LCRYPTO_ALIAS(d2i_PKCS8PrivateKey_bio);
196da347917Sbeck
197da347917Sbeck
198a8b5ceceSjsing int
i2d_PKCS8PrivateKey_fp(FILE * fp,EVP_PKEY * x,const EVP_CIPHER * enc,char * kstr,int klen,pem_password_cb * cb,void * u)199a8b5ceceSjsing i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
200a8b5ceceSjsing char *kstr, int klen, pem_password_cb *cb, void *u)
201da347917Sbeck {
202da347917Sbeck return do_pk8pkey_fp(fp, x, 1, -1, enc, kstr, klen, cb, u);
203da347917Sbeck }
204*4a925a6aSbeck LCRYPTO_ALIAS(i2d_PKCS8PrivateKey_fp);
205da347917Sbeck
206a8b5ceceSjsing int
i2d_PKCS8PrivateKey_nid_fp(FILE * fp,EVP_PKEY * x,int nid,char * kstr,int klen,pem_password_cb * cb,void * u)207a8b5ceceSjsing i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid, char *kstr,
208a8b5ceceSjsing int klen, pem_password_cb *cb, void *u)
209da347917Sbeck {
210da347917Sbeck return do_pk8pkey_fp(fp, x, 1, nid, NULL, kstr, klen, cb, u);
211da347917Sbeck }
212*4a925a6aSbeck LCRYPTO_ALIAS(i2d_PKCS8PrivateKey_nid_fp);
213da347917Sbeck
214a8b5ceceSjsing int
PEM_write_PKCS8PrivateKey_nid(FILE * fp,EVP_PKEY * x,int nid,char * kstr,int klen,pem_password_cb * cb,void * u)215a8b5ceceSjsing PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid, char *kstr,
216a8b5ceceSjsing int klen, pem_password_cb *cb, void *u)
217da347917Sbeck {
218da347917Sbeck return do_pk8pkey_fp(fp, x, 0, nid, NULL, kstr, klen, cb, u);
219da347917Sbeck }
220*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_PKCS8PrivateKey_nid);
221da347917Sbeck
222a8b5ceceSjsing int
PEM_write_PKCS8PrivateKey(FILE * fp,EVP_PKEY * x,const EVP_CIPHER * enc,char * kstr,int klen,pem_password_cb * cb,void * u)223a8b5ceceSjsing PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
224da347917Sbeck char *kstr, int klen, pem_password_cb *cb, void *u)
225da347917Sbeck {
226da347917Sbeck return do_pk8pkey_fp(fp, x, 0, -1, enc, kstr, klen, cb, u);
227da347917Sbeck }
228*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_PKCS8PrivateKey);
229da347917Sbeck
230a8b5ceceSjsing static int
do_pk8pkey_fp(FILE * fp,EVP_PKEY * x,int isder,int nid,const EVP_CIPHER * enc,char * kstr,int klen,pem_password_cb * cb,void * u)231a8b5ceceSjsing do_pk8pkey_fp(FILE *fp, EVP_PKEY *x, int isder, int nid, const EVP_CIPHER *enc,
232a8b5ceceSjsing char *kstr, int klen, pem_password_cb *cb, void *u)
233da347917Sbeck {
234da347917Sbeck BIO *bp;
235da347917Sbeck int ret;
236a8b5ceceSjsing
237da347917Sbeck if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
2385067ae9fSbeck PEMerror(ERR_R_BUF_LIB);
239da347917Sbeck return (0);
240da347917Sbeck }
241da347917Sbeck ret = do_pk8pkey(bp, x, isder, nid, enc, kstr, klen, cb, u);
242da347917Sbeck BIO_free(bp);
243da347917Sbeck return ret;
244da347917Sbeck }
245da347917Sbeck
246a8b5ceceSjsing EVP_PKEY *
d2i_PKCS8PrivateKey_fp(FILE * fp,EVP_PKEY ** x,pem_password_cb * cb,void * u)247a8b5ceceSjsing d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u)
248da347917Sbeck {
249da347917Sbeck BIO *bp;
250da347917Sbeck EVP_PKEY *ret;
251a8b5ceceSjsing
252da347917Sbeck if (!(bp = BIO_new_fp(fp, BIO_NOCLOSE))) {
2535067ae9fSbeck PEMerror(ERR_R_BUF_LIB);
254da347917Sbeck return NULL;
255da347917Sbeck }
256da347917Sbeck ret = d2i_PKCS8PrivateKey_bio(bp, x, cb, u);
257da347917Sbeck BIO_free(bp);
258da347917Sbeck return ret;
259da347917Sbeck }
260*4a925a6aSbeck LCRYPTO_ALIAS(d2i_PKCS8PrivateKey_fp);
261da347917Sbeck
26200ad794dSjsing X509_SIG *
PEM_read_PKCS8(FILE * fp,X509_SIG ** x,pem_password_cb * cb,void * u)26300ad794dSjsing PEM_read_PKCS8(FILE *fp, X509_SIG **x, pem_password_cb *cb, void *u)
26400ad794dSjsing {
26500ad794dSjsing return PEM_ASN1_read((d2i_of_void *)d2i_X509_SIG, PEM_STRING_PKCS8, fp,
26600ad794dSjsing (void **)x, cb, u);
26700ad794dSjsing }
268*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_PKCS8);
269da347917Sbeck
27000ad794dSjsing int
PEM_write_PKCS8(FILE * fp,X509_SIG * x)27100ad794dSjsing PEM_write_PKCS8(FILE *fp, X509_SIG *x)
27200ad794dSjsing {
27300ad794dSjsing return PEM_ASN1_write((i2d_of_void *)i2d_X509_SIG, PEM_STRING_PKCS8, fp,
27400ad794dSjsing x, NULL, NULL, 0, NULL, NULL);
27500ad794dSjsing }
276*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_PKCS8);
277e4ea9340Sjsing
278e4ea9340Sjsing X509_SIG *
PEM_read_bio_PKCS8(BIO * bp,X509_SIG ** x,pem_password_cb * cb,void * u)279e4ea9340Sjsing PEM_read_bio_PKCS8(BIO *bp, X509_SIG **x, pem_password_cb *cb, void *u)
280e4ea9340Sjsing {
281e4ea9340Sjsing return PEM_ASN1_read_bio((d2i_of_void *)d2i_X509_SIG, PEM_STRING_PKCS8, bp,
282e4ea9340Sjsing (void **)x, cb, u);
283e4ea9340Sjsing }
284*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_PKCS8);
285e4ea9340Sjsing
286e4ea9340Sjsing int
PEM_write_bio_PKCS8(BIO * bp,X509_SIG * x)287e4ea9340Sjsing PEM_write_bio_PKCS8(BIO *bp, X509_SIG *x)
288e4ea9340Sjsing {
289e4ea9340Sjsing return PEM_ASN1_write_bio((i2d_of_void *)i2d_X509_SIG, PEM_STRING_PKCS8, bp,
290e4ea9340Sjsing x, NULL, NULL, 0, NULL, NULL);
291e4ea9340Sjsing }
292*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_PKCS8);
293e4ea9340Sjsing
29400ad794dSjsing PKCS8_PRIV_KEY_INFO *
PEM_read_PKCS8_PRIV_KEY_INFO(FILE * fp,PKCS8_PRIV_KEY_INFO ** x,pem_password_cb * cb,void * u)29500ad794dSjsing PEM_read_PKCS8_PRIV_KEY_INFO(FILE *fp, PKCS8_PRIV_KEY_INFO **x, pem_password_cb *cb, void *u)
296e4ea9340Sjsing {
29700ad794dSjsing return PEM_ASN1_read((d2i_of_void *)d2i_PKCS8_PRIV_KEY_INFO, PEM_STRING_PKCS8INF, fp,
29800ad794dSjsing (void **)x, cb, u);
29900ad794dSjsing }
300*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_PKCS8_PRIV_KEY_INFO);
30100ad794dSjsing
30200ad794dSjsing int
PEM_write_PKCS8_PRIV_KEY_INFO(FILE * fp,PKCS8_PRIV_KEY_INFO * x)30300ad794dSjsing PEM_write_PKCS8_PRIV_KEY_INFO(FILE *fp, PKCS8_PRIV_KEY_INFO *x)
30400ad794dSjsing {
30500ad794dSjsing return PEM_ASN1_write((i2d_of_void *)i2d_PKCS8_PRIV_KEY_INFO, PEM_STRING_PKCS8INF, fp,
306e4ea9340Sjsing x, NULL, NULL, 0, NULL, NULL);
307e4ea9340Sjsing }
308*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_PKCS8_PRIV_KEY_INFO);
309e4ea9340Sjsing
310e4ea9340Sjsing PKCS8_PRIV_KEY_INFO *
PEM_read_bio_PKCS8_PRIV_KEY_INFO(BIO * bp,PKCS8_PRIV_KEY_INFO ** x,pem_password_cb * cb,void * u)311e4ea9340Sjsing PEM_read_bio_PKCS8_PRIV_KEY_INFO(BIO *bp, PKCS8_PRIV_KEY_INFO **x, pem_password_cb *cb, void *u)
312e4ea9340Sjsing {
313e4ea9340Sjsing return PEM_ASN1_read_bio((d2i_of_void *)d2i_PKCS8_PRIV_KEY_INFO, PEM_STRING_PKCS8INF, bp,
314e4ea9340Sjsing (void **)x, cb, u);
315e4ea9340Sjsing }
316*4a925a6aSbeck LCRYPTO_ALIAS(PEM_read_bio_PKCS8_PRIV_KEY_INFO);
317e4ea9340Sjsing
318e4ea9340Sjsing int
PEM_write_bio_PKCS8_PRIV_KEY_INFO(BIO * bp,PKCS8_PRIV_KEY_INFO * x)319e4ea9340Sjsing PEM_write_bio_PKCS8_PRIV_KEY_INFO(BIO *bp, PKCS8_PRIV_KEY_INFO *x)
320e4ea9340Sjsing {
321e4ea9340Sjsing return PEM_ASN1_write_bio((i2d_of_void *)i2d_PKCS8_PRIV_KEY_INFO, PEM_STRING_PKCS8INF, bp,
322e4ea9340Sjsing x, NULL, NULL, 0, NULL, NULL);
323e4ea9340Sjsing }
324*4a925a6aSbeck LCRYPTO_ALIAS(PEM_write_bio_PKCS8_PRIV_KEY_INFO);
325