Coverage Report

Created: 2022-11-30 06:20

/src/openssl/crypto/x509/x_all.c
Line
Count
Source (jump to first uncovered line)
1
/* crypto/x509/x_all.c */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3
 * All rights reserved.
4
 *
5
 * This package is an SSL implementation written
6
 * by Eric Young (eay@cryptsoft.com).
7
 * The implementation was written so as to conform with Netscapes SSL.
8
 *
9
 * This library is free for commercial and non-commercial use as long as
10
 * the following conditions are aheared to.  The following conditions
11
 * apply to all code found in this distribution, be it the RC4, RSA,
12
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13
 * included with this distribution is covered by the same copyright terms
14
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15
 *
16
 * Copyright remains Eric Young's, and as such any Copyright notices in
17
 * the code are not to be removed.
18
 * If this package is used in a product, Eric Young should be given attribution
19
 * as the author of the parts of the library used.
20
 * This can be in the form of a textual message at program startup or
21
 * in documentation (online or textual) provided with the package.
22
 *
23
 * Redistribution and use in source and binary forms, with or without
24
 * modification, are permitted provided that the following conditions
25
 * are met:
26
 * 1. Redistributions of source code must retain the copyright
27
 *    notice, this list of conditions and the following disclaimer.
28
 * 2. Redistributions in binary form must reproduce the above copyright
29
 *    notice, this list of conditions and the following disclaimer in the
30
 *    documentation and/or other materials provided with the distribution.
31
 * 3. All advertising materials mentioning features or use of this software
32
 *    must display the following acknowledgement:
33
 *    "This product includes cryptographic software written by
34
 *     Eric Young (eay@cryptsoft.com)"
35
 *    The word 'cryptographic' can be left out if the rouines from the library
36
 *    being used are not cryptographic related :-).
37
 * 4. If you include any Windows specific code (or a derivative thereof) from
38
 *    the apps directory (application code) you must include an acknowledgement:
39
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40
 *
41
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51
 * SUCH DAMAGE.
52
 *
53
 * The licence and distribution terms for any publically available version or
54
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55
 * copied and put under another distribution licence
56
 * [including the GNU Public Licence.]
57
 */
58
59
#include <stdio.h>
60
#include <openssl/stack.h>
61
#include "cryptlib.h"
62
#include <openssl/buffer.h>
63
#include <openssl/asn1.h>
64
#include <openssl/evp.h>
65
#include <openssl/x509.h>
66
#include <openssl/ocsp.h>
67
#ifndef OPENSSL_NO_RSA
68
# include <openssl/rsa.h>
69
#endif
70
#ifndef OPENSSL_NO_DSA
71
# include <openssl/dsa.h>
72
#endif
73
74
int X509_verify(X509 *a, EVP_PKEY *r)
75
0
{
76
0
    if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature))
77
0
        return 0;
78
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg,
79
0
                             a->signature, a->cert_info, r));
80
0
}
81
82
int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
83
0
{
84
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
85
0
                             a->sig_alg, a->signature, a->req_info, r));
86
0
}
87
88
int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
89
0
{
90
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
91
0
                             a->sig_algor, a->signature, a->spkac, r));
92
0
}
93
94
int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
95
0
{
96
0
    x->cert_info->enc.modified = 1;
97
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), x->cert_info->signature,
98
0
                           x->sig_alg, x->signature, x->cert_info, pkey, md));
99
0
}
100
101
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
102
0
{
103
0
    x->cert_info->enc.modified = 1;
104
0
    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
105
0
                              x->cert_info->signature,
106
0
                              x->sig_alg, x->signature, x->cert_info, ctx);
107
0
}
108
109
int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert)
110
0
{
111
0
    return OCSP_REQ_CTX_nbio_d2i(rctx,
112
0
                                 (ASN1_VALUE **)pcert, ASN1_ITEM_rptr(X509));
113
0
}
114
115
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
116
0
{
117
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), x->sig_alg, NULL,
118
0
                           x->signature, x->req_info, pkey, md));
119
0
}
120
121
int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
122
0
{
123
0
    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
124
0
                              x->sig_alg, NULL, x->signature, x->req_info,
125
0
                              ctx);
126
0
}
127
128
int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
129
0
{
130
0
    x->crl->enc.modified = 1;
131
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), x->crl->sig_alg,
132
0
                           x->sig_alg, x->signature, x->crl, pkey, md));
133
0
}
134
135
int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
136
0
{
137
0
    x->crl->enc.modified = 1;
138
0
    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
139
0
                              x->crl->sig_alg, x->sig_alg, x->signature,
140
0
                              x->crl, ctx);
141
0
}
142
143
int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl)
144
0
{
145
0
    return OCSP_REQ_CTX_nbio_d2i(rctx,
146
0
                                 (ASN1_VALUE **)pcrl,
147
0
                                 ASN1_ITEM_rptr(X509_CRL));
148
0
}
149
150
int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
151
0
{
152
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), x->sig_algor, NULL,
153
0
                           x->signature, x->spkac, pkey, md));
154
0
}
155
156
#ifndef OPENSSL_NO_FP_API
157
X509 *d2i_X509_fp(FILE *fp, X509 **x509)
158
0
{
159
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
160
0
}
161
162
int i2d_X509_fp(FILE *fp, X509 *x509)
163
0
{
164
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
165
0
}
166
#endif
167
168
X509 *d2i_X509_bio(BIO *bp, X509 **x509)
169
0
{
170
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
171
0
}
172
173
int i2d_X509_bio(BIO *bp, X509 *x509)
174
0
{
175
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
176
0
}
177
178
#ifndef OPENSSL_NO_FP_API
179
X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
180
0
{
181
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
182
0
}
183
184
int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
185
0
{
186
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
187
0
}
188
#endif
189
190
X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
191
0
{
192
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
193
0
}
194
195
int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
196
0
{
197
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
198
0
}
199
200
#ifndef OPENSSL_NO_FP_API
201
PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
202
0
{
203
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
204
0
}
205
206
int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
207
0
{
208
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
209
0
}
210
#endif
211
212
PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
213
0
{
214
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
215
0
}
216
217
int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
218
0
{
219
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
220
0
}
221
222
#ifndef OPENSSL_NO_FP_API
223
X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
224
0
{
225
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
226
0
}
227
228
int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
229
0
{
230
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
231
0
}
232
#endif
233
234
X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
235
0
{
236
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
237
0
}
238
239
int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
240
0
{
241
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
242
0
}
243
244
#ifndef OPENSSL_NO_RSA
245
246
# ifndef OPENSSL_NO_FP_API
247
RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
248
0
{
249
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
250
0
}
251
252
int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa)
253
0
{
254
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
255
0
}
256
257
RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
258
0
{
259
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
260
0
}
261
262
RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
263
0
{
264
0
    return ASN1_d2i_fp((void *(*)(void))
265
0
                       RSA_new, (D2I_OF(void)) d2i_RSA_PUBKEY, fp,
266
0
                       (void **)rsa);
267
0
}
268
269
int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa)
270
0
{
271
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
272
0
}
273
274
int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa)
275
0
{
276
0
    return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY, fp, rsa);
277
0
}
278
# endif
279
280
RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
281
0
{
282
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
283
0
}
284
285
int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
286
0
{
287
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
288
0
}
289
290
RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
291
0
{
292
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
293
0
}
294
295
RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
296
0
{
297
0
    return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSA_PUBKEY, bp, rsa);
298
0
}
299
300
int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
301
0
{
302
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
303
0
}
304
305
int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa)
306
0
{
307
0
    return ASN1_i2d_bio_of(RSA, i2d_RSA_PUBKEY, bp, rsa);
308
0
}
309
#endif
310
311
#ifndef OPENSSL_NO_DSA
312
# ifndef OPENSSL_NO_FP_API
313
DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
314
0
{
315
0
    return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSAPrivateKey, fp, dsa);
316
0
}
317
318
int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa)
319
0
{
320
0
    return ASN1_i2d_fp_of_const(DSA, i2d_DSAPrivateKey, fp, dsa);
321
0
}
322
323
DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
324
0
{
325
0
    return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSA_PUBKEY, fp, dsa);
326
0
}
327
328
int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa)
329
0
{
330
0
    return ASN1_i2d_fp_of(DSA, i2d_DSA_PUBKEY, fp, dsa);
331
0
}
332
# endif
333
334
DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
335
0
{
336
0
    return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSAPrivateKey, bp, dsa);
337
0
}
338
339
int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa)
340
0
{
341
0
    return ASN1_i2d_bio_of_const(DSA, i2d_DSAPrivateKey, bp, dsa);
342
0
}
343
344
DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
345
0
{
346
0
    return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSA_PUBKEY, bp, dsa);
347
0
}
348
349
int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa)
350
0
{
351
0
    return ASN1_i2d_bio_of(DSA, i2d_DSA_PUBKEY, bp, dsa);
352
0
}
353
354
#endif
355
356
#ifndef OPENSSL_NO_EC
357
# ifndef OPENSSL_NO_FP_API
358
EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
359
0
{
360
0
    return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, fp, eckey);
361
0
}
362
363
int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey)
364
0
{
365
0
    return ASN1_i2d_fp_of(EC_KEY, i2d_EC_PUBKEY, fp, eckey);
366
0
}
367
368
EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
369
0
{
370
0
    return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, fp, eckey);
371
0
}
372
373
int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey)
374
0
{
375
0
    return ASN1_i2d_fp_of(EC_KEY, i2d_ECPrivateKey, fp, eckey);
376
0
}
377
# endif
378
EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
379
0
{
380
0
    return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, bp, eckey);
381
0
}
382
383
int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *ecdsa)
384
0
{
385
0
    return ASN1_i2d_bio_of(EC_KEY, i2d_EC_PUBKEY, bp, ecdsa);
386
0
}
387
388
EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
389
0
{
390
0
    return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, bp, eckey);
391
0
}
392
393
int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey)
394
0
{
395
0
    return ASN1_i2d_bio_of(EC_KEY, i2d_ECPrivateKey, bp, eckey);
396
0
}
397
#endif
398
399
int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
400
                       unsigned char *md, unsigned int *len)
401
0
{
402
0
    ASN1_BIT_STRING *key;
403
0
    key = X509_get0_pubkey_bitstr(data);
404
0
    if (!key)
405
0
        return 0;
406
0
    return EVP_Digest(key->data, key->length, md, len, type, NULL);
407
0
}
408
409
int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
410
                unsigned int *len)
411
0
{
412
0
    return (ASN1_item_digest
413
0
            (ASN1_ITEM_rptr(X509), type, (char *)data, md, len));
414
0
}
415
416
int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
417
                    unsigned char *md, unsigned int *len)
418
0
{
419
0
    return (ASN1_item_digest
420
0
            (ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len));
421
0
}
422
423
int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
424
                    unsigned char *md, unsigned int *len)
425
0
{
426
0
    return (ASN1_item_digest
427
0
            (ASN1_ITEM_rptr(X509_REQ), type, (char *)data, md, len));
428
0
}
429
430
int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
431
                     unsigned char *md, unsigned int *len)
432
0
{
433
0
    return (ASN1_item_digest
434
0
            (ASN1_ITEM_rptr(X509_NAME), type, (char *)data, md, len));
435
0
}
436
437
int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
438
                                   const EVP_MD *type, unsigned char *md,
439
                                   unsigned int *len)
440
0
{
441
0
    return (ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL), type,
442
0
                             (char *)data, md, len));
443
0
}
444
445
#ifndef OPENSSL_NO_FP_API
446
X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
447
0
{
448
0
    return ASN1_d2i_fp_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, fp, p8);
449
0
}
450
451
int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8)
452
0
{
453
0
    return ASN1_i2d_fp_of(X509_SIG, i2d_X509_SIG, fp, p8);
454
0
}
455
#endif
456
457
X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
458
0
{
459
0
    return ASN1_d2i_bio_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, bp, p8);
460
0
}
461
462
int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8)
463
0
{
464
0
    return ASN1_i2d_bio_of(X509_SIG, i2d_X509_SIG, bp, p8);
465
0
}
466
467
#ifndef OPENSSL_NO_FP_API
468
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
469
                                                PKCS8_PRIV_KEY_INFO **p8inf)
470
0
{
471
0
    return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
472
0
                          d2i_PKCS8_PRIV_KEY_INFO, fp, p8inf);
473
0
}
474
475
int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf)
476
0
{
477
0
    return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, fp,
478
0
                          p8inf);
479
0
}
480
481
int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key)
482
0
{
483
0
    PKCS8_PRIV_KEY_INFO *p8inf;
484
0
    int ret;
485
0
    p8inf = EVP_PKEY2PKCS8(key);
486
0
    if (!p8inf)
487
0
        return 0;
488
0
    ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
489
0
    PKCS8_PRIV_KEY_INFO_free(p8inf);
490
0
    return ret;
491
0
}
492
493
int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey)
494
0
{
495
0
    return ASN1_i2d_fp_of(EVP_PKEY, i2d_PrivateKey, fp, pkey);
496
0
}
497
498
EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
499
0
{
500
0
    return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, fp, a);
501
0
}
502
503
int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey)
504
0
{
505
0
    return ASN1_i2d_fp_of(EVP_PKEY, i2d_PUBKEY, fp, pkey);
506
0
}
507
508
EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
509
0
{
510
0
    return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, fp, a);
511
0
}
512
513
#endif
514
515
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
516
                                                 PKCS8_PRIV_KEY_INFO **p8inf)
517
0
{
518
0
    return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
519
0
                           d2i_PKCS8_PRIV_KEY_INFO, bp, p8inf);
520
0
}
521
522
int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf)
523
0
{
524
0
    return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, bp,
525
0
                           p8inf);
526
0
}
527
528
int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key)
529
0
{
530
0
    PKCS8_PRIV_KEY_INFO *p8inf;
531
0
    int ret;
532
0
    p8inf = EVP_PKEY2PKCS8(key);
533
0
    if (!p8inf)
534
0
        return 0;
535
0
    ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
536
0
    PKCS8_PRIV_KEY_INFO_free(p8inf);
537
0
    return ret;
538
0
}
539
540
int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey)
541
0
{
542
0
    return ASN1_i2d_bio_of(EVP_PKEY, i2d_PrivateKey, bp, pkey);
543
0
}
544
545
EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
546
0
{
547
0
    return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, bp, a);
548
0
}
549
550
int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey)
551
0
{
552
0
    return ASN1_i2d_bio_of(EVP_PKEY, i2d_PUBKEY, bp, pkey);
553
0
}
554
555
EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
556
0
{
557
0
    return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, bp, a);
558
0
}