]> git.ipfire.org Git - thirdparty/openssl.git/blame - doc/man3/PEM_read_bio_PrivateKey.pod
Make manuals with TYPE conform with man-pages(7)
[thirdparty/openssl.git] / doc / man3 / PEM_read_bio_PrivateKey.pod
CommitLineData
a29d78e9
DSH
1=pod
2
3=head1 NAME
4
91da5e77 5pem_password_cb,
c952780c 6PEM_read_bio_PrivateKey, PEM_read_PrivateKey, PEM_write_bio_PrivateKey,
05dba815
DSH
7PEM_write_bio_PrivateKey_traditional, PEM_write_PrivateKey,
8PEM_write_bio_PKCS8PrivateKey, PEM_write_PKCS8PrivateKey,
f097f81c
DSH
9PEM_write_bio_PKCS8PrivateKey_nid, PEM_write_PKCS8PrivateKey_nid,
10PEM_read_bio_PUBKEY, PEM_read_PUBKEY, PEM_write_bio_PUBKEY, PEM_write_PUBKEY,
11PEM_read_bio_RSAPrivateKey, PEM_read_RSAPrivateKey,
12PEM_write_bio_RSAPrivateKey, PEM_write_RSAPrivateKey,
13PEM_read_bio_RSAPublicKey, PEM_read_RSAPublicKey, PEM_write_bio_RSAPublicKey,
14PEM_write_RSAPublicKey, PEM_read_bio_RSA_PUBKEY, PEM_read_RSA_PUBKEY,
15PEM_write_bio_RSA_PUBKEY, PEM_write_RSA_PUBKEY, PEM_read_bio_DSAPrivateKey,
16PEM_read_DSAPrivateKey, PEM_write_bio_DSAPrivateKey, PEM_write_DSAPrivateKey,
17PEM_read_bio_DSA_PUBKEY, PEM_read_DSA_PUBKEY, PEM_write_bio_DSA_PUBKEY,
18PEM_write_DSA_PUBKEY, PEM_read_bio_DSAparams, PEM_read_DSAparams,
19PEM_write_bio_DSAparams, PEM_write_DSAparams, PEM_read_bio_DHparams,
20PEM_read_DHparams, PEM_write_bio_DHparams, PEM_write_DHparams,
21PEM_read_bio_X509, PEM_read_X509, PEM_write_bio_X509, PEM_write_X509,
22PEM_read_bio_X509_AUX, PEM_read_X509_AUX, PEM_write_bio_X509_AUX,
23PEM_write_X509_AUX, PEM_read_bio_X509_REQ, PEM_read_X509_REQ,
24PEM_write_bio_X509_REQ, PEM_write_X509_REQ, PEM_write_bio_X509_REQ_NEW,
25PEM_write_X509_REQ_NEW, PEM_read_bio_X509_CRL, PEM_read_X509_CRL,
26PEM_write_bio_X509_CRL, PEM_write_X509_CRL, PEM_read_bio_PKCS7, PEM_read_PKCS7,
a0474357 27PEM_write_bio_PKCS7, PEM_write_PKCS7 - PEM routines
a29d78e9
DSH
28
29=head1 SYNOPSIS
30
31 #include <openssl/pem.h>
32
5bf6d418 33 typedef int pem_password_cb(char *buf, int size, int rwflag, void *u);
91da5e77 34
a29d78e9 35 EVP_PKEY *PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x,
a0474357 36 pem_password_cb *cb, void *u);
a29d78e9 37 EVP_PKEY *PEM_read_PrivateKey(FILE *fp, EVP_PKEY **x,
a0474357 38 pem_password_cb *cb, void *u);
9fdcc21f 39 int PEM_write_bio_PrivateKey(BIO *bp, const EVP_PKEY *x, const EVP_CIPHER *enc,
a0474357
RS
40 unsigned char *kstr, int klen,
41 pem_password_cb *cb, void *u);
05dba815
DSH
42 int PEM_write_bio_PrivateKey_traditional(BIO *bp, EVP_PKEY *x,
43 const EVP_CIPHER *enc,
44 unsigned char *kstr, int klen,
45 pem_password_cb *cb, void *u);
a29d78e9 46 int PEM_write_PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
a0474357
RS
47 unsigned char *kstr, int klen,
48 pem_password_cb *cb, void *u);
a29d78e9 49 int PEM_write_bio_PKCS8PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
a0474357
RS
50 char *kstr, int klen,
51 pem_password_cb *cb, void *u);
a29d78e9 52 int PEM_write_PKCS8PrivateKey(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
a0474357
RS
53 char *kstr, int klen,
54 pem_password_cb *cb, void *u);
9fdcc21f 55 int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, const EVP_PKEY *x, int nid,
a0474357
RS
56 char *kstr, int klen,
57 pem_password_cb *cb, void *u);
9fdcc21f 58 int PEM_write_PKCS8PrivateKey_nid(FILE *fp, const EVP_PKEY *x, int nid,
a0474357
RS
59 char *kstr, int klen,
60 pem_password_cb *cb, void *u);
a29d78e9
DSH
61
62 EVP_PKEY *PEM_read_bio_PUBKEY(BIO *bp, EVP_PKEY **x,
a0474357 63 pem_password_cb *cb, void *u);
a29d78e9 64 EVP_PKEY *PEM_read_PUBKEY(FILE *fp, EVP_PKEY **x,
a0474357 65 pem_password_cb *cb, void *u);
a29d78e9
DSH
66 int PEM_write_bio_PUBKEY(BIO *bp, EVP_PKEY *x);
67 int PEM_write_PUBKEY(FILE *fp, EVP_PKEY *x);
68
69 RSA *PEM_read_bio_RSAPrivateKey(BIO *bp, RSA **x,
a0474357 70 pem_password_cb *cb, void *u);
a29d78e9 71 RSA *PEM_read_RSAPrivateKey(FILE *fp, RSA **x,
a0474357 72 pem_password_cb *cb, void *u);
a29d78e9 73 int PEM_write_bio_RSAPrivateKey(BIO *bp, RSA *x, const EVP_CIPHER *enc,
a0474357
RS
74 unsigned char *kstr, int klen,
75 pem_password_cb *cb, void *u);
a29d78e9 76 int PEM_write_RSAPrivateKey(FILE *fp, RSA *x, const EVP_CIPHER *enc,
a0474357
RS
77 unsigned char *kstr, int klen,
78 pem_password_cb *cb, void *u);
a29d78e9
DSH
79
80 RSA *PEM_read_bio_RSAPublicKey(BIO *bp, RSA **x,
a0474357 81 pem_password_cb *cb, void *u);
a29d78e9 82 RSA *PEM_read_RSAPublicKey(FILE *fp, RSA **x,
a0474357 83 pem_password_cb *cb, void *u);
a29d78e9 84 int PEM_write_bio_RSAPublicKey(BIO *bp, RSA *x);
a29d78e9
DSH
85 int PEM_write_RSAPublicKey(FILE *fp, RSA *x);
86
87 RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x,
a0474357 88 pem_password_cb *cb, void *u);
a29d78e9 89 RSA *PEM_read_RSA_PUBKEY(FILE *fp, RSA **x,
a0474357 90 pem_password_cb *cb, void *u);
a29d78e9 91 int PEM_write_bio_RSA_PUBKEY(BIO *bp, RSA *x);
a29d78e9
DSH
92 int PEM_write_RSA_PUBKEY(FILE *fp, RSA *x);
93
94 DSA *PEM_read_bio_DSAPrivateKey(BIO *bp, DSA **x,
a0474357 95 pem_password_cb *cb, void *u);
a29d78e9 96 DSA *PEM_read_DSAPrivateKey(FILE *fp, DSA **x,
a0474357 97 pem_password_cb *cb, void *u);
a29d78e9 98 int PEM_write_bio_DSAPrivateKey(BIO *bp, DSA *x, const EVP_CIPHER *enc,
a0474357
RS
99 unsigned char *kstr, int klen,
100 pem_password_cb *cb, void *u);
a29d78e9 101 int PEM_write_DSAPrivateKey(FILE *fp, DSA *x, const EVP_CIPHER *enc,
a0474357
RS
102 unsigned char *kstr, int klen,
103 pem_password_cb *cb, void *u);
a29d78e9
DSH
104
105 DSA *PEM_read_bio_DSA_PUBKEY(BIO *bp, DSA **x,
a0474357 106 pem_password_cb *cb, void *u);
a29d78e9 107 DSA *PEM_read_DSA_PUBKEY(FILE *fp, DSA **x,
a0474357 108 pem_password_cb *cb, void *u);
a29d78e9 109 int PEM_write_bio_DSA_PUBKEY(BIO *bp, DSA *x);
a29d78e9
DSH
110 int PEM_write_DSA_PUBKEY(FILE *fp, DSA *x);
111
112 DSA *PEM_read_bio_DSAparams(BIO *bp, DSA **x, pem_password_cb *cb, void *u);
a29d78e9 113 DSA *PEM_read_DSAparams(FILE *fp, DSA **x, pem_password_cb *cb, void *u);
a29d78e9 114 int PEM_write_bio_DSAparams(BIO *bp, DSA *x);
a29d78e9
DSH
115 int PEM_write_DSAparams(FILE *fp, DSA *x);
116
117 DH *PEM_read_bio_DHparams(BIO *bp, DH **x, pem_password_cb *cb, void *u);
a29d78e9 118 DH *PEM_read_DHparams(FILE *fp, DH **x, pem_password_cb *cb, void *u);
a29d78e9 119 int PEM_write_bio_DHparams(BIO *bp, DH *x);
a29d78e9
DSH
120 int PEM_write_DHparams(FILE *fp, DH *x);
121
122 X509 *PEM_read_bio_X509(BIO *bp, X509 **x, pem_password_cb *cb, void *u);
a29d78e9 123 X509 *PEM_read_X509(FILE *fp, X509 **x, pem_password_cb *cb, void *u);
a29d78e9 124 int PEM_write_bio_X509(BIO *bp, X509 *x);
a29d78e9
DSH
125 int PEM_write_X509(FILE *fp, X509 *x);
126
127 X509 *PEM_read_bio_X509_AUX(BIO *bp, X509 **x, pem_password_cb *cb, void *u);
a29d78e9 128 X509 *PEM_read_X509_AUX(FILE *fp, X509 **x, pem_password_cb *cb, void *u);
a29d78e9 129 int PEM_write_bio_X509_AUX(BIO *bp, X509 *x);
a29d78e9
DSH
130 int PEM_write_X509_AUX(FILE *fp, X509 *x);
131
132 X509_REQ *PEM_read_bio_X509_REQ(BIO *bp, X509_REQ **x,
a0474357 133 pem_password_cb *cb, void *u);
a29d78e9 134 X509_REQ *PEM_read_X509_REQ(FILE *fp, X509_REQ **x,
a0474357 135 pem_password_cb *cb, void *u);
a29d78e9 136 int PEM_write_bio_X509_REQ(BIO *bp, X509_REQ *x);
a29d78e9 137 int PEM_write_X509_REQ(FILE *fp, X509_REQ *x);
a29d78e9 138 int PEM_write_bio_X509_REQ_NEW(BIO *bp, X509_REQ *x);
a29d78e9
DSH
139 int PEM_write_X509_REQ_NEW(FILE *fp, X509_REQ *x);
140
141 X509_CRL *PEM_read_bio_X509_CRL(BIO *bp, X509_CRL **x,
a0474357 142 pem_password_cb *cb, void *u);
a29d78e9 143 X509_CRL *PEM_read_X509_CRL(FILE *fp, X509_CRL **x,
a0474357 144 pem_password_cb *cb, void *u);
a29d78e9
DSH
145 int PEM_write_bio_X509_CRL(BIO *bp, X509_CRL *x);
146 int PEM_write_X509_CRL(FILE *fp, X509_CRL *x);
147
148 PKCS7 *PEM_read_bio_PKCS7(BIO *bp, PKCS7 **x, pem_password_cb *cb, void *u);
a29d78e9 149 PKCS7 *PEM_read_PKCS7(FILE *fp, PKCS7 **x, pem_password_cb *cb, void *u);
a29d78e9 150 int PEM_write_bio_PKCS7(BIO *bp, PKCS7 *x);
a29d78e9
DSH
151 int PEM_write_PKCS7(FILE *fp, PKCS7 *x);
152
a29d78e9
DSH
153=head1 DESCRIPTION
154
155The PEM functions read or write structures in PEM format. In
156this sense PEM format is simply base64 encoded data surrounded
157by header lines.
158
159For more details about the meaning of arguments see the
160B<PEM FUNCTION ARGUMENTS> section.
161
162Each operation has four functions associated with it. For
bbecf04e
RL
163brevity the term "B<I<TYPE>> functions" will be used below to collectively
164refer to the B<PEM_read_bio_I<TYPE>>(), B<PEM_read_I<TYPE>>(),
165B<PEM_write_bio_I<TYPE>>(), and B<PEM_write_I<TYPE>>() functions.
a29d78e9 166
05dba815
DSH
167The B<PrivateKey> functions read or write a private key in PEM format using an
168EVP_PKEY structure. The write routines use PKCS#8 private key format and are
169equivalent to PEM_write_bio_PKCS8PrivateKey().The read functions transparently
170handle traditional and PKCS#8 format encrypted and unencrypted keys.
a29d78e9 171
a95d7574
RS
172PEM_write_bio_PrivateKey_traditional() writes out a private key in the
173"traditional" format with a simple private key marker and should only
174be used for compatibility with legacy programs.
05dba815
DSH
175
176PEM_write_bio_PKCS8PrivateKey() and PEM_write_PKCS8PrivateKey() write a private
177key in an EVP_PKEY structure in PKCS#8 EncryptedPrivateKeyInfo format using
bbecf04e 178PKCS#5 v2.0 password based encryption algorithms. The I<cipher> argument
05dba815
DSH
179specifies the encryption algorithm to use: unlike some other PEM routines the
180encryption is applied at the PKCS#8 level and not in the PEM headers. If
bbecf04e 181I<cipher> is NULL then no encryption is used and a PKCS#8 PrivateKeyInfo
05dba815 182structure is used instead.
a29d78e9
DSH
183
184PEM_write_bio_PKCS8PrivateKey_nid() and PEM_write_PKCS8PrivateKey_nid()
185also write out a private key as a PKCS#8 EncryptedPrivateKeyInfo however
186it uses PKCS#5 v1.5 or PKCS#12 encryption algorithms instead. The algorithm
bbecf04e 187to use is specified in the I<nid> parameter and should be the NID of the
a29d78e9
DSH
188corresponding OBJECT IDENTIFIER (see NOTES section).
189
190The B<PUBKEY> functions process a public key using an EVP_PKEY
191structure. The public key is encoded as a SubjectPublicKeyInfo
192structure.
193
194The B<RSAPrivateKey> functions process an RSA private key using an
05dba815
DSH
195RSA structure. The write routines uses traditional format. The read
196routines handles the same formats as the B<PrivateKey>
a29d78e9
DSH
197functions but an error occurs if the private key is not RSA.
198
199The B<RSAPublicKey> functions process an RSA public key using an
200RSA structure. The public key is encoded using a PKCS#1 RSAPublicKey
201structure.
202
203The B<RSA_PUBKEY> functions also process an RSA public key using
204an RSA structure. However the public key is encoded using a
205SubjectPublicKeyInfo structure and an error occurs if the public
206key is not RSA.
207
208The B<DSAPrivateKey> functions process a DSA private key using a
05dba815
DSH
209DSA structure. The write routines uses traditional format. The read
210routines handles the same formats as the B<PrivateKey>
a29d78e9
DSH
211functions but an error occurs if the private key is not DSA.
212
213The B<DSA_PUBKEY> functions process a DSA public key using
214a DSA structure. The public key is encoded using a
215SubjectPublicKeyInfo structure and an error occurs if the public
216key is not DSA.
217
218The B<DSAparams> functions process DSA parameters using a DSA
f097f81c
DSH
219structure. The parameters are encoded using a Dss-Parms structure
220as defined in RFC2459.
a29d78e9
DSH
221
222The B<DHparams> functions process DH parameters using a DH
223structure. The parameters are encoded using a PKCS#3 DHparameter
224structure.
225
226The B<X509> functions process an X509 certificate using an X509
227structure. They will also process a trusted X509 certificate but
228any trust settings are discarded.
229
230The B<X509_AUX> functions process a trusted X509 certificate using
1bc74519 231an X509 structure.
a29d78e9
DSH
232
233The B<X509_REQ> and B<X509_REQ_NEW> functions process a PKCS#10
234certificate request using an X509_REQ structure. The B<X509_REQ>
235write functions use B<CERTIFICATE REQUEST> in the header whereas
236the B<X509_REQ_NEW> functions use B<NEW CERTIFICATE REQUEST>
237(as required by some CAs). The B<X509_REQ> read functions will
238handle either form so there are no B<X509_REQ_NEW> read functions.
239
240The B<X509_CRL> functions process an X509 CRL using an X509_CRL
241structure.
242
243The B<PKCS7> functions process a PKCS#7 ContentInfo using a PKCS7
244structure.
245
a29d78e9
DSH
246=head1 PEM FUNCTION ARGUMENTS
247
248The PEM functions have many common arguments.
249
bbecf04e 250The I<bp> BIO parameter (if present) specifies the BIO to read from
a29d78e9
DSH
251or write to.
252
bbecf04e 253The I<fp> FILE parameter (if present) specifies the FILE pointer to
a29d78e9
DSH
254read from or write to.
255
bbecf04e
RL
256The PEM read functions all take an argument I<B<TYPE> **x> and return
257a I<B<TYPE> *> pointer. Where I<B<TYPE>> is whatever structure the function
258uses. If I<x> is NULL then the parameter is ignored. If I<x> is not
259NULL but I<*x> is NULL then the structure returned will be written
260to I<*x>. If neither I<x> nor I<*x> is NULL then an attempt is made
261to reuse the structure at I<*x> (but see BUGS and EXAMPLES sections).
262Irrespective of the value of I<x> a pointer to the structure is always
a29d78e9
DSH
263returned (or NULL if an error occurred).
264
bbecf04e 265The PEM functions which write private keys take an I<enc> parameter
a29d78e9
DSH
266which specifies the encryption algorithm to use, encryption is done
267at the PEM level. If this parameter is set to NULL then the private
268key is written in unencrypted form.
269
bbecf04e 270The I<cb> argument is the callback to use when querying for the pass
a29d78e9
DSH
271phrase used for encrypted PEM structures (normally only private keys).
272
bbecf04e
RL
273For the PEM write routines if the I<kstr> parameter is not NULL then
274I<klen> bytes at I<kstr> are used as the passphrase and I<cb> is
a29d78e9
DSH
275ignored.
276
bbecf04e
RL
277If the I<cb> parameters is set to NULL and the I<u> parameter is not
278NULL then the I<u> parameter is interpreted as a null terminated string
279to use as the passphrase. If both I<cb> and I<u> are NULL then the
a29d78e9
DSH
280default callback routine is used which will typically prompt for the
281passphrase on the current terminal with echoing turned off.
282
283The default passphrase callback is sometimes inappropriate (for example
284in a GUI application) so an alternative can be supplied. The callback
285routine has the following form:
286
287 int cb(char *buf, int size, int rwflag, void *u);
288
bbecf04e
RL
289I<buf> is the buffer to write the passphrase to. I<size> is the maximum
290length of the passphrase (i.e. the size of buf). I<rwflag> is a flag
a29d78e9
DSH
291which is set to 0 when reading and 1 when writing. A typical routine
292will ask the user to verify the passphrase (for example by prompting
bbecf04e
RL
293for it twice) if I<rwflag> is 1. The I<u> parameter has the same
294value as the I<u> parameter passed to the PEM routine. It allows
a29d78e9
DSH
295arbitrary data to be passed to the callback by the application
296(for example a window handle in a GUI application). The callback
bbecf04e 297I<must> return the number of characters in the passphrase or -1 if
a29d78e9
DSH
298an error occurred.
299
a29d78e9
DSH
300=head1 NOTES
301
302The old B<PrivateKey> write routines are retained for compatibility.
303New applications should write private keys using the
304PEM_write_bio_PKCS8PrivateKey() or PEM_write_PKCS8PrivateKey() routines
305because they are more secure (they use an iteration count of 2048 whereas
306the traditional routines use a count of 1) unless compatibility with older
307versions of OpenSSL is important.
308
309The B<PrivateKey> read routines can be used in all applications because
310they handle all formats transparently.
311
312A frequent cause of problems is attempting to use the PEM routines like
313this:
314
315 X509 *x;
e9b77246 316
a29d78e9
DSH
317 PEM_read_bio_X509(bp, &x, 0, NULL);
318
bbecf04e 319this is a bug because an attempt will be made to reuse the data at I<x>
a29d78e9
DSH
320which is an uninitialised pointer.
321
84814344
RL
322These functions make no assumption regarding the pass phrase received from the
323password callback.
324It will simply be treated as a byte sequence.
325
06623ff0
DSH
326=head1 PEM ENCRYPTION FORMAT
327
a0474357 328These old B<PrivateKey> routines use a non standard technique for encryption.
06623ff0 329
1bc74519 330The private key (or other data) takes the following form:
06623ff0
DSH
331
332 -----BEGIN RSA PRIVATE KEY-----
333 Proc-Type: 4,ENCRYPTED
334 DEK-Info: DES-EDE3-CBC,3F17F5316E2BAC89
335
336 ...base64 encoded data...
337 -----END RSA PRIVATE KEY-----
338
a0474357
RS
339The line beginning with I<Proc-Type> contains the version and the
340protection on the encapsulated data. The line beginning I<DEK-Info>
341contains two comma separated values: the encryption algorithm name as
342used by EVP_get_cipherbyname() and an initialization vector used by the
343cipher encoded as a set of hexadecimal digits. After those two lines is
344the base64-encoded encrypted data.
06623ff0 345
a0474357 346The encryption key is derived using EVP_BytesToKey(). The cipher's
bbecf04e 347initialization vector is passed to EVP_BytesToKey() as the I<salt>
a0474357
RS
348parameter. Internally, B<PKCS5_SALT_LEN> bytes of the salt are used
349(regardless of the size of the initialization vector). The user's
bbecf04e 350password is passed to EVP_BytesToKey() using the I<data> and I<datal>
a0474357
RS
351parameters. Finally, the library uses an iteration count of 1 for
352EVP_BytesToKey().
06623ff0 353
bbecf04e
RL
354The I<key> derived by EVP_BytesToKey() along with the original initialization
355vector is then used to decrypt the encrypted data. The I<iv> produced by
a0474357
RS
356EVP_BytesToKey() is not utilized or needed, and NULL should be passed to
357the function.
358
359The pseudo code to derive the key would look similar to:
360
361 EVP_CIPHER* cipher = EVP_des_ede3_cbc();
362 EVP_MD* md = EVP_md5();
363
364 unsigned int nkey = EVP_CIPHER_key_length(cipher);
365 unsigned int niv = EVP_CIPHER_iv_length(cipher);
366 unsigned char key[nkey];
367 unsigned char iv[niv];
368
369 memcpy(iv, HexToBin("3F17F5316E2BAC89"), niv);
370 rc = EVP_BytesToKey(cipher, md, iv /*salt*/, pword, plen, 1, key, NULL /*iv*/);
2947af32 371 if (rc != nkey)
a0474357 372 /* Error */
a0474357
RS
373
374 /* On success, use key and iv to initialize the cipher */
06623ff0 375
a29d78e9
DSH
376=head1 BUGS
377
378The PEM read routines in some versions of OpenSSL will not correctly reuse
379an existing structure. Therefore the following:
380
e88c5777 381 PEM_read_bio_X509(bp, &x, 0, NULL);
a29d78e9 382
bbecf04e 383where I<x> already contains a valid certificate, may not work, whereas:
a29d78e9
DSH
384
385 X509_free(x);
e88c5777 386 x = PEM_read_bio_X509(bp, NULL, 0, NULL);
a29d78e9
DSH
387
388is guaranteed to work.
389
1f13ad31 390=head1 RETURN VALUES
a29d78e9
DSH
391
392The read routines return either a pointer to the structure read or NULL
9449e385 393if an error occurred.
a29d78e9
DSH
394
395The write routines return 1 for success or 0 for failure.
d48e78f0 396
4564e77a
PY
397=head1 EXAMPLES
398
399Although the PEM routines take several arguments in almost all applications
400most of them are set to 0 or NULL.
401
402Read a certificate in PEM format from a BIO:
403
404 X509 *x;
405
406 x = PEM_read_bio_X509(bp, NULL, 0, NULL);
407 if (x == NULL)
408 /* Error */
409
410Alternative method:
411
412 X509 *x = NULL;
413
414 if (!PEM_read_bio_X509(bp, &x, 0, NULL))
415 /* Error */
416
417Write a certificate to a BIO:
418
419 if (!PEM_write_bio_X509(bp, x))
420 /* Error */
421
422Write a private key (using traditional format) to a BIO using
423triple DES encryption, the pass phrase is prompted for:
424
425 if (!PEM_write_bio_PrivateKey(bp, key, EVP_des_ede3_cbc(), NULL, 0, 0, NULL))
426 /* Error */
427
428Write a private key (using PKCS#8 format) to a BIO using triple
429DES encryption, using the pass phrase "hello":
430
431 if (!PEM_write_bio_PKCS8PrivateKey(bp, key, EVP_des_ede3_cbc(),
432 NULL, 0, 0, "hello"))
433 /* Error */
434
435Read a private key from a BIO using a pass phrase callback:
436
437 key = PEM_read_bio_PrivateKey(bp, NULL, pass_cb, "My Private Key");
438 if (key == NULL)
439 /* Error */
440
441Skeleton pass phrase callback:
442
443 int pass_cb(char *buf, int size, int rwflag, void *u)
444 {
445
446 /* We'd probably do something else if 'rwflag' is 1 */
447 printf("Enter pass phrase for \"%s\"\n", (char *)u);
448
449 /* get pass phrase, length 'len' into 'tmp' */
450 char *tmp = "hello";
451 if (tmp == NULL) /* An error occurred */
452 return -1;
453
454 size_t len = strlen(tmp);
455
456 if (len > size)
457 len = size;
458 memcpy(buf, tmp, len);
459 return len;
460 }
461
b5c4bbbe
JL
462=head1 SEE ALSO
463
464L<EVP_EncryptInit(3)>, L<EVP_BytesToKey(3)>,
465L<passphrase-encoding(7)>
466
a0474357
RS
467=head1 HISTORY
468
469The old Netscape certificate sequences were no longer documented
a95d7574 470in OpenSSL 1.1.0; applications should use the PKCS7 standard instead
a0474357
RS
471as they will be formally deprecated in a future releases.
472
e2f92610
RS
473=head1 COPYRIGHT
474
b5c4bbbe 475Copyright 2001-2019 The OpenSSL Project Authors. All Rights Reserved.
e2f92610 476
4746f25a 477Licensed under the Apache License 2.0 (the "License"). You may not use
e2f92610
RS
478this file except in compliance with the License. You can obtain a copy
479in the file LICENSE in the source distribution or at
480L<https://www.openssl.org/source/license.html>.
481
482=cut