Coverage Report

Created: 2023-06-08 06:41

/src/openssl111/crypto/x509/x_all.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the OpenSSL license (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
#include <stdio.h>
11
#include "internal/cryptlib.h"
12
#include <openssl/buffer.h>
13
#include <openssl/asn1.h>
14
#include <openssl/evp.h>
15
#include <openssl/x509.h>
16
#include "crypto/x509.h"
17
#include <openssl/ocsp.h>
18
#include <openssl/rsa.h>
19
#include <openssl/dsa.h>
20
#include <openssl/x509v3.h>
21
22
int X509_verify(X509 *a, EVP_PKEY *r)
23
0
{
24
0
    if (X509_ALGOR_cmp(&a->sig_alg, &a->cert_info.signature))
25
0
        return 0;
26
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), &a->sig_alg,
27
0
                             &a->signature, &a->cert_info, r));
28
0
}
29
30
int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r)
31
0
{
32
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(X509_REQ_INFO),
33
0
                             &a->sig_alg, a->signature, &a->req_info, r));
34
0
}
35
36
int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r)
37
0
{
38
0
    return (ASN1_item_verify(ASN1_ITEM_rptr(NETSCAPE_SPKAC),
39
0
                             &a->sig_algor, a->signature, a->spkac, r));
40
0
}
41
42
int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
43
0
{
44
    /*
45
     * Setting the modified flag before signing it. This makes the cached
46
     * encoding to be ignored, so even if the certificate fields have changed,
47
     * they are signed correctly.
48
     * The X509_sign_ctx, X509_REQ_sign{,_ctx}, X509_CRL_sign{,_ctx} functions
49
     * which exist below are the same.
50
     */
51
0
    x->cert_info.enc.modified = 1;
52
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CINF), &x->cert_info.signature,
53
0
                           &x->sig_alg, &x->signature, &x->cert_info, pkey,
54
0
                           md));
55
0
}
56
57
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx)
58
0
{
59
0
    x->cert_info.enc.modified = 1;
60
0
    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CINF),
61
0
                              &x->cert_info.signature,
62
0
                              &x->sig_alg, &x->signature, &x->cert_info, ctx);
63
0
}
64
65
#ifndef OPENSSL_NO_OCSP
66
int X509_http_nbio(OCSP_REQ_CTX *rctx, X509 **pcert)
67
0
{
68
0
    return OCSP_REQ_CTX_nbio_d2i(rctx,
69
0
                                 (ASN1_VALUE **)pcert, ASN1_ITEM_rptr(X509));
70
0
}
71
#endif
72
73
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
74
0
{
75
0
    x->req_info.enc.modified = 1;
76
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_REQ_INFO), &x->sig_alg, NULL,
77
0
                           x->signature, &x->req_info, pkey, md));
78
0
}
79
80
int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx)
81
0
{
82
0
    x->req_info.enc.modified = 1;
83
0
    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_REQ_INFO),
84
0
                              &x->sig_alg, NULL, x->signature, &x->req_info,
85
0
                              ctx);
86
0
}
87
88
int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
89
0
{
90
0
    x->crl.enc.modified = 1;
91
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(X509_CRL_INFO), &x->crl.sig_alg,
92
0
                           &x->sig_alg, &x->signature, &x->crl, pkey, md));
93
0
}
94
95
int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx)
96
0
{
97
0
    x->crl.enc.modified = 1;
98
0
    return ASN1_item_sign_ctx(ASN1_ITEM_rptr(X509_CRL_INFO),
99
0
                              &x->crl.sig_alg, &x->sig_alg, &x->signature,
100
0
                              &x->crl, ctx);
101
0
}
102
103
#ifndef OPENSSL_NO_OCSP
104
int X509_CRL_http_nbio(OCSP_REQ_CTX *rctx, X509_CRL **pcrl)
105
0
{
106
0
    return OCSP_REQ_CTX_nbio_d2i(rctx,
107
0
                                 (ASN1_VALUE **)pcrl,
108
0
                                 ASN1_ITEM_rptr(X509_CRL));
109
0
}
110
#endif
111
112
int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md)
113
0
{
114
0
    return (ASN1_item_sign(ASN1_ITEM_rptr(NETSCAPE_SPKAC), &x->sig_algor, NULL,
115
0
                           x->signature, x->spkac, pkey, md));
116
0
}
117
118
#ifndef OPENSSL_NO_STDIO
119
X509 *d2i_X509_fp(FILE *fp, X509 **x509)
120
0
{
121
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
122
0
}
123
124
int i2d_X509_fp(FILE *fp, X509 *x509)
125
0
{
126
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
127
0
}
128
#endif
129
130
X509 *d2i_X509_bio(BIO *bp, X509 **x509)
131
0
{
132
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
133
0
}
134
135
int i2d_X509_bio(BIO *bp, X509 *x509)
136
0
{
137
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
138
0
}
139
140
#ifndef OPENSSL_NO_STDIO
141
X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl)
142
0
{
143
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
144
0
}
145
146
int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
147
0
{
148
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
149
0
}
150
#endif
151
152
X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl)
153
0
{
154
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
155
0
}
156
157
int i2d_X509_CRL_bio(BIO *bp, X509_CRL *crl)
158
0
{
159
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
160
0
}
161
162
#ifndef OPENSSL_NO_STDIO
163
PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
164
0
{
165
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
166
0
}
167
168
int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
169
0
{
170
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
171
0
}
172
#endif
173
174
PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7)
175
0
{
176
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
177
0
}
178
179
int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7)
180
0
{
181
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
182
0
}
183
184
#ifndef OPENSSL_NO_STDIO
185
X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req)
186
0
{
187
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
188
0
}
189
190
int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
191
0
{
192
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
193
0
}
194
#endif
195
196
X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req)
197
0
{
198
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
199
0
}
200
201
int i2d_X509_REQ_bio(BIO *bp, X509_REQ *req)
202
0
{
203
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
204
0
}
205
206
#ifndef OPENSSL_NO_RSA
207
208
# ifndef OPENSSL_NO_STDIO
209
RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa)
210
0
{
211
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
212
0
}
213
214
int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa)
215
0
{
216
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPrivateKey), fp, rsa);
217
0
}
218
219
RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa)
220
0
{
221
0
    return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
222
0
}
223
224
RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
225
0
{
226
0
    return ASN1_d2i_fp((void *(*)(void))
227
0
                       RSA_new, (D2I_OF(void)) d2i_RSA_PUBKEY, fp,
228
0
                       (void **)rsa);
229
0
}
230
231
int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa)
232
0
{
233
0
    return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
234
0
}
235
236
int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa)
237
0
{
238
0
    return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY, fp, rsa);
239
0
}
240
# endif
241
242
RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
243
0
{
244
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
245
0
}
246
247
int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
248
0
{
249
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
250
0
}
251
252
RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
253
0
{
254
0
    return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
255
0
}
256
257
RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa)
258
0
{
259
0
    return ASN1_d2i_bio_of(RSA, RSA_new, d2i_RSA_PUBKEY, bp, rsa);
260
0
}
261
262
int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
263
0
{
264
0
    return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
265
0
}
266
267
int i2d_RSA_PUBKEY_bio(BIO *bp, RSA *rsa)
268
0
{
269
0
    return ASN1_i2d_bio_of(RSA, i2d_RSA_PUBKEY, bp, rsa);
270
0
}
271
#endif
272
273
#ifndef OPENSSL_NO_DSA
274
# ifndef OPENSSL_NO_STDIO
275
DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa)
276
0
{
277
0
    return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSAPrivateKey, fp, dsa);
278
0
}
279
280
int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa)
281
0
{
282
0
    return ASN1_i2d_fp_of_const(DSA, i2d_DSAPrivateKey, fp, dsa);
283
0
}
284
285
DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
286
0
{
287
0
    return ASN1_d2i_fp_of(DSA, DSA_new, d2i_DSA_PUBKEY, fp, dsa);
288
0
}
289
290
int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa)
291
0
{
292
0
    return ASN1_i2d_fp_of(DSA, i2d_DSA_PUBKEY, fp, dsa);
293
0
}
294
# endif
295
296
DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa)
297
0
{
298
0
    return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSAPrivateKey, bp, dsa);
299
0
}
300
301
int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa)
302
0
{
303
0
    return ASN1_i2d_bio_of_const(DSA, i2d_DSAPrivateKey, bp, dsa);
304
0
}
305
306
DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa)
307
0
{
308
0
    return ASN1_d2i_bio_of(DSA, DSA_new, d2i_DSA_PUBKEY, bp, dsa);
309
0
}
310
311
int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa)
312
0
{
313
0
    return ASN1_i2d_bio_of(DSA, i2d_DSA_PUBKEY, bp, dsa);
314
0
}
315
316
#endif
317
318
#ifndef OPENSSL_NO_EC
319
# ifndef OPENSSL_NO_STDIO
320
EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey)
321
0
{
322
0
    return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, fp, eckey);
323
0
}
324
325
int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey)
326
0
{
327
0
    return ASN1_i2d_fp_of(EC_KEY, i2d_EC_PUBKEY, fp, eckey);
328
0
}
329
330
EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey)
331
0
{
332
0
    return ASN1_d2i_fp_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, fp, eckey);
333
0
}
334
335
int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey)
336
0
{
337
0
    return ASN1_i2d_fp_of(EC_KEY, i2d_ECPrivateKey, fp, eckey);
338
0
}
339
# endif
340
EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey)
341
0
{
342
0
    return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_EC_PUBKEY, bp, eckey);
343
0
}
344
345
int i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *ecdsa)
346
0
{
347
0
    return ASN1_i2d_bio_of(EC_KEY, i2d_EC_PUBKEY, bp, ecdsa);
348
0
}
349
350
EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey)
351
0
{
352
0
    return ASN1_d2i_bio_of(EC_KEY, EC_KEY_new, d2i_ECPrivateKey, bp, eckey);
353
0
}
354
355
int i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey)
356
0
{
357
0
    return ASN1_i2d_bio_of(EC_KEY, i2d_ECPrivateKey, bp, eckey);
358
0
}
359
#endif
360
361
int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
362
                       unsigned char *md, unsigned int *len)
363
0
{
364
0
    ASN1_BIT_STRING *key;
365
0
    key = X509_get0_pubkey_bitstr(data);
366
0
    if (!key)
367
0
        return 0;
368
0
    return EVP_Digest(key->data, key->length, md, len, type, NULL);
369
0
}
370
371
int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
372
                unsigned int *len)
373
18.7k
{
374
18.7k
    if (type == EVP_sha1() && (data->ex_flags & EXFLAG_SET) != 0
375
18.7k
            && (data->ex_flags & EXFLAG_NO_FINGERPRINT) == 0) {
376
        /* Asking for SHA1 and we already computed it. */
377
0
        if (len != NULL)
378
0
            *len = sizeof(data->sha1_hash);
379
0
        memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
380
0
        return 1;
381
0
    }
382
18.7k
    return (ASN1_item_digest
383
18.7k
            (ASN1_ITEM_rptr(X509), type, (char *)data, md, len));
384
18.7k
}
385
386
int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
387
                    unsigned char *md, unsigned int *len)
388
0
{
389
0
    if (type == EVP_sha1() && (data->flags & EXFLAG_SET) != 0
390
0
            && (data->flags & EXFLAG_INVALID) == 0) {
391
        /* Asking for SHA1; always computed in CRL d2i. */
392
0
        if (len != NULL)
393
0
            *len = sizeof(data->sha1_hash);
394
0
        memcpy(md, data->sha1_hash, sizeof(data->sha1_hash));
395
0
        return 1;
396
0
    }
397
0
    return (ASN1_item_digest
398
0
            (ASN1_ITEM_rptr(X509_CRL), type, (char *)data, md, len));
399
0
}
400
401
int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
402
                    unsigned char *md, unsigned int *len)
403
0
{
404
0
    return (ASN1_item_digest
405
0
            (ASN1_ITEM_rptr(X509_REQ), type, (char *)data, md, len));
406
0
}
407
408
int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
409
                     unsigned char *md, unsigned int *len)
410
0
{
411
0
    return (ASN1_item_digest
412
0
            (ASN1_ITEM_rptr(X509_NAME), type, (char *)data, md, len));
413
0
}
414
415
int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
416
                                   const EVP_MD *type, unsigned char *md,
417
                                   unsigned int *len)
418
0
{
419
0
    return (ASN1_item_digest(ASN1_ITEM_rptr(PKCS7_ISSUER_AND_SERIAL), type,
420
0
                             (char *)data, md, len));
421
0
}
422
423
#ifndef OPENSSL_NO_STDIO
424
X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8)
425
0
{
426
0
    return ASN1_d2i_fp_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, fp, p8);
427
0
}
428
429
int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8)
430
0
{
431
0
    return ASN1_i2d_fp_of(X509_SIG, i2d_X509_SIG, fp, p8);
432
0
}
433
#endif
434
435
X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8)
436
0
{
437
0
    return ASN1_d2i_bio_of(X509_SIG, X509_SIG_new, d2i_X509_SIG, bp, p8);
438
0
}
439
440
int i2d_PKCS8_bio(BIO *bp, X509_SIG *p8)
441
0
{
442
0
    return ASN1_i2d_bio_of(X509_SIG, i2d_X509_SIG, bp, p8);
443
0
}
444
445
#ifndef OPENSSL_NO_STDIO
446
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
447
                                                PKCS8_PRIV_KEY_INFO **p8inf)
448
0
{
449
0
    return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
450
0
                          d2i_PKCS8_PRIV_KEY_INFO, fp, p8inf);
451
0
}
452
453
int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, PKCS8_PRIV_KEY_INFO *p8inf)
454
0
{
455
0
    return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, fp,
456
0
                          p8inf);
457
0
}
458
459
int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key)
460
0
{
461
0
    PKCS8_PRIV_KEY_INFO *p8inf;
462
0
    int ret;
463
0
    p8inf = EVP_PKEY2PKCS8(key);
464
0
    if (!p8inf)
465
0
        return 0;
466
0
    ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
467
0
    PKCS8_PRIV_KEY_INFO_free(p8inf);
468
0
    return ret;
469
0
}
470
471
int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey)
472
0
{
473
0
    return ASN1_i2d_fp_of(EVP_PKEY, i2d_PrivateKey, fp, pkey);
474
0
}
475
476
EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a)
477
0
{
478
0
    return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, fp, a);
479
0
}
480
481
int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey)
482
0
{
483
0
    return ASN1_i2d_fp_of(EVP_PKEY, i2d_PUBKEY, fp, pkey);
484
0
}
485
486
EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a)
487
0
{
488
0
    return ASN1_d2i_fp_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, fp, a);
489
0
}
490
491
#endif
492
493
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
494
                                                 PKCS8_PRIV_KEY_INFO **p8inf)
495
0
{
496
0
    return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_new,
497
0
                           d2i_PKCS8_PRIV_KEY_INFO, bp, p8inf);
498
0
}
499
500
int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, PKCS8_PRIV_KEY_INFO *p8inf)
501
0
{
502
0
    return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO, i2d_PKCS8_PRIV_KEY_INFO, bp,
503
0
                           p8inf);
504
0
}
505
506
int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key)
507
0
{
508
0
    PKCS8_PRIV_KEY_INFO *p8inf;
509
0
    int ret;
510
0
    p8inf = EVP_PKEY2PKCS8(key);
511
0
    if (!p8inf)
512
0
        return 0;
513
0
    ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
514
0
    PKCS8_PRIV_KEY_INFO_free(p8inf);
515
0
    return ret;
516
0
}
517
518
int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey)
519
0
{
520
0
    return ASN1_i2d_bio_of(EVP_PKEY, i2d_PrivateKey, bp, pkey);
521
0
}
522
523
EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a)
524
0
{
525
0
    return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_AutoPrivateKey, bp, a);
526
0
}
527
528
int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey)
529
0
{
530
0
    return ASN1_i2d_bio_of(EVP_PKEY, i2d_PUBKEY, bp, pkey);
531
0
}
532
533
EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a)
534
0
{
535
0
    return ASN1_d2i_bio_of(EVP_PKEY, EVP_PKEY_new, d2i_PUBKEY, bp, a);
536
0
}