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
)
185 OSSL_LIB_CTX
*libctx
= NULL
;
186 const char *propq
= NULL
;
188 if (p7
!= NULL
&& *p7
!= NULL
) {
189 libctx
= (*p7
)->ctx
.libctx
;
190 propq
= (*p7
)->ctx
.propq
;
193 ret
= ASN1_item_d2i_fp_ex(ASN1_ITEM_rptr(PKCS7
), fp
, p7
, libctx
, propq
);
195 ossl_pkcs7_resolve_libctx(ret
);
199 int i2d_PKCS7_fp(FILE *fp
, const PKCS7
*p7
)
201 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7
), fp
, p7
);
205 PKCS7
*d2i_PKCS7_bio(BIO
*bp
, PKCS7
**p7
)
208 OSSL_LIB_CTX
*libctx
= NULL
;
209 const char *propq
= NULL
;
211 if (p7
!= NULL
&& *p7
!= NULL
) {
212 libctx
= (*p7
)->ctx
.libctx
;
213 propq
= (*p7
)->ctx
.propq
;
217 ret
= ASN1_item_d2i_bio_ex(ASN1_ITEM_rptr(PKCS7
), bp
, p7
, libctx
, propq
);
219 ossl_pkcs7_resolve_libctx(ret
);
223 int i2d_PKCS7_bio(BIO
*bp
, const PKCS7
*p7
)
225 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7
), bp
, p7
);
228 #ifndef OPENSSL_NO_STDIO
229 X509_REQ
*d2i_X509_REQ_fp(FILE *fp
, X509_REQ
**req
)
231 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ
), fp
, req
);
234 int i2d_X509_REQ_fp(FILE *fp
, const X509_REQ
*req
)
236 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ
), fp
, req
);
240 X509_REQ
*d2i_X509_REQ_bio(BIO
*bp
, X509_REQ
**req
)
242 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ
), bp
, req
);
245 int i2d_X509_REQ_bio(BIO
*bp
, const X509_REQ
*req
)
247 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ
), bp
, req
);
250 #ifndef OPENSSL_NO_STDIO
251 RSA
*d2i_RSAPrivateKey_fp(FILE *fp
, RSA
**rsa
)
253 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey
), fp
, rsa
);
256 int i2d_RSAPrivateKey_fp(FILE *fp
, const RSA
*rsa
)
258 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey
), fp
, rsa
);
261 RSA
*d2i_RSAPublicKey_fp(FILE *fp
, RSA
**rsa
)
263 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey
), fp
, rsa
);
266 RSA
*d2i_RSA_PUBKEY_fp(FILE *fp
, RSA
**rsa
)
268 return ASN1_d2i_fp((void *(*)(void))
269 RSA_new
, (D2I_OF(void)) d2i_RSA_PUBKEY
, fp
,
273 int i2d_RSAPublicKey_fp(FILE *fp
, const RSA
*rsa
)
275 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey
), fp
, rsa
);
278 int i2d_RSA_PUBKEY_fp(FILE *fp
, const RSA
*rsa
)
280 return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY
, fp
, rsa
);
284 RSA
*d2i_RSAPrivateKey_bio(BIO
*bp
, RSA
**rsa
)
286 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey
), bp
, rsa
);
289 int i2d_RSAPrivateKey_bio(BIO
*bp
, const RSA
*rsa
)
291 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey
), bp
, rsa
);
294 RSA
*d2i_RSAPublicKey_bio(BIO
*bp
, RSA
**rsa
)
296 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey
), bp
, rsa
);
299 RSA
*d2i_RSA_PUBKEY_bio(BIO
*bp
, RSA
**rsa
)
301 return ASN1_d2i_bio_of(RSA
, RSA_new
, d2i_RSA_PUBKEY
, bp
, rsa
);
304 int i2d_RSAPublicKey_bio(BIO
*bp
, const RSA
*rsa
)
306 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey
), bp
, rsa
);
309 int i2d_RSA_PUBKEY_bio(BIO
*bp
, const RSA
*rsa
)
311 return ASN1_i2d_bio_of(RSA
, i2d_RSA_PUBKEY
, bp
, rsa
);
314 #ifndef OPENSSL_NO_DSA
315 # ifndef OPENSSL_NO_STDIO
316 DSA
*d2i_DSAPrivateKey_fp(FILE *fp
, DSA
**dsa
)
318 return ASN1_d2i_fp_of(DSA
, DSA_new
, d2i_DSAPrivateKey
, fp
, dsa
);
321 int i2d_DSAPrivateKey_fp(FILE *fp
, const DSA
*dsa
)
323 return ASN1_i2d_fp_of(DSA
, i2d_DSAPrivateKey
, fp
, dsa
);
326 DSA
*d2i_DSA_PUBKEY_fp(FILE *fp
, DSA
**dsa
)
328 return ASN1_d2i_fp_of(DSA
, DSA_new
, d2i_DSA_PUBKEY
, fp
, dsa
);
331 int i2d_DSA_PUBKEY_fp(FILE *fp
, const DSA
*dsa
)
333 return ASN1_i2d_fp_of(DSA
, i2d_DSA_PUBKEY
, fp
, dsa
);
337 DSA
*d2i_DSAPrivateKey_bio(BIO
*bp
, DSA
**dsa
)
339 return ASN1_d2i_bio_of(DSA
, DSA_new
, d2i_DSAPrivateKey
, bp
, dsa
);
342 int i2d_DSAPrivateKey_bio(BIO
*bp
, const DSA
*dsa
)
344 return ASN1_i2d_bio_of(DSA
, i2d_DSAPrivateKey
, bp
, dsa
);
347 DSA
*d2i_DSA_PUBKEY_bio(BIO
*bp
, DSA
**dsa
)
349 return ASN1_d2i_bio_of(DSA
, DSA_new
, d2i_DSA_PUBKEY
, bp
, dsa
);
352 int i2d_DSA_PUBKEY_bio(BIO
*bp
, const DSA
*dsa
)
354 return ASN1_i2d_bio_of(DSA
, i2d_DSA_PUBKEY
, bp
, dsa
);
359 #ifndef OPENSSL_NO_EC
360 # ifndef OPENSSL_NO_STDIO
361 EC_KEY
*d2i_EC_PUBKEY_fp(FILE *fp
, EC_KEY
**eckey
)
363 return ASN1_d2i_fp_of(EC_KEY
, EC_KEY_new
, d2i_EC_PUBKEY
, fp
, eckey
);
366 int i2d_EC_PUBKEY_fp(FILE *fp
, const EC_KEY
*eckey
)
368 return ASN1_i2d_fp_of(EC_KEY
, i2d_EC_PUBKEY
, fp
, eckey
);
371 EC_KEY
*d2i_ECPrivateKey_fp(FILE *fp
, EC_KEY
**eckey
)
373 return ASN1_d2i_fp_of(EC_KEY
, EC_KEY_new
, d2i_ECPrivateKey
, fp
, eckey
);
376 int i2d_ECPrivateKey_fp(FILE *fp
, const EC_KEY
*eckey
)
378 return ASN1_i2d_fp_of(EC_KEY
, i2d_ECPrivateKey
, fp
, eckey
);
381 EC_KEY
*d2i_EC_PUBKEY_bio(BIO
*bp
, EC_KEY
**eckey
)
383 return ASN1_d2i_bio_of(EC_KEY
, EC_KEY_new
, d2i_EC_PUBKEY
, bp
, eckey
);
386 int i2d_EC_PUBKEY_bio(BIO
*bp
, const EC_KEY
*ecdsa
)
388 return ASN1_i2d_bio_of(EC_KEY
, i2d_EC_PUBKEY
, bp
, ecdsa
);
391 EC_KEY
*d2i_ECPrivateKey_bio(BIO
*bp
, EC_KEY
**eckey
)
393 return ASN1_d2i_bio_of(EC_KEY
, EC_KEY_new
, d2i_ECPrivateKey
, bp
, eckey
);
396 int i2d_ECPrivateKey_bio(BIO
*bp
, const EC_KEY
*eckey
)
398 return ASN1_i2d_bio_of(EC_KEY
, i2d_ECPrivateKey
, bp
, eckey
);
402 int X509_pubkey_digest(const X509
*data
, const EVP_MD
*type
,
403 unsigned char *md
, unsigned int *len
)
405 ASN1_BIT_STRING
*key
;
406 key
= X509_get0_pubkey_bitstr(data
);
409 return EVP_Digest(key
->data
, key
->length
, md
, len
, type
, NULL
);
412 int X509_digest(const X509
*cert
, const EVP_MD
*md
, unsigned char *data
,
415 if (EVP_MD_is_a(md
, SN_sha1
) && (cert
->ex_flags
& EXFLAG_SET
) != 0
416 && (cert
->ex_flags
& EXFLAG_NO_FINGERPRINT
) == 0) {
417 /* Asking for SHA1 and we already computed it. */
419 *len
= sizeof(cert
->sha1_hash
);
420 memcpy(data
, cert
->sha1_hash
, sizeof(cert
->sha1_hash
));
423 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509
), md
, (char *)cert
,
424 data
, len
, cert
->libctx
, cert
->propq
);
427 /* calculate cert digest using the same hash algorithm as in its signature */
428 ASN1_OCTET_STRING
*X509_digest_sig(const X509
*cert
)
431 unsigned char hash
[EVP_MAX_MD_SIZE
];
433 const EVP_MD
*md
= NULL
;
434 ASN1_OCTET_STRING
*new = NULL
;
437 ERR_raise(ERR_LIB_X509
, ERR_R_PASSED_NULL_PARAMETER
);
441 if (!OBJ_find_sigid_algs(X509_get_signature_nid(cert
), &md_NID
, NULL
)
442 || (md
= EVP_get_digestbynid(md_NID
)) == NULL
) {
443 ERR_raise(ERR_LIB_CMP
, X509_R_UNSUPPORTED_ALGORITHM
);
446 if (!X509_digest(cert
, md
, hash
, &len
)
447 || (new = ASN1_OCTET_STRING_new()) == NULL
)
449 if (!(ASN1_OCTET_STRING_set(new, hash
, len
))) {
450 ASN1_OCTET_STRING_free(new);
456 int X509_CRL_digest(const X509_CRL
*data
, const EVP_MD
*type
,
457 unsigned char *md
, unsigned int *len
)
460 ERR_raise(ERR_LIB_X509
, ERR_R_PASSED_NULL_PARAMETER
);
463 if (EVP_MD_is_a(type
, SN_sha1
)
464 && (data
->flags
& EXFLAG_SET
) != 0
465 && (data
->flags
& EXFLAG_NO_FINGERPRINT
) == 0) {
466 /* Asking for SHA1; always computed in CRL d2i. */
468 *len
= sizeof(data
->sha1_hash
);
469 memcpy(md
, data
->sha1_hash
, sizeof(data
->sha1_hash
));
472 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509_CRL
), type
, (char *)data
,
473 md
, len
, data
->libctx
, data
->propq
);
476 int X509_REQ_digest(const X509_REQ
*data
, const EVP_MD
*type
,
477 unsigned char *md
, unsigned int *len
)
479 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509_REQ
), type
, (char *)data
,
480 md
, len
, data
->libctx
, data
->propq
);
483 int X509_NAME_digest(const X509_NAME
*data
, const EVP_MD
*type
,
484 unsigned char *md
, unsigned int *len
)
486 return ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME
), type
, (char *)data
,
490 int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL
*data
,
491 const EVP_MD
*type
, unsigned char *md
,
494 return ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL
), type
,
495 (char *)data
, md
, len
);
498 #ifndef OPENSSL_NO_STDIO
499 X509_SIG
*d2i_PKCS8_fp(FILE *fp
, X509_SIG
**p8
)
501 return ASN1_d2i_fp_of(X509_SIG
, X509_SIG_new
, d2i_X509_SIG
, fp
, p8
);
504 int i2d_PKCS8_fp(FILE *fp
, const X509_SIG
*p8
)
506 return ASN1_i2d_fp_of(X509_SIG
, i2d_X509_SIG
, fp
, p8
);
510 X509_SIG
*d2i_PKCS8_bio(BIO
*bp
, X509_SIG
**p8
)
512 return ASN1_d2i_bio_of(X509_SIG
, X509_SIG_new
, d2i_X509_SIG
, bp
, p8
);
515 int i2d_PKCS8_bio(BIO
*bp
, const X509_SIG
*p8
)
517 return ASN1_i2d_bio_of(X509_SIG
, i2d_X509_SIG
, bp
, p8
);
520 #ifndef OPENSSL_NO_STDIO
521 X509_PUBKEY
*d2i_X509_PUBKEY_fp(FILE *fp
, X509_PUBKEY
**xpk
)
523 return ASN1_d2i_fp_of(X509_PUBKEY
, X509_PUBKEY_new
, d2i_X509_PUBKEY
,
527 int i2d_X509_PUBKEY_fp(FILE *fp
, const X509_PUBKEY
*xpk
)
529 return ASN1_i2d_fp_of(X509_PUBKEY
, i2d_X509_PUBKEY
, fp
, xpk
);
533 X509_PUBKEY
*d2i_X509_PUBKEY_bio(BIO
*bp
, X509_PUBKEY
**xpk
)
535 return ASN1_d2i_bio_of(X509_PUBKEY
, X509_PUBKEY_new
, d2i_X509_PUBKEY
,
539 int i2d_X509_PUBKEY_bio(BIO
*bp
, const X509_PUBKEY
*xpk
)
541 return ASN1_i2d_bio_of(X509_PUBKEY
, i2d_X509_PUBKEY
, bp
, xpk
);
544 #ifndef OPENSSL_NO_STDIO
545 PKCS8_PRIV_KEY_INFO
*d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp
,
546 PKCS8_PRIV_KEY_INFO
**p8inf
)
548 return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO
, PKCS8_PRIV_KEY_INFO_new
,
549 d2i_PKCS8_PRIV_KEY_INFO
, fp
, p8inf
);
552 int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp
, const PKCS8_PRIV_KEY_INFO
*p8inf
)
554 return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO
, i2d_PKCS8_PRIV_KEY_INFO
, fp
,
558 int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp
, const EVP_PKEY
*key
)
560 PKCS8_PRIV_KEY_INFO
*p8inf
;
563 p8inf
= EVP_PKEY2PKCS8(key
);
566 ret
= i2d_PKCS8_PRIV_KEY_INFO_fp(fp
, p8inf
);
567 PKCS8_PRIV_KEY_INFO_free(p8inf
);
571 int i2d_PrivateKey_fp(FILE *fp
, const EVP_PKEY
*pkey
)
573 return ASN1_i2d_fp_of(EVP_PKEY
, i2d_PrivateKey
, fp
, pkey
);
576 EVP_PKEY
*d2i_PrivateKey_fp(FILE *fp
, EVP_PKEY
**a
)
578 return ASN1_d2i_fp_of(EVP_PKEY
, EVP_PKEY_new
, d2i_AutoPrivateKey
, fp
, a
);
581 EVP_PKEY
*d2i_PrivateKey_ex_fp(FILE *fp
, EVP_PKEY
**a
, OSSL_LIB_CTX
*libctx
,
587 if ((b
= BIO_new(BIO_s_file())) == NULL
) {
588 ERR_raise(ERR_LIB_X509
, ERR_R_BUF_LIB
);
591 BIO_set_fp(b
, fp
, BIO_NOCLOSE
);
592 ret
= d2i_PrivateKey_ex_bio(b
, a
, libctx
, propq
);
597 int i2d_PUBKEY_fp(FILE *fp
, const EVP_PKEY
*pkey
)
599 return ASN1_i2d_fp_of(EVP_PKEY
, i2d_PUBKEY
, fp
, pkey
);
602 EVP_PKEY
*d2i_PUBKEY_fp(FILE *fp
, EVP_PKEY
**a
)
604 return ASN1_d2i_fp_of(EVP_PKEY
, EVP_PKEY_new
, d2i_PUBKEY
, fp
, a
);
609 PKCS8_PRIV_KEY_INFO
*d2i_PKCS8_PRIV_KEY_INFO_bio(BIO
*bp
,
610 PKCS8_PRIV_KEY_INFO
**p8inf
)
612 return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO
, PKCS8_PRIV_KEY_INFO_new
,
613 d2i_PKCS8_PRIV_KEY_INFO
, bp
, p8inf
);
616 int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO
*bp
, const PKCS8_PRIV_KEY_INFO
*p8inf
)
618 return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO
, i2d_PKCS8_PRIV_KEY_INFO
, bp
,
622 int i2d_PKCS8PrivateKeyInfo_bio(BIO
*bp
, const EVP_PKEY
*key
)
624 PKCS8_PRIV_KEY_INFO
*p8inf
;
627 p8inf
= EVP_PKEY2PKCS8(key
);
630 ret
= i2d_PKCS8_PRIV_KEY_INFO_bio(bp
, p8inf
);
631 PKCS8_PRIV_KEY_INFO_free(p8inf
);
635 int i2d_PrivateKey_bio(BIO
*bp
, const EVP_PKEY
*pkey
)
637 return ASN1_i2d_bio_of(EVP_PKEY
, i2d_PrivateKey
, bp
, pkey
);
640 EVP_PKEY
*d2i_PrivateKey_bio(BIO
*bp
, EVP_PKEY
**a
)
642 return ASN1_d2i_bio_of(EVP_PKEY
, EVP_PKEY_new
, d2i_AutoPrivateKey
, bp
, a
);
645 EVP_PKEY
*d2i_PrivateKey_ex_bio(BIO
*bp
, EVP_PKEY
**a
, OSSL_LIB_CTX
*libctx
,
649 const unsigned char *p
;
653 len
= asn1_d2i_read_bio(bp
, &b
);
657 p
= (unsigned char *)b
->data
;
658 ret
= d2i_AutoPrivateKey_ex(a
, &p
, len
, libctx
, propq
);
664 int i2d_PUBKEY_bio(BIO
*bp
, const EVP_PKEY
*pkey
)
666 return ASN1_i2d_bio_of(EVP_PKEY
, i2d_PUBKEY
, bp
, pkey
);
669 EVP_PKEY
*d2i_PUBKEY_bio(BIO
*bp
, EVP_PKEY
**a
)
671 return ASN1_d2i_bio_of(EVP_PKEY
, EVP_PKEY_new
, d2i_PUBKEY
, bp
, a
);