2 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved.
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
11 * Low level APIs are deprecated for public use, but still ok for
14 #include "internal/deprecated.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 <openssl/http.h>
23 #include <openssl/rsa.h>
24 #include <openssl/dsa.h>
25 #include <openssl/x509v3.h>
26 #include "internal/asn1.h"
27 #include "crypto/pkcs7.h"
28 #include "crypto/x509.h"
30 int X509_verify(X509
*a
, EVP_PKEY
*r
)
32 if (X509_ALGOR_cmp(&a
->sig_alg
, &a
->cert_info
.signature
))
35 return ASN1_item_verify_ex(ASN1_ITEM_rptr(X509_CINF
), &a
->sig_alg
,
36 &a
->signature
, &a
->cert_info
,
37 a
->distinguishing_id
, r
, a
->libctx
, a
->propq
);
40 int X509_REQ_verify_ex(X509_REQ
*a
, EVP_PKEY
*r
, OSSL_LIB_CTX
*libctx
,
43 return ASN1_item_verify_ex(ASN1_ITEM_rptr(X509_REQ_INFO
), &a
->sig_alg
,
44 a
->signature
, &a
->req_info
, a
->distinguishing_id
,
48 int X509_REQ_verify(X509_REQ
*a
, EVP_PKEY
*r
)
50 return X509_REQ_verify_ex(a
, r
, NULL
, NULL
);
53 int NETSCAPE_SPKI_verify(NETSCAPE_SPKI
*a
, EVP_PKEY
*r
)
55 return ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC
),
56 &a
->sig_algor
, a
->signature
, a
->spkac
, r
);
59 int X509_sign(X509
*x
, EVP_PKEY
*pkey
, const EVP_MD
*md
)
61 x
->cert_info
.enc
.modified
= 1;
62 return ASN1_item_sign_ex(ASN1_ITEM_rptr(X509_CINF
), &x
->cert_info
.signature
,
63 &x
->sig_alg
, &x
->signature
, &x
->cert_info
, NULL
,
64 pkey
, md
, x
->libctx
, x
->propq
);
67 int X509_sign_ctx(X509
*x
, EVP_MD_CTX
*ctx
)
69 x
->cert_info
.enc
.modified
= 1;
70 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF
),
71 &x
->cert_info
.signature
,
72 &x
->sig_alg
, &x
->signature
, &x
->cert_info
, ctx
);
75 static ASN1_VALUE
*simple_get_asn1(const char *url
, BIO
*bio
, BIO
*rbio
,
76 int timeout
, const ASN1_ITEM
*it
)
78 BIO
*mem
= OSSL_HTTP_get(url
, NULL
/* proxy */, NULL
/* no_proxy */,
79 bio
, rbio
, NULL
/* cb */ , NULL
/* arg */,
80 1024 /* buf_size */, NULL
/* headers */,
81 NULL
/* expected_ct */, 1 /* expect_asn1 */,
82 OSSL_HTTP_DEFAULT_MAX_RESP_LEN
, timeout
);
83 ASN1_VALUE
*res
= ASN1_item_d2i_bio(it
, mem
, NULL
);
89 X509
*X509_load_http(const char *url
, BIO
*bio
, BIO
*rbio
, int timeout
)
91 return (X509
*)simple_get_asn1(url
, bio
, rbio
, timeout
,
92 ASN1_ITEM_rptr(X509
));
95 int X509_REQ_sign(X509_REQ
*x
, EVP_PKEY
*pkey
, const EVP_MD
*md
)
97 return ASN1_item_sign_ex(ASN1_ITEM_rptr(X509_REQ_INFO
), &x
->sig_alg
, NULL
,
98 x
->signature
, &x
->req_info
, NULL
,
99 pkey
, md
, x
->libctx
, x
->propq
);
102 int X509_REQ_sign_ctx(X509_REQ
*x
, EVP_MD_CTX
*ctx
)
104 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO
),
105 &x
->sig_alg
, NULL
, x
->signature
, &x
->req_info
,
109 int X509_CRL_sign(X509_CRL
*x
, EVP_PKEY
*pkey
, const EVP_MD
*md
)
111 x
->crl
.enc
.modified
= 1;
112 return ASN1_item_sign_ex(ASN1_ITEM_rptr(X509_CRL_INFO
), &x
->crl
.sig_alg
,
113 &x
->sig_alg
, &x
->signature
, &x
->crl
, NULL
,
114 pkey
, md
, x
->libctx
, x
->propq
);
117 int X509_CRL_sign_ctx(X509_CRL
*x
, EVP_MD_CTX
*ctx
)
119 x
->crl
.enc
.modified
= 1;
120 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO
),
121 &x
->crl
.sig_alg
, &x
->sig_alg
, &x
->signature
,
125 X509_CRL
*X509_CRL_load_http(const char *url
, BIO
*bio
, BIO
*rbio
, int timeout
)
127 return (X509_CRL
*)simple_get_asn1(url
, bio
, rbio
, timeout
,
128 ASN1_ITEM_rptr(X509_CRL
));
131 int NETSCAPE_SPKI_sign(NETSCAPE_SPKI
*x
, EVP_PKEY
*pkey
, const EVP_MD
*md
)
133 return ASN1_item_sign_ex(ASN1_ITEM_rptr(NETSCAPE_SPKAC
), &x
->sig_algor
, NULL
,
134 x
->signature
, x
->spkac
, NULL
, pkey
, md
, NULL
, NULL
);
137 #ifndef OPENSSL_NO_STDIO
138 X509
*d2i_X509_fp(FILE *fp
, X509
**x509
)
140 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509
), fp
, x509
);
143 int i2d_X509_fp(FILE *fp
, const X509
*x509
)
145 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509
), fp
, x509
);
149 X509
*d2i_X509_bio(BIO
*bp
, X509
**x509
)
151 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509
), bp
, x509
);
154 int i2d_X509_bio(BIO
*bp
, const X509
*x509
)
156 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509
), bp
, x509
);
159 #ifndef OPENSSL_NO_STDIO
160 X509_CRL
*d2i_X509_CRL_fp(FILE *fp
, X509_CRL
**crl
)
162 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL
), fp
, crl
);
165 int i2d_X509_CRL_fp(FILE *fp
, const X509_CRL
*crl
)
167 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL
), fp
, crl
);
171 X509_CRL
*d2i_X509_CRL_bio(BIO
*bp
, X509_CRL
**crl
)
173 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL
), bp
, crl
);
176 int i2d_X509_CRL_bio(BIO
*bp
, const X509_CRL
*crl
)
178 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL
), bp
, crl
);
181 #ifndef OPENSSL_NO_STDIO
182 PKCS7
*d2i_PKCS7_fp(FILE *fp
, PKCS7
**p7
)
186 ret
= ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7
), fp
, p7
);
188 ossl_pkcs7_resolve_libctx(ret
);
192 int i2d_PKCS7_fp(FILE *fp
, const PKCS7
*p7
)
194 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7
), fp
, p7
);
198 PKCS7
*d2i_PKCS7_bio(BIO
*bp
, PKCS7
**p7
)
202 ret
= ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7
), bp
, p7
);
204 ossl_pkcs7_resolve_libctx(ret
);
208 int i2d_PKCS7_bio(BIO
*bp
, const PKCS7
*p7
)
210 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7
), bp
, p7
);
213 #ifndef OPENSSL_NO_STDIO
214 X509_REQ
*d2i_X509_REQ_fp(FILE *fp
, X509_REQ
**req
)
216 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ
), fp
, req
);
219 int i2d_X509_REQ_fp(FILE *fp
, const X509_REQ
*req
)
221 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ
), fp
, req
);
225 X509_REQ
*d2i_X509_REQ_bio(BIO
*bp
, X509_REQ
**req
)
227 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ
), bp
, req
);
230 int i2d_X509_REQ_bio(BIO
*bp
, const X509_REQ
*req
)
232 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ
), bp
, req
);
235 #ifndef OPENSSL_NO_STDIO
236 RSA
*d2i_RSAPrivateKey_fp(FILE *fp
, RSA
**rsa
)
238 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey
), fp
, rsa
);
241 int i2d_RSAPrivateKey_fp(FILE *fp
, const RSA
*rsa
)
243 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey
), fp
, rsa
);
246 RSA
*d2i_RSAPublicKey_fp(FILE *fp
, RSA
**rsa
)
248 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey
), fp
, rsa
);
251 RSA
*d2i_RSA_PUBKEY_fp(FILE *fp
, RSA
**rsa
)
253 return ASN1_d2i_fp((void *(*)(void))
254 RSA_new
, (D2I_OF(void)) d2i_RSA_PUBKEY
, fp
,
258 int i2d_RSAPublicKey_fp(FILE *fp
, const RSA
*rsa
)
260 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey
), fp
, rsa
);
263 int i2d_RSA_PUBKEY_fp(FILE *fp
, const RSA
*rsa
)
265 return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY
, fp
, rsa
);
269 RSA
*d2i_RSAPrivateKey_bio(BIO
*bp
, RSA
**rsa
)
271 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey
), bp
, rsa
);
274 int i2d_RSAPrivateKey_bio(BIO
*bp
, const RSA
*rsa
)
276 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey
), bp
, rsa
);
279 RSA
*d2i_RSAPublicKey_bio(BIO
*bp
, RSA
**rsa
)
281 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey
), bp
, rsa
);
284 RSA
*d2i_RSA_PUBKEY_bio(BIO
*bp
, RSA
**rsa
)
286 return ASN1_d2i_bio_of(RSA
, RSA_new
, d2i_RSA_PUBKEY
, bp
, rsa
);
289 int i2d_RSAPublicKey_bio(BIO
*bp
, const RSA
*rsa
)
291 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey
), bp
, rsa
);
294 int i2d_RSA_PUBKEY_bio(BIO
*bp
, const RSA
*rsa
)
296 return ASN1_i2d_bio_of(RSA
, i2d_RSA_PUBKEY
, bp
, rsa
);
299 #ifndef OPENSSL_NO_DSA
300 # ifndef OPENSSL_NO_STDIO
301 DSA
*d2i_DSAPrivateKey_fp(FILE *fp
, DSA
**dsa
)
303 return ASN1_d2i_fp_of(DSA
, DSA_new
, d2i_DSAPrivateKey
, fp
, dsa
);
306 int i2d_DSAPrivateKey_fp(FILE *fp
, const DSA
*dsa
)
308 return ASN1_i2d_fp_of(DSA
, i2d_DSAPrivateKey
, fp
, dsa
);
311 DSA
*d2i_DSA_PUBKEY_fp(FILE *fp
, DSA
**dsa
)
313 return ASN1_d2i_fp_of(DSA
, DSA_new
, d2i_DSA_PUBKEY
, fp
, dsa
);
316 int i2d_DSA_PUBKEY_fp(FILE *fp
, const DSA
*dsa
)
318 return ASN1_i2d_fp_of(DSA
, i2d_DSA_PUBKEY
, fp
, dsa
);
322 DSA
*d2i_DSAPrivateKey_bio(BIO
*bp
, DSA
**dsa
)
324 return ASN1_d2i_bio_of(DSA
, DSA_new
, d2i_DSAPrivateKey
, bp
, dsa
);
327 int i2d_DSAPrivateKey_bio(BIO
*bp
, const DSA
*dsa
)
329 return ASN1_i2d_bio_of(DSA
, i2d_DSAPrivateKey
, bp
, dsa
);
332 DSA
*d2i_DSA_PUBKEY_bio(BIO
*bp
, DSA
**dsa
)
334 return ASN1_d2i_bio_of(DSA
, DSA_new
, d2i_DSA_PUBKEY
, bp
, dsa
);
337 int i2d_DSA_PUBKEY_bio(BIO
*bp
, const DSA
*dsa
)
339 return ASN1_i2d_bio_of(DSA
, i2d_DSA_PUBKEY
, bp
, dsa
);
344 #ifndef OPENSSL_NO_EC
345 # ifndef OPENSSL_NO_STDIO
346 EC_KEY
*d2i_EC_PUBKEY_fp(FILE *fp
, EC_KEY
**eckey
)
348 return ASN1_d2i_fp_of(EC_KEY
, EC_KEY_new
, d2i_EC_PUBKEY
, fp
, eckey
);
351 int i2d_EC_PUBKEY_fp(FILE *fp
, const EC_KEY
*eckey
)
353 return ASN1_i2d_fp_of(EC_KEY
, i2d_EC_PUBKEY
, fp
, eckey
);
356 EC_KEY
*d2i_ECPrivateKey_fp(FILE *fp
, EC_KEY
**eckey
)
358 return ASN1_d2i_fp_of(EC_KEY
, EC_KEY_new
, d2i_ECPrivateKey
, fp
, eckey
);
361 int i2d_ECPrivateKey_fp(FILE *fp
, const EC_KEY
*eckey
)
363 return ASN1_i2d_fp_of(EC_KEY
, i2d_ECPrivateKey
, fp
, eckey
);
366 EC_KEY
*d2i_EC_PUBKEY_bio(BIO
*bp
, EC_KEY
**eckey
)
368 return ASN1_d2i_bio_of(EC_KEY
, EC_KEY_new
, d2i_EC_PUBKEY
, bp
, eckey
);
371 int i2d_EC_PUBKEY_bio(BIO
*bp
, const EC_KEY
*ecdsa
)
373 return ASN1_i2d_bio_of(EC_KEY
, i2d_EC_PUBKEY
, bp
, ecdsa
);
376 EC_KEY
*d2i_ECPrivateKey_bio(BIO
*bp
, EC_KEY
**eckey
)
378 return ASN1_d2i_bio_of(EC_KEY
, EC_KEY_new
, d2i_ECPrivateKey
, bp
, eckey
);
381 int i2d_ECPrivateKey_bio(BIO
*bp
, const EC_KEY
*eckey
)
383 return ASN1_i2d_bio_of(EC_KEY
, i2d_ECPrivateKey
, bp
, eckey
);
387 int X509_pubkey_digest(const X509
*data
, const EVP_MD
*type
,
388 unsigned char *md
, unsigned int *len
)
390 ASN1_BIT_STRING
*key
;
391 key
= X509_get0_pubkey_bitstr(data
);
394 return EVP_Digest(key
->data
, key
->length
, md
, len
, type
, NULL
);
397 int X509_digest(const X509
*cert
, const EVP_MD
*md
, unsigned char *data
,
400 if (EVP_MD_is_a(md
, SN_sha1
) && (cert
->ex_flags
& EXFLAG_SET
) != 0
401 && (cert
->ex_flags
& EXFLAG_NO_FINGERPRINT
) == 0) {
402 /* Asking for SHA1 and we already computed it. */
404 *len
= sizeof(cert
->sha1_hash
);
405 memcpy(data
, cert
->sha1_hash
, sizeof(cert
->sha1_hash
));
408 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509
), md
, (char *)cert
,
409 data
, len
, cert
->libctx
, cert
->propq
);
412 /* calculate cert digest using the same hash algorithm as in its signature */
413 ASN1_OCTET_STRING
*X509_digest_sig(const X509
*cert
)
416 unsigned char hash
[EVP_MAX_MD_SIZE
];
418 const EVP_MD
*md
= NULL
;
419 ASN1_OCTET_STRING
*new = NULL
;
422 ERR_raise(ERR_LIB_X509
, ERR_R_PASSED_NULL_PARAMETER
);
426 if (!OBJ_find_sigid_algs(X509_get_signature_nid(cert
), &md_NID
, NULL
)
427 || (md
= EVP_get_digestbynid(md_NID
)) == NULL
) {
428 ERR_raise(ERR_LIB_CMP
, X509_R_UNSUPPORTED_ALGORITHM
);
431 if (!X509_digest(cert
, md
, hash
, &len
)
432 || (new = ASN1_OCTET_STRING_new()) == NULL
)
434 if (!(ASN1_OCTET_STRING_set(new, hash
, len
))) {
435 ASN1_OCTET_STRING_free(new);
441 int X509_CRL_digest(const X509_CRL
*data
, const EVP_MD
*type
,
442 unsigned char *md
, unsigned int *len
)
445 ERR_raise(ERR_LIB_X509
, ERR_R_PASSED_NULL_PARAMETER
);
448 if (EVP_MD_is_a(type
, SN_sha1
)
449 && (data
->flags
& EXFLAG_SET
) != 0
450 && (data
->flags
& EXFLAG_NO_FINGERPRINT
) == 0) {
451 /* Asking for SHA1; always computed in CRL d2i. */
453 *len
= sizeof(data
->sha1_hash
);
454 memcpy(md
, data
->sha1_hash
, sizeof(data
->sha1_hash
));
457 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509_CRL
), type
, (char *)data
,
458 md
, len
, data
->libctx
, data
->propq
);
461 int X509_REQ_digest(const X509_REQ
*data
, const EVP_MD
*type
,
462 unsigned char *md
, unsigned int *len
)
464 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509_REQ
), type
, (char *)data
,
465 md
, len
, data
->libctx
, data
->propq
);
468 int X509_NAME_digest(const X509_NAME
*data
, const EVP_MD
*type
,
469 unsigned char *md
, unsigned int *len
)
471 return ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME
), type
, (char *)data
,
475 int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL
*data
,
476 const EVP_MD
*type
, unsigned char *md
,
479 return ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL
), type
,
480 (char *)data
, md
, len
);
483 #ifndef OPENSSL_NO_STDIO
484 X509_SIG
*d2i_PKCS8_fp(FILE *fp
, X509_SIG
**p8
)
486 return ASN1_d2i_fp_of(X509_SIG
, X509_SIG_new
, d2i_X509_SIG
, fp
, p8
);
489 int i2d_PKCS8_fp(FILE *fp
, const X509_SIG
*p8
)
491 return ASN1_i2d_fp_of(X509_SIG
, i2d_X509_SIG
, fp
, p8
);
495 X509_SIG
*d2i_PKCS8_bio(BIO
*bp
, X509_SIG
**p8
)
497 return ASN1_d2i_bio_of(X509_SIG
, X509_SIG_new
, d2i_X509_SIG
, bp
, p8
);
500 int i2d_PKCS8_bio(BIO
*bp
, const X509_SIG
*p8
)
502 return ASN1_i2d_bio_of(X509_SIG
, i2d_X509_SIG
, bp
, p8
);
505 #ifndef OPENSSL_NO_STDIO
506 X509_PUBKEY
*d2i_X509_PUBKEY_fp(FILE *fp
, X509_PUBKEY
**xpk
)
508 return ASN1_d2i_fp_of(X509_PUBKEY
, X509_PUBKEY_new
, d2i_X509_PUBKEY
,
512 int i2d_X509_PUBKEY_fp(FILE *fp
, const X509_PUBKEY
*xpk
)
514 return ASN1_i2d_fp_of(X509_PUBKEY
, i2d_X509_PUBKEY
, fp
, xpk
);
518 X509_PUBKEY
*d2i_X509_PUBKEY_bio(BIO
*bp
, X509_PUBKEY
**xpk
)
520 return ASN1_d2i_bio_of(X509_PUBKEY
, X509_PUBKEY_new
, d2i_X509_PUBKEY
,
524 int i2d_X509_PUBKEY_bio(BIO
*bp
, const X509_PUBKEY
*xpk
)
526 return ASN1_i2d_bio_of(X509_PUBKEY
, i2d_X509_PUBKEY
, bp
, xpk
);
529 #ifndef OPENSSL_NO_STDIO
530 PKCS8_PRIV_KEY_INFO
*d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp
,
531 PKCS8_PRIV_KEY_INFO
**p8inf
)
533 return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO
, PKCS8_PRIV_KEY_INFO_new
,
534 d2i_PKCS8_PRIV_KEY_INFO
, fp
, p8inf
);
537 int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp
, const PKCS8_PRIV_KEY_INFO
*p8inf
)
539 return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO
, i2d_PKCS8_PRIV_KEY_INFO
, fp
,
543 int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp
, const EVP_PKEY
*key
)
545 PKCS8_PRIV_KEY_INFO
*p8inf
;
548 p8inf
= EVP_PKEY2PKCS8(key
);
551 ret
= i2d_PKCS8_PRIV_KEY_INFO_fp(fp
, p8inf
);
552 PKCS8_PRIV_KEY_INFO_free(p8inf
);
556 int i2d_PrivateKey_fp(FILE *fp
, const EVP_PKEY
*pkey
)
558 return ASN1_i2d_fp_of(EVP_PKEY
, i2d_PrivateKey
, fp
, pkey
);
561 EVP_PKEY
*d2i_PrivateKey_fp(FILE *fp
, EVP_PKEY
**a
)
563 return ASN1_d2i_fp_of(EVP_PKEY
, EVP_PKEY_new
, d2i_AutoPrivateKey
, fp
, a
);
566 EVP_PKEY
*d2i_PrivateKey_ex_fp(FILE *fp
, EVP_PKEY
**a
, OSSL_LIB_CTX
*libctx
,
572 if ((b
= BIO_new(BIO_s_file())) == NULL
) {
573 ERR_raise(ERR_LIB_X509
, ERR_R_BUF_LIB
);
576 BIO_set_fp(b
, fp
, BIO_NOCLOSE
);
577 ret
= d2i_PrivateKey_ex_bio(b
, a
, libctx
, propq
);
582 int i2d_PUBKEY_fp(FILE *fp
, const EVP_PKEY
*pkey
)
584 return ASN1_i2d_fp_of(EVP_PKEY
, i2d_PUBKEY
, fp
, pkey
);
587 EVP_PKEY
*d2i_PUBKEY_fp(FILE *fp
, EVP_PKEY
**a
)
589 return ASN1_d2i_fp_of(EVP_PKEY
, EVP_PKEY_new
, d2i_PUBKEY
, fp
, a
);
594 PKCS8_PRIV_KEY_INFO
*d2i_PKCS8_PRIV_KEY_INFO_bio(BIO
*bp
,
595 PKCS8_PRIV_KEY_INFO
**p8inf
)
597 return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO
, PKCS8_PRIV_KEY_INFO_new
,
598 d2i_PKCS8_PRIV_KEY_INFO
, bp
, p8inf
);
601 int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO
*bp
, const PKCS8_PRIV_KEY_INFO
*p8inf
)
603 return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO
, i2d_PKCS8_PRIV_KEY_INFO
, bp
,
607 int i2d_PKCS8PrivateKeyInfo_bio(BIO
*bp
, const EVP_PKEY
*key
)
609 PKCS8_PRIV_KEY_INFO
*p8inf
;
612 p8inf
= EVP_PKEY2PKCS8(key
);
615 ret
= i2d_PKCS8_PRIV_KEY_INFO_bio(bp
, p8inf
);
616 PKCS8_PRIV_KEY_INFO_free(p8inf
);
620 int i2d_PrivateKey_bio(BIO
*bp
, const EVP_PKEY
*pkey
)
622 return ASN1_i2d_bio_of(EVP_PKEY
, i2d_PrivateKey
, bp
, pkey
);
625 EVP_PKEY
*d2i_PrivateKey_bio(BIO
*bp
, EVP_PKEY
**a
)
627 return ASN1_d2i_bio_of(EVP_PKEY
, EVP_PKEY_new
, d2i_AutoPrivateKey
, bp
, a
);
630 EVP_PKEY
*d2i_PrivateKey_ex_bio(BIO
*bp
, EVP_PKEY
**a
, OSSL_LIB_CTX
*libctx
,
634 const unsigned char *p
;
638 len
= asn1_d2i_read_bio(bp
, &b
);
642 p
= (unsigned char *)b
->data
;
643 ret
= d2i_AutoPrivateKey_ex(a
, &p
, len
, libctx
, propq
);
649 int i2d_PUBKEY_bio(BIO
*bp
, const EVP_PKEY
*pkey
)
651 return ASN1_i2d_bio_of(EVP_PKEY
, i2d_PUBKEY
, bp
, pkey
);
654 EVP_PKEY
*d2i_PUBKEY_bio(BIO
*bp
, EVP_PKEY
**a
)
656 return ASN1_d2i_bio_of(EVP_PKEY
, EVP_PKEY_new
, d2i_PUBKEY
, bp
, a
);