]> git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/x509/x_all.c
Chunk 10 of CMP contribution to OpenSSL: CMP http client and related tests
[thirdparty/openssl.git] / crypto / x509 / x_all.c
1 /*
2 * Copyright 1995-2020 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10 /*
11 * Low level APIs are deprecated for public use, but still ok for
12 * internal use.
13 */
14 #include "internal/deprecated.h"
15
16 #include <stdio.h>
17 #include "internal/cryptlib.h"
18 #include <openssl/buffer.h>
19 #include <openssl/asn1.h>
20 #include <openssl/evp.h>
21 #include <openssl/x509.h>
22 #include "crypto/x509.h"
23 #include <openssl/http.h>
24 #include <openssl/rsa.h>
25 #include <openssl/dsa.h>
26 #include <openssl/x509v3.h>
27
28 static void clean_id_ctx(EVP_MD_CTX *ctx)
29 {
30 EVP_PKEY_CTX *pctx = EVP_MD_CTX_pkey_ctx(ctx);
31
32 EVP_PKEY_CTX_free(pctx);
33 EVP_MD_CTX_free(ctx);
34 }
35
36 static EVP_MD_CTX *make_id_ctx(EVP_PKEY *r, ASN1_OCTET_STRING *id)
37 {
38 EVP_MD_CTX *ctx = NULL;
39 EVP_PKEY_CTX *pctx = NULL;
40
41 if ((ctx = EVP_MD_CTX_new()) == NULL
42 || (pctx = EVP_PKEY_CTX_new(r, NULL)) == NULL) {
43 X509err(0, ERR_R_MALLOC_FAILURE);
44 goto error;
45 }
46
47 #ifndef OPENSSL_NO_EC
48 if (id != NULL) {
49 if (EVP_PKEY_CTX_set1_id(pctx, id->data, id->length) <= 0) {
50 X509err(0, ERR_R_MALLOC_FAILURE);
51 goto error;
52 }
53 }
54 #endif
55
56 EVP_MD_CTX_set_pkey_ctx(ctx, pctx);
57
58 return ctx;
59 error:
60 EVP_PKEY_CTX_free(pctx);
61 EVP_MD_CTX_free(ctx);
62 return NULL;
63 }
64
65 int X509_verify(X509 *a, EVP_PKEY *r)
66 {
67 int rv = 0;
68 EVP_MD_CTX *ctx = NULL;
69 ASN1_OCTET_STRING *id = NULL;
70
71 if (X509_ALGOR_cmp(&a->sig_alg, &a->cert_info.signature))
72 return 0;
73
74 id = a->distinguishing_id;
75 if ((ctx = make_id_ctx(r, id)) != NULL) {
76 rv = ASN1_item_verify_ctx(ASN1_ITEM_rptr(X509_CINF), &a->sig_alg,
77 &a->signature, &a->cert_info, ctx);
78 clean_id_ctx(ctx);
79 }
80 return rv;
81 }
82
83 int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
84 {
85 int rv = 0;
86 EVP_MD_CTX *ctx = NULL;
87 ASN1_OCTET_STRING *id = NULL;
88
89 id = a->distinguishing_id;
90 if ((ctx = make_id_ctx(r, id)) != NULL) {
91 rv = ASN1_item_verify_ctx(ASN1_ITEM_rptr(X509_REQ_INFO), &a->sig_alg,
92 a->signature, &a->req_info, ctx);
93 clean_id_ctx(ctx);
94 }
95 return rv;
96 }
97
98 int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
99 {
100 return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
101 &a->sig_algor, a->signature, a->spkac, r));
102 }
103
104 int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
105 {
106 x->cert_info.enc.modified = 1;
107 return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), &x->cert_info.signature,
108 &x->sig_alg, &x->signature, &x->cert_info, pkey,
109 md));
110 }
111
112 int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
113 {
114 x->cert_info.enc.modified = 1;
115 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
116 &x->cert_info.signature,
117 &x->sig_alg, &x->signature, &x->cert_info, ctx);
118 }
119
120 #if !defined(OPENSSL_NO_SOCK)
121 static ASN1_VALUE *simple_get_asn1(const char *url, BIO *bio, BIO *rbio,
122 int timeout, const ASN1_ITEM *it)
123 {
124 return OSSL_HTTP_get_asn1(url, NULL, NULL /* no proxy used */, bio,
125 rbio, NULL /* no callback for SSL/TLS */, NULL,
126 NULL /* headers */, 1024 /* maxline */,
127 0 /* max_resp_len */, timeout,
128 NULL /* expected_content_type */, it);
129 }
130
131 X509 *X509_load_http(const char *url, BIO *bio, BIO *rbio, int timeout)
132 {
133 return (X509 *)simple_get_asn1(url, bio, rbio, timeout,
134 ASN1_ITEM_rptr(X509));
135 }
136 #endif
137
138 int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
139 {
140 return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), &x->sig_alg, NULL,
141 x->signature, &x->req_info, pkey, md));
142 }
143
144 int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
145 {
146 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
147 &x->sig_alg, NULL, x->signature, &x->req_info,
148 ctx);
149 }
150
151 int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
152 {
153 x->crl.enc.modified = 1;
154 return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), &x->crl.sig_alg,
155 &x->sig_alg, &x->signature, &x->crl, pkey, md));
156 }
157
158 int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
159 {
160 x->crl.enc.modified = 1;
161 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
162 &x->crl.sig_alg, &x->sig_alg, &x->signature,
163 &x->crl, ctx);
164 }
165
166 #if !defined(OPENSSL_NO_SOCK)
167 X509_CRL *X509_CRL_load_http(const char *url, BIO *bio, BIO *rbio, int timeout)
168 {
169 return (X509_CRL *)simple_get_asn1(url, bio, rbio, timeout,
170 ASN1_ITEM_rptr(X509_CRL));
171 }
172 #endif
173
174 int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
175 {
176 return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), &x->sig_algor, NULL,
177 x->signature, x->spkac, pkey, md));
178 }
179
180 #ifndef OPENSSL_NO_STDIO
181 X509 *d2i_X509_fp(FILE *fp, X509 **x509)
182 {
183 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
184 }
185
186 int i2d_X509_fp(FILE *fp, const X509 *x509)
187 {
188 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
189 }
190 #endif
191
192 X509 *d2i_X509_bio(BIO *bp, X509 **x509)
193 {
194 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
195 }
196
197 int i2d_X509_bio(BIO *bp, const X509 *x509)
198 {
199 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
200 }
201
202 #ifndef OPENSSL_NO_STDIO
203 X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
204 {
205 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
206 }
207
208 int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl)
209 {
210 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
211 }
212 #endif
213
214 X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
215 {
216 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
217 }
218
219 int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl)
220 {
221 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
222 }
223
224 #ifndef OPENSSL_NO_STDIO
225 PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
226 {
227 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
228 }
229
230 int i2d_PKCS7_fp(FILE *fp, const PKCS7 *p7)
231 {
232 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
233 }
234 #endif
235
236 PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
237 {
238 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
239 }
240
241 int i2d_PKCS7_bio(BIO *bp, const PKCS7 *p7)
242 {
243 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
244 }
245
246 #ifndef OPENSSL_NO_STDIO
247 X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
248 {
249 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
250 }
251
252 int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req)
253 {
254 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
255 }
256 #endif
257
258 X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
259 {
260 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
261 }
262
263 int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req)
264 {
265 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
266 }
267
268 #ifndef OPENSSL_NO_RSA
269
270 # ifndef OPENSSL_NO_STDIO
271 RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
272 {
273 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
274 }
275
276 int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa)
277 {
278 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
279 }
280
281 RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
282 {
283 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
284 }
285
286 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
287 {
288 return ASN1_d2i_fp((void *(*)(void))
289 RSA_new, (D2I_OF(void)) d2i_RSA_PUBKEY, fp,
290 (void **)rsa);
291 }
292
293 int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa)
294 {
295 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
296 }
297
298 int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa)
299 {
300 return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY, fp, rsa);
301 }
302 # endif
303
304 RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
305 {
306 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
307 }
308
309 int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa)
310 {
311 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
312 }
313
314 RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
315 {
316 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
317 }
318
319 RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
320 {
321 return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSA_PUBKEY, bp, rsa);
322 }
323
324 int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa)
325 {
326 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
327 }
328
329 int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa)
330 {
331 return ASN1_i2d_bio_of(RSA, i2d_RSA_PUBKEY, bp, rsa);
332 }
333 #endif
334
335 #ifndef OPENSSL_NO_DSA
336 # ifndef OPENSSL_NO_STDIO
337 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
338 {
339 return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSAPrivateKey, fp, dsa);
340 }
341
342 int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa)
343 {
344 return ASN1_i2d_fp_of(DSA, i2d_DSAPrivateKey, fp, dsa);
345 }
346
347 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
348 {
349 return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSA_PUBKEY, fp, dsa);
350 }
351
352 int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa)
353 {
354 return ASN1_i2d_fp_of(DSA, i2d_DSA_PUBKEY, fp, dsa);
355 }
356 # endif
357
358 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
359 {
360 return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSAPrivateKey, bp, dsa);
361 }
362
363 int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa)
364 {
365 return ASN1_i2d_bio_of(DSA, i2d_DSAPrivateKey, bp, dsa);
366 }
367
368 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
369 {
370 return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSA_PUBKEY, bp, dsa);
371 }
372
373 int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa)
374 {
375 return ASN1_i2d_bio_of(DSA, i2d_DSA_PUBKEY, bp, dsa);
376 }
377
378 #endif
379
380 #ifndef OPENSSL_NO_EC
381 # ifndef OPENSSL_NO_STDIO
382 EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
383 {
384 return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, fp, eckey);
385 }
386
387 int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey)
388 {
389 return ASN1_i2d_fp_of(EC_KEY, i2d_EC_PUBKEY, fp, eckey);
390 }
391
392 EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
393 {
394 return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, fp, eckey);
395 }
396
397 int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey)
398 {
399 return ASN1_i2d_fp_of(EC_KEY, i2d_ECPrivateKey, fp, eckey);
400 }
401 # endif
402 EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
403 {
404 return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, bp, eckey);
405 }
406
407 int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *ecdsa)
408 {
409 return ASN1_i2d_bio_of(EC_KEY, i2d_EC_PUBKEY, bp, ecdsa);
410 }
411
412 EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
413 {
414 return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, bp, eckey);
415 }
416
417 int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey)
418 {
419 return ASN1_i2d_bio_of(EC_KEY, i2d_ECPrivateKey, bp, eckey);
420 }
421 #endif
422
423 int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
424 unsigned char *md, unsigned int *len)
425 {
426 ASN1_BIT_STRING *key;
427 key = X509_get0_pubkey_bitstr(data);
428 if (!key)
429 return 0;
430 return EVP_Digest(key->data, key->length, md, len, type, NULL);
431 }
432
433 int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
434 unsigned int *len)
435 {
436 if (type == EVP_sha1() && (data->ex_flags & EXFLAG_SET) != 0
437 && (data->ex_flags & EXFLAG_INVALID) == 0) {
438 /* Asking for SHA1 and we already computed it. */
439 if (len != NULL)
440 *len = sizeof(data->sha1_hash);
441 memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
442 return 1;
443 }
444 return (ASN1_item_digest
445 (ASN1_ITEM_rptr(X509), type, (char *)data, md, len));
446 }
447
448 /* calculate cert digest using the same hash algorithm as in its signature */
449 ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert)
450 {
451 unsigned int len;
452 unsigned char hash[EVP_MAX_MD_SIZE];
453 int md_NID;
454 const EVP_MD *md = NULL;
455 ASN1_OCTET_STRING *new = NULL;
456
457 if (cert == NULL) {
458 X509err(0, ERR_R_PASSED_NULL_PARAMETER);
459 return NULL;
460 }
461
462 if (!OBJ_find_sigid_algs(X509_get_signature_nid(cert), &md_NID, NULL)
463 || (md = EVP_get_digestbynid(md_NID)) == NULL) {
464 CMPerr(0, X509_R_UNSUPPORTED_ALGORITHM);
465 return NULL;
466 }
467 if (!X509_digest(cert, md, hash, &len)
468 || (new = ASN1_OCTET_STRING_new()) == NULL)
469 return NULL;
470 if (!(ASN1_OCTET_STRING_set(new, hash, len))) {
471 ASN1_OCTET_STRING_free(new);
472 return NULL;
473 }
474 return new;
475 }
476
477 int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
478 unsigned char *md, unsigned int *len)
479 {
480 if (type == EVP_sha1() && (data->flags & EXFLAG_SET) != 0
481 && (data->flags & EXFLAG_INVALID) == 0) {
482 /* Asking for SHA1; always computed in CRL d2i. */
483 if (len != NULL)
484 *len = sizeof(data->sha1_hash);
485 memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
486 return 1;
487 }
488 return (ASN1_item_digest
489 (ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len));
490 }
491
492 int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
493 unsigned char *md, unsigned int *len)
494 {
495 return (ASN1_item_digest
496 (ASN1_ITEM_rptr(X509_REQ), type, (char *)data, md, len));
497 }
498
499 int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
500 unsigned char *md, unsigned int *len)
501 {
502 return (ASN1_item_digest
503 (ASN1_ITEM_rptr(X509_NAME), type, (char *)data, md, len));
504 }
505
506 int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
507 const EVP_MD *type, unsigned char *md,
508 unsigned int *len)
509 {
510 return (ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL), type,
511 (char *)data, md, len));
512 }
513
514 #ifndef OPENSSL_NO_STDIO
515 X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
516 {
517 return ASN1_d2i_fp_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, fp, p8);
518 }
519
520 int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8)
521 {
522 return ASN1_i2d_fp_of(X509_SIG, i2d_X509_SIG, fp, p8);
523 }
524 #endif
525
526 X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
527 {
528 return ASN1_d2i_bio_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, bp, p8);
529 }
530
531 int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8)
532 {
533 return ASN1_i2d_bio_of(X509_SIG, i2d_X509_SIG, bp, p8);
534 }
535
536 #ifndef OPENSSL_NO_STDIO
537 X509_PUBKEY *d2i_X509_PUBKEY_fp(FILE *fp, X509_PUBKEY **xpk)
538 {
539 return ASN1_d2i_fp_of(X509_PUBKEY, X509_PUBKEY_new, d2i_X509_PUBKEY,
540 fp, xpk);
541 }
542
543 int i2d_X509_PUBKEY_fp(FILE *fp, const X509_PUBKEY *xpk)
544 {
545 return ASN1_i2d_fp_of(X509_PUBKEY, i2d_X509_PUBKEY, fp, xpk);
546 }
547 #endif
548
549 X509_PUBKEY *d2i_X509_PUBKEY_bio(BIO *bp, X509_PUBKEY **xpk)
550 {
551 return ASN1_d2i_bio_of(X509_PUBKEY, X509_PUBKEY_new, d2i_X509_PUBKEY,
552 bp, xpk);
553 }
554
555 int i2d_X509_PUBKEY_bio(BIO *bp, const X509_PUBKEY *xpk)
556 {
557 return ASN1_i2d_bio_of(X509_PUBKEY, i2d_X509_PUBKEY, bp, xpk);
558 }
559
560 #ifndef OPENSSL_NO_STDIO
561 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
562 PKCS8_PRIV_KEY_INFO **p8inf)
563 {
564 return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
565 d2i_PKCS8_PRIV_KEY_INFO, fp, p8inf);
566 }
567
568 int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, const PKCS8_PRIV_KEY_INFO *p8inf)
569 {
570 return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, fp,
571 p8inf);
572 }
573
574 int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key)
575 {
576 PKCS8_PRIV_KEY_INFO *p8inf;
577 int ret;
578
579 p8inf = EVP_PKEY2PKCS8(key);
580 if (p8inf == NULL)
581 return 0;
582 ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
583 PKCS8_PRIV_KEY_INFO_free(p8inf);
584 return ret;
585 }
586
587 int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey)
588 {
589 return ASN1_i2d_fp_of(EVP_PKEY, i2d_PrivateKey, fp, pkey);
590 }
591
592 EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
593 {
594 return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, fp, a);
595 }
596
597 int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey)
598 {
599 return ASN1_i2d_fp_of(EVP_PKEY, i2d_PUBKEY, fp, pkey);
600 }
601
602 EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
603 {
604 return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, fp, a);
605 }
606
607 #endif
608
609 PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
610 PKCS8_PRIV_KEY_INFO **p8inf)
611 {
612 return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
613 d2i_PKCS8_PRIV_KEY_INFO, bp, p8inf);
614 }
615
616 int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf)
617 {
618 return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, bp,
619 p8inf);
620 }
621
622 int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key)
623 {
624 PKCS8_PRIV_KEY_INFO *p8inf;
625 int ret;
626
627 p8inf = EVP_PKEY2PKCS8(key);
628 if (p8inf == NULL)
629 return 0;
630 ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
631 PKCS8_PRIV_KEY_INFO_free(p8inf);
632 return ret;
633 }
634
635 int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey)
636 {
637 return ASN1_i2d_bio_of(EVP_PKEY, i2d_PrivateKey, bp, pkey);
638 }
639
640 EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
641 {
642 return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, bp, a);
643 }
644
645 int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey)
646 {
647 return ASN1_i2d_bio_of(EVP_PKEY, i2d_PUBKEY, bp, pkey);
648 }
649
650 EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
651 {
652 return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, bp, a);
653 }