VirtualBox

source: vbox/trunk/src/libs/openssl-3.0.1/crypto/x509/x_all.c@ 94096

最後變更 在這個檔案從94096是 94082,由 vboxsync 提交於 3 年 前

libs/openssl-3.0.1: started applying and adjusting our OpenSSL changes to 3.0.1. bugref:10128

檔案大小: 20.9 KB
 
1/*
2 * Copyright 1995-2021 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 <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"
29#include "crypto/rsa.h"
30
31int X509_verify(X509 *a, EVP_PKEY *r)
32{
33 if (X509_ALGOR_cmp(&a->sig_alg, &a->cert_info.signature))
34 return 0;
35
36 return ASN1_item_verify_ex(ASN1_ITEM_rptr(X509_CINF), &a->sig_alg,
37 &a->signature, &a->cert_info,
38 a->distinguishing_id, r, a->libctx, a->propq);
39}
40
41int X509_REQ_verify_ex(X509_REQ *a, EVP_PKEY *r, OSSL_LIB_CTX *libctx,
42 const char *propq)
43{
44 return ASN1_item_verify_ex(ASN1_ITEM_rptr(X509_REQ_INFO), &a->sig_alg,
45 a->signature, &a->req_info, a->distinguishing_id,
46 r, libctx, propq);
47}
48
49int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
50{
51 return X509_REQ_verify_ex(a, r, NULL, NULL);
52}
53
54int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
55{
56 return ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
57 &a->sig_algor, a->signature, a->spkac, r);
58}
59
60int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
61{
62 x->cert_info.enc.modified = 1;
63 return ASN1_item_sign_ex(ASN1_ITEM_rptr(X509_CINF), &x->cert_info.signature,
64 &x->sig_alg, &x->signature, &x->cert_info, NULL,
65 pkey, md, x->libctx, x->propq);
66}
67
68int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
69{
70 x->cert_info.enc.modified = 1;
71 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
72 &x->cert_info.signature,
73 &x->sig_alg, &x->signature, &x->cert_info, ctx);
74}
75
76static ASN1_VALUE *simple_get_asn1(const char *url, BIO *bio, BIO *rbio,
77 int timeout, const ASN1_ITEM *it)
78{
79 BIO *mem = OSSL_HTTP_get(url, NULL /* proxy */, NULL /* no_proxy */,
80 bio, rbio, NULL /* cb */ , NULL /* arg */,
81 1024 /* buf_size */, NULL /* headers */,
82 NULL /* expected_ct */, 1 /* expect_asn1 */,
83 OSSL_HTTP_DEFAULT_MAX_RESP_LEN, timeout);
84 ASN1_VALUE *res = ASN1_item_d2i_bio(it, mem, NULL);
85
86 BIO_free(mem);
87 return res;
88}
89
90X509 *X509_load_http(const char *url, BIO *bio, BIO *rbio, int timeout)
91{
92 return (X509 *)simple_get_asn1(url, bio, rbio, timeout,
93 ASN1_ITEM_rptr(X509));
94}
95
96int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
97{
98 return ASN1_item_sign_ex(ASN1_ITEM_rptr(X509_REQ_INFO), &x->sig_alg, NULL,
99 x->signature, &x->req_info, NULL,
100 pkey, md, x->libctx, x->propq);
101}
102
103int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
104{
105 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
106 &x->sig_alg, NULL, x->signature, &x->req_info,
107 ctx);
108}
109
110int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
111{
112 x->crl.enc.modified = 1;
113 return ASN1_item_sign_ex(ASN1_ITEM_rptr(X509_CRL_INFO), &x->crl.sig_alg,
114 &x->sig_alg, &x->signature, &x->crl, NULL,
115 pkey, md, x->libctx, x->propq);
116}
117
118int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
119{
120 x->crl.enc.modified = 1;
121 return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
122 &x->crl.sig_alg, &x->sig_alg, &x->signature,
123 &x->crl, ctx);
124}
125
126X509_CRL *X509_CRL_load_http(const char *url, BIO *bio, BIO *rbio, int timeout)
127{
128 return (X509_CRL *)simple_get_asn1(url, bio, rbio, timeout,
129 ASN1_ITEM_rptr(X509_CRL));
130}
131
132int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
133{
134 return ASN1_item_sign_ex(ASN1_ITEM_rptr(NETSCAPE_SPKAC), &x->sig_algor, NULL,
135 x->signature, x->spkac, NULL, pkey, md, NULL, NULL);
136}
137
138#ifndef OPENSSL_NO_STDIO
139X509 *d2i_X509_fp(FILE *fp, X509 **x509)
140{
141 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
142}
143
144int i2d_X509_fp(FILE *fp, const X509 *x509)
145{
146 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
147}
148#endif
149
150X509 *d2i_X509_bio(BIO *bp, X509 **x509)
151{
152 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
153}
154
155int i2d_X509_bio(BIO *bp, const X509 *x509)
156{
157 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
158}
159
160#ifndef OPENSSL_NO_STDIO
161X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
162{
163 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
164}
165
166int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl)
167{
168 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
169}
170#endif
171
172X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
173{
174 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
175}
176
177int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl)
178{
179 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
180}
181
182#ifndef OPENSSL_NO_STDIO
183PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
184{
185 PKCS7 *ret;
186 OSSL_LIB_CTX *libctx = NULL;
187 const char *propq = NULL;
188
189 if (p7 != NULL && *p7 != NULL) {
190 libctx = (*p7)->ctx.libctx;
191 propq = (*p7)->ctx.propq;
192 }
193
194 ret = ASN1_item_d2i_fp_ex(ASN1_ITEM_rptr(PKCS7), fp, p7, libctx, propq);
195 if (ret != NULL)
196 ossl_pkcs7_resolve_libctx(ret);
197 return ret;
198}
199
200int i2d_PKCS7_fp(FILE *fp, const PKCS7 *p7)
201{
202 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
203}
204#endif
205
206PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
207{
208 PKCS7 *ret;
209 OSSL_LIB_CTX *libctx = NULL;
210 const char *propq = NULL;
211
212 if (p7 != NULL && *p7 != NULL) {
213 libctx = (*p7)->ctx.libctx;
214 propq = (*p7)->ctx.propq;
215 }
216
217
218 ret = ASN1_item_d2i_bio_ex(ASN1_ITEM_rptr(PKCS7), bp, p7, libctx, propq);
219 if (ret != NULL)
220 ossl_pkcs7_resolve_libctx(ret);
221 return ret;
222}
223
224int i2d_PKCS7_bio(BIO *bp, const PKCS7 *p7)
225{
226 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
227}
228
229#ifndef OPENSSL_NO_STDIO
230X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
231{
232 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
233}
234
235int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req)
236{
237 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
238}
239#endif
240
241X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
242{
243 OSSL_LIB_CTX *libctx = NULL;
244 const char *propq = NULL;
245
246 if (req != NULL && *req != NULL) {
247 libctx = (*req)->libctx;
248 propq = (*req)->propq;
249 }
250
251 return ASN1_item_d2i_bio_ex(ASN1_ITEM_rptr(X509_REQ), bp, req, libctx, propq);
252}
253
254int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req)
255{
256 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
257}
258
259#ifndef OPENSSL_NO_STDIO
260RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
261{
262 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
263}
264
265int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa)
266{
267 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
268}
269
270RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
271{
272 return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
273}
274
275RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
276{
277 return ASN1_d2i_fp((void *(*)(void))
278 RSA_new, (D2I_OF(void)) d2i_RSA_PUBKEY, fp,
279 (void **)rsa);
280}
281
282int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa)
283{
284 return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
285}
286
287int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa)
288{
289 return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY, fp, rsa);
290}
291#endif
292
293RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
294{
295 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
296}
297
298int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa)
299{
300 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
301}
302
303RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
304{
305 return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
306}
307
308RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
309{
310 return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSA_PUBKEY, bp, rsa);
311}
312
313int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa)
314{
315 return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
316}
317
318int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa)
319{
320 return ASN1_i2d_bio_of(RSA, i2d_RSA_PUBKEY, bp, rsa);
321}
322
323#ifndef OPENSSL_NO_DSA
324# ifndef OPENSSL_NO_STDIO
325DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
326{
327 return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSAPrivateKey, fp, dsa);
328}
329
330int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa)
331{
332 return ASN1_i2d_fp_of(DSA, i2d_DSAPrivateKey, fp, dsa);
333}
334
335DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
336{
337 return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSA_PUBKEY, fp, dsa);
338}
339
340int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa)
341{
342 return ASN1_i2d_fp_of(DSA, i2d_DSA_PUBKEY, fp, dsa);
343}
344# endif
345
346DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
347{
348 return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSAPrivateKey, bp, dsa);
349}
350
351int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa)
352{
353 return ASN1_i2d_bio_of(DSA, i2d_DSAPrivateKey, bp, dsa);
354}
355
356DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
357{
358 return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSA_PUBKEY, bp, dsa);
359}
360
361int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa)
362{
363 return ASN1_i2d_bio_of(DSA, i2d_DSA_PUBKEY, bp, dsa);
364}
365
366#endif
367
368#ifndef OPENSSL_NO_EC
369# ifndef OPENSSL_NO_STDIO
370EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
371{
372 return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, fp, eckey);
373}
374
375int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey)
376{
377 return ASN1_i2d_fp_of(EC_KEY, i2d_EC_PUBKEY, fp, eckey);
378}
379
380EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
381{
382 return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, fp, eckey);
383}
384
385int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey)
386{
387 return ASN1_i2d_fp_of(EC_KEY, i2d_ECPrivateKey, fp, eckey);
388}
389# endif
390EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
391{
392 return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, bp, eckey);
393}
394
395int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *ecdsa)
396{
397 return ASN1_i2d_bio_of(EC_KEY, i2d_EC_PUBKEY, bp, ecdsa);
398}
399
400EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
401{
402 return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, bp, eckey);
403}
404
405int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey)
406{
407 return ASN1_i2d_bio_of(EC_KEY, i2d_ECPrivateKey, bp, eckey);
408}
409#endif
410
411int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
412 unsigned char *md, unsigned int *len)
413{
414 ASN1_BIT_STRING *key;
415 key = X509_get0_pubkey_bitstr(data);
416 if (!key)
417 return 0;
418 return EVP_Digest(key->data, key->length, md, len, type, NULL);
419}
420
421int X509_digest(const X509 *cert, const EVP_MD *md, unsigned char *data,
422 unsigned int *len)
423{
424 if (EVP_MD_is_a(md, SN_sha1) && (cert->ex_flags & EXFLAG_SET) != 0
425 && (cert->ex_flags & EXFLAG_NO_FINGERPRINT) == 0) {
426 /* Asking for SHA1 and we already computed it. */
427 if (len != NULL)
428 *len = sizeof(cert->sha1_hash);
429 memcpy(data, cert->sha1_hash, sizeof(cert->sha1_hash));
430 return 1;
431 }
432 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509), md, (char *)cert,
433 data, len, cert->libctx, cert->propq);
434}
435
436/* calculate cert digest using the same hash algorithm as in its signature */
437ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert,
438 EVP_MD **md_used, int *md_is_fallback)
439{
440 unsigned int len;
441 unsigned char hash[EVP_MAX_MD_SIZE];
442 int mdnid, pknid;
443 EVP_MD *md = NULL;
444 const char *md_name;
445 ASN1_OCTET_STRING *new;
446
447 if (md_used != NULL)
448 *md_used = NULL;
449 if (md_is_fallback != NULL)
450 *md_is_fallback = 0;
451
452 if (cert == NULL) {
453 ERR_raise(ERR_LIB_X509, ERR_R_PASSED_NULL_PARAMETER);
454 return NULL;
455 }
456
457 if (!OBJ_find_sigid_algs(X509_get_signature_nid(cert), &mdnid, &pknid)) {
458 ERR_raise(ERR_LIB_X509, X509_R_UNKNOWN_SIGID_ALGS);
459 return NULL;
460 }
461
462 if (mdnid == NID_undef) {
463 if (pknid == EVP_PKEY_RSA_PSS) {
464 RSA_PSS_PARAMS *pss = ossl_rsa_pss_decode(&cert->sig_alg);
465 const EVP_MD *mgf1md, *mmd = NULL;
466 int saltlen, trailerfield;
467
468 if (pss == NULL
469 || !ossl_rsa_pss_get_param_unverified(pss, &mmd, &mgf1md,
470 &saltlen,
471 &trailerfield)
472 || mmd == NULL) {
473 RSA_PSS_PARAMS_free(pss);
474 ERR_raise(ERR_LIB_X509, X509_R_UNSUPPORTED_ALGORITHM);
475 return NULL;
476 }
477 RSA_PSS_PARAMS_free(pss);
478 /* Fetch explicitly and do not fallback */
479 if ((md = EVP_MD_fetch(cert->libctx, EVP_MD_get0_name(mmd),
480 cert->propq)) == NULL)
481 /* Error code from fetch is sufficient */
482 return NULL;
483 } else if (pknid != NID_undef) {
484 /* A known algorithm, but without a digest */
485 switch (pknid) {
486 case NID_ED25519: /* Follow CMS default given in RFC8419 */
487 md_name = "SHA512";
488 break;
489 case NID_ED448: /* Follow CMS default given in RFC8419 */
490 md_name = "SHAKE256";
491 break;
492 default: /* Fall back to SHA-256 */
493 md_name = "SHA256";
494 break;
495 }
496 if ((md = EVP_MD_fetch(cert->libctx, md_name,
497 cert->propq)) == NULL)
498 return NULL;
499 if (md_is_fallback != NULL)
500 *md_is_fallback = 1;
501 } else {
502 /* A completely unknown algorithm */
503 ERR_raise(ERR_LIB_X509, X509_R_UNSUPPORTED_ALGORITHM);
504 return NULL;
505 }
506 } else if ((md = EVP_MD_fetch(cert->libctx, OBJ_nid2sn(mdnid),
507 cert->propq)) == NULL
508 && (md = (EVP_MD *)EVP_get_digestbynid(mdnid)) == NULL) {
509 ERR_raise(ERR_LIB_X509, X509_R_UNSUPPORTED_ALGORITHM);
510 return NULL;
511 }
512 if (!X509_digest(cert, md, hash, &len)
513 || (new = ASN1_OCTET_STRING_new()) == NULL)
514 goto err;
515 if ((ASN1_OCTET_STRING_set(new, hash, len))) {
516 if (md_used != NULL)
517 *md_used = md;
518 else
519 EVP_MD_free(md);
520 return new;
521 }
522 ASN1_OCTET_STRING_free(new);
523 err:
524 EVP_MD_free(md);
525 return NULL;
526}
527
528int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
529 unsigned char *md, unsigned int *len)
530{
531 if (type == NULL) {
532 ERR_raise(ERR_LIB_X509, ERR_R_PASSED_NULL_PARAMETER);
533 return 0;
534 }
535 if (EVP_MD_is_a(type, SN_sha1)
536 && (data->flags & EXFLAG_SET) != 0
537 && (data->flags & EXFLAG_NO_FINGERPRINT) == 0) {
538 /* Asking for SHA1; always computed in CRL d2i. */
539 if (len != NULL)
540 *len = sizeof(data->sha1_hash);
541 memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
542 return 1;
543 }
544 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509_CRL), type, (char *)data,
545 md, len, data->libctx, data->propq);
546}
547
548int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
549 unsigned char *md, unsigned int *len)
550{
551 return ossl_asn1_item_digest_ex(ASN1_ITEM_rptr(X509_REQ), type, (char *)data,
552 md, len, data->libctx, data->propq);
553}
554
555int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
556 unsigned char *md, unsigned int *len)
557{
558 return ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME), type, (char *)data,
559 md, len);
560}
561
562int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
563 const EVP_MD *type, unsigned char *md,
564 unsigned int *len)
565{
566 return ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL), type,
567 (char *)data, md, len);
568}
569
570#ifndef OPENSSL_NO_STDIO
571X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
572{
573 return ASN1_d2i_fp_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, fp, p8);
574}
575
576int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8)
577{
578 return ASN1_i2d_fp_of(X509_SIG, i2d_X509_SIG, fp, p8);
579}
580#endif
581
582X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
583{
584 return ASN1_d2i_bio_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, bp, p8);
585}
586
587int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8)
588{
589 return ASN1_i2d_bio_of(X509_SIG, i2d_X509_SIG, bp, p8);
590}
591
592#ifndef OPENSSL_NO_STDIO
593X509_PUBKEY *d2i_X509_PUBKEY_fp(FILE *fp, X509_PUBKEY **xpk)
594{
595 return ASN1_d2i_fp_of(X509_PUBKEY, X509_PUBKEY_new, d2i_X509_PUBKEY,
596 fp, xpk);
597}
598
599int i2d_X509_PUBKEY_fp(FILE *fp, const X509_PUBKEY *xpk)
600{
601 return ASN1_i2d_fp_of(X509_PUBKEY, i2d_X509_PUBKEY, fp, xpk);
602}
603#endif
604
605X509_PUBKEY *d2i_X509_PUBKEY_bio(BIO *bp, X509_PUBKEY **xpk)
606{
607 return ASN1_d2i_bio_of(X509_PUBKEY, X509_PUBKEY_new, d2i_X509_PUBKEY,
608 bp, xpk);
609}
610
611int i2d_X509_PUBKEY_bio(BIO *bp, const X509_PUBKEY *xpk)
612{
613 return ASN1_i2d_bio_of(X509_PUBKEY, i2d_X509_PUBKEY, bp, xpk);
614}
615
616#ifndef OPENSSL_NO_STDIO
617PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
618 PKCS8_PRIV_KEY_INFO **p8inf)
619{
620 return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
621 d2i_PKCS8_PRIV_KEY_INFO, fp, p8inf);
622}
623
624int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, const PKCS8_PRIV_KEY_INFO *p8inf)
625{
626 return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, fp,
627 p8inf);
628}
629
630int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key)
631{
632 PKCS8_PRIV_KEY_INFO *p8inf;
633 int ret;
634
635 p8inf = EVP_PKEY2PKCS8(key);
636 if (p8inf == NULL)
637 return 0;
638 ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
639 PKCS8_PRIV_KEY_INFO_free(p8inf);
640 return ret;
641}
642
643int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey)
644{
645 return ASN1_i2d_fp_of(EVP_PKEY, i2d_PrivateKey, fp, pkey);
646}
647
648EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
649{
650 return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, fp, a);
651}
652
653EVP_PKEY *d2i_PrivateKey_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx,
654 const char *propq)
655{
656 BIO *b;
657 void *ret;
658
659 if ((b = BIO_new(BIO_s_file())) == NULL) {
660 ERR_raise(ERR_LIB_X509, ERR_R_BUF_LIB);
661 return NULL;
662 }
663 BIO_set_fp(b, fp, BIO_NOCLOSE);
664 ret = d2i_PrivateKey_ex_bio(b, a, libctx, propq);
665 BIO_free(b);
666 return ret;
667}
668
669int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey)
670{
671 return ASN1_i2d_fp_of(EVP_PKEY, i2d_PUBKEY, fp, pkey);
672}
673
674EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
675{
676 return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, fp, a);
677}
678
679#endif
680
681PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
682 PKCS8_PRIV_KEY_INFO **p8inf)
683{
684 return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
685 d2i_PKCS8_PRIV_KEY_INFO, bp, p8inf);
686}
687
688int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf)
689{
690 return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, bp,
691 p8inf);
692}
693
694int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key)
695{
696 PKCS8_PRIV_KEY_INFO *p8inf;
697 int ret;
698
699 p8inf = EVP_PKEY2PKCS8(key);
700 if (p8inf == NULL)
701 return 0;
702 ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
703 PKCS8_PRIV_KEY_INFO_free(p8inf);
704 return ret;
705}
706
707int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey)
708{
709 return ASN1_i2d_bio_of(EVP_PKEY, i2d_PrivateKey, bp, pkey);
710}
711
712EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
713{
714 return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, bp, a);
715}
716
717EVP_PKEY *d2i_PrivateKey_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx,
718 const char *propq)
719{
720 BUF_MEM *b = NULL;
721 const unsigned char *p;
722 void *ret = NULL;
723 int len;
724
725 len = asn1_d2i_read_bio(bp, &b);
726 if (len < 0)
727 goto err;
728
729 p = (unsigned char *)b->data;
730 ret = d2i_AutoPrivateKey_ex(a, &p, len, libctx, propq);
731 err:
732 BUF_MEM_free(b);
733 return ret;
734}
735
736int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey)
737{
738 return ASN1_i2d_bio_of(EVP_PKEY, i2d_PUBKEY, bp, pkey);
739}
740
741EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
742{
743 return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, bp, a);
744}
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette