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