1 /* 2 * Copyright 2015-2024 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 #ifndef OSSL_CRYPTO_X509_H 11 # define OSSL_CRYPTO_X509_H 12 # pragma once 13 14 # include "internal/refcount.h" 15 # include <openssl/asn1.h> 16 # include <openssl/x509.h> 17 # include <openssl/conf.h> 18 # include "crypto/types.h" 19 20 /* Internal X509 structures and functions: not for application use */ 21 22 /* Note: unless otherwise stated a field pointer is mandatory and should 23 * never be set to NULL: the ASN.1 code and accessors rely on mandatory 24 * fields never being NULL. 25 */ 26 27 /* 28 * name entry structure, equivalent to AttributeTypeAndValue defined 29 * in RFC5280 et al. 30 */ 31 struct X509_name_entry_st { 32 ASN1_OBJECT *object; /* AttributeType */ 33 ASN1_STRING *value; /* AttributeValue */ 34 int set; /* index of RDNSequence for this entry */ 35 int size; /* temp variable */ 36 }; 37 38 /* Name from RFC 5280. */ 39 struct X509_name_st { 40 STACK_OF(X509_NAME_ENTRY) *entries; /* DN components */ 41 int modified; /* true if 'bytes' needs to be built */ 42 BUF_MEM *bytes; /* cached encoding: cannot be NULL */ 43 /* canonical encoding used for rapid Name comparison */ 44 unsigned char *canon_enc; 45 int canon_enclen; 46 } /* X509_NAME */ ; 47 48 /* Signature info structure */ 49 50 struct x509_sig_info_st { 51 /* NID of message digest */ 52 int mdnid; 53 /* NID of public key algorithm */ 54 int pknid; 55 /* Security bits */ 56 int secbits; 57 /* Various flags */ 58 uint32_t flags; 59 }; 60 61 /* PKCS#10 certificate request */ 62 63 struct X509_req_info_st { 64 ASN1_ENCODING enc; /* cached encoding of signed part */ 65 ASN1_INTEGER *version; /* version, defaults to v1(0) so can be NULL */ 66 X509_NAME *subject; /* certificate request DN */ 67 X509_PUBKEY *pubkey; /* public key of request */ 68 /* 69 * Zero or more attributes. 70 * NB: although attributes is a mandatory field some broken 71 * encodings omit it so this may be NULL in that case. 72 */ 73 STACK_OF(X509_ATTRIBUTE) *attributes; 74 }; 75 76 struct X509_req_st { 77 X509_REQ_INFO req_info; /* signed certificate request data */ 78 X509_ALGOR sig_alg; /* signature algorithm */ 79 ASN1_BIT_STRING *signature; /* signature */ 80 CRYPTO_REF_COUNT references; 81 CRYPTO_RWLOCK *lock; 82 83 /* Set on live certificates for authentication purposes */ 84 ASN1_OCTET_STRING *distinguishing_id; 85 OSSL_LIB_CTX *libctx; 86 char *propq; 87 }; 88 89 struct X509_crl_info_st { 90 ASN1_INTEGER *version; /* version: defaults to v1(0) so may be NULL */ 91 X509_ALGOR sig_alg; /* signature algorithm */ 92 X509_NAME *issuer; /* CRL issuer name */ 93 ASN1_TIME *lastUpdate; /* lastUpdate field */ 94 ASN1_TIME *nextUpdate; /* nextUpdate field: optional */ 95 STACK_OF(X509_REVOKED) *revoked; /* revoked entries: optional */ 96 STACK_OF(X509_EXTENSION) *extensions; /* extensions: optional */ 97 ASN1_ENCODING enc; /* encoding of signed portion of CRL */ 98 }; 99 100 struct X509_crl_st { 101 X509_CRL_INFO crl; /* signed CRL data */ 102 X509_ALGOR sig_alg; /* CRL signature algorithm */ 103 ASN1_BIT_STRING signature; /* CRL signature */ 104 CRYPTO_REF_COUNT references; 105 int flags; 106 /* 107 * Cached copies of decoded extension values, since extensions 108 * are optional any of these can be NULL. 109 */ 110 AUTHORITY_KEYID *akid; 111 ISSUING_DIST_POINT *idp; 112 /* Convenient breakdown of IDP */ 113 int idp_flags; 114 int idp_reasons; 115 /* CRL and base CRL numbers for delta processing */ 116 ASN1_INTEGER *crl_number; 117 ASN1_INTEGER *base_crl_number; 118 STACK_OF(GENERAL_NAMES) *issuers; 119 /* hash of CRL */ 120 unsigned char sha1_hash[SHA_DIGEST_LENGTH]; 121 /* alternative method to handle this CRL */ 122 const X509_CRL_METHOD *meth; 123 void *meth_data; 124 CRYPTO_RWLOCK *lock; 125 126 OSSL_LIB_CTX *libctx; 127 char *propq; 128 }; 129 130 struct x509_revoked_st { 131 ASN1_INTEGER serialNumber; /* revoked entry serial number */ 132 ASN1_TIME *revocationDate; /* revocation date */ 133 STACK_OF(X509_EXTENSION) *extensions; /* CRL entry extensions: optional */ 134 /* decoded value of CRLissuer extension: set if indirect CRL */ 135 STACK_OF(GENERAL_NAME) *issuer; 136 /* revocation reason: set to CRL_REASON_NONE if reason extension absent */ 137 int reason; 138 /* 139 * CRL entries are reordered for faster lookup of serial numbers. This 140 * field contains the original load sequence for this entry. 141 */ 142 int sequence; 143 }; 144 145 /* 146 * This stuff is certificate "auxiliary info": it contains details which are 147 * useful in certificate stores and databases. When used this is tagged onto 148 * the end of the certificate itself. OpenSSL specific structure not defined 149 * in any RFC. 150 */ 151 152 struct x509_cert_aux_st { 153 STACK_OF(ASN1_OBJECT) *trust; /* trusted uses */ 154 STACK_OF(ASN1_OBJECT) *reject; /* rejected uses */ 155 ASN1_UTF8STRING *alias; /* "friendly name" */ 156 ASN1_OCTET_STRING *keyid; /* key id of private key */ 157 STACK_OF(X509_ALGOR) *other; /* other unspecified info */ 158 }; 159 160 struct x509_cinf_st { 161 ASN1_INTEGER *version; /* [ 0 ] default of v1 */ 162 ASN1_INTEGER serialNumber; 163 X509_ALGOR signature; 164 X509_NAME *issuer; 165 X509_VAL validity; 166 X509_NAME *subject; 167 X509_PUBKEY *key; 168 ASN1_BIT_STRING *issuerUID; /* [ 1 ] optional in v2 */ 169 ASN1_BIT_STRING *subjectUID; /* [ 2 ] optional in v2 */ 170 STACK_OF(X509_EXTENSION) *extensions; /* [ 3 ] optional in v3 */ 171 ASN1_ENCODING enc; 172 }; 173 174 struct x509_st { 175 X509_CINF cert_info; 176 X509_ALGOR sig_alg; 177 ASN1_BIT_STRING signature; 178 X509_SIG_INFO siginf; 179 CRYPTO_REF_COUNT references; 180 CRYPTO_EX_DATA ex_data; 181 /* These contain copies of various extension values */ 182 long ex_pathlen; 183 long ex_pcpathlen; 184 uint32_t ex_flags; 185 uint32_t ex_kusage; 186 uint32_t ex_xkusage; 187 uint32_t ex_nscert; 188 ASN1_OCTET_STRING *skid; 189 AUTHORITY_KEYID *akid; 190 X509_POLICY_CACHE *policy_cache; 191 STACK_OF(DIST_POINT) *crldp; 192 STACK_OF(GENERAL_NAME) *altname; 193 NAME_CONSTRAINTS *nc; 194 # ifndef OPENSSL_NO_RFC3779 195 STACK_OF(IPAddressFamily) *rfc3779_addr; 196 struct ASIdentifiers_st *rfc3779_asid; 197 # endif 198 unsigned char sha1_hash[SHA_DIGEST_LENGTH]; 199 X509_CERT_AUX *aux; 200 CRYPTO_RWLOCK *lock; 201 volatile int ex_cached; 202 203 /* Set on live certificates for authentication purposes */ 204 ASN1_OCTET_STRING *distinguishing_id; 205 206 OSSL_LIB_CTX *libctx; 207 char *propq; 208 } /* X509 */ ; 209 210 /* 211 * This is a used when verifying cert chains. Since the gathering of the 212 * cert chain can take some time (and have to be 'retried', this needs to be 213 * kept and passed around. 214 */ 215 struct x509_store_ctx_st { /* X509_STORE_CTX */ 216 X509_STORE *store; 217 /* The following are set by the caller */ 218 /* The cert to check */ 219 X509 *cert; 220 /* chain of X509s - untrusted - passed in */ 221 STACK_OF(X509) *untrusted; 222 /* set of CRLs passed in */ 223 STACK_OF(X509_CRL) *crls; 224 X509_VERIFY_PARAM *param; 225 /* Other info for use with get_issuer() */ 226 void *other_ctx; 227 /* Callbacks for various operations */ 228 /* called to verify a certificate */ 229 int (*verify) (X509_STORE_CTX *ctx); 230 /* error callback */ 231 int (*verify_cb) (int ok, X509_STORE_CTX *ctx); 232 /* get issuers cert from ctx */ 233 int (*get_issuer) (X509 **issuer, X509_STORE_CTX *ctx, X509 *x); 234 /* check issued */ 235 int (*check_issued) (X509_STORE_CTX *ctx, X509 *x, X509 *issuer); 236 /* Check revocation status of chain */ 237 int (*check_revocation) (X509_STORE_CTX *ctx); 238 /* retrieve CRL */ 239 int (*get_crl) (X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); 240 /* Check CRL validity */ 241 int (*check_crl) (X509_STORE_CTX *ctx, X509_CRL *crl); 242 /* Check certificate against CRL */ 243 int (*cert_crl) (X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); 244 /* Check policy status of the chain */ 245 int (*check_policy) (X509_STORE_CTX *ctx); 246 STACK_OF(X509) *(*lookup_certs) (X509_STORE_CTX *ctx, 247 const X509_NAME *nm); 248 /* cannot constify 'ctx' param due to lookup_certs_sk() in x509_vfy.c */ 249 STACK_OF(X509_CRL) *(*lookup_crls) (const X509_STORE_CTX *ctx, 250 const X509_NAME *nm); 251 int (*cleanup) (X509_STORE_CTX *ctx); 252 /* The following is built up */ 253 /* if 0, rebuild chain */ 254 int valid; 255 /* number of untrusted certs */ 256 int num_untrusted; 257 /* chain of X509s - built up and trusted */ 258 STACK_OF(X509) *chain; 259 /* Valid policy tree */ 260 X509_POLICY_TREE *tree; 261 /* Require explicit policy value */ 262 int explicit_policy; 263 /* When something goes wrong, this is why */ 264 int error_depth; 265 int error; 266 X509 *current_cert; 267 /* cert currently being tested as valid issuer */ 268 X509 *current_issuer; 269 /* current CRL */ 270 X509_CRL *current_crl; 271 /* score of current CRL */ 272 int current_crl_score; 273 /* Reason mask */ 274 unsigned int current_reasons; 275 /* For CRL path validation: parent context */ 276 X509_STORE_CTX *parent; 277 CRYPTO_EX_DATA ex_data; 278 SSL_DANE *dane; 279 /* signed via bare TA public key, rather than CA certificate */ 280 int bare_ta_signed; 281 282 OSSL_LIB_CTX *libctx; 283 char *propq; 284 }; 285 286 /* PKCS#8 private key info structure */ 287 288 struct pkcs8_priv_key_info_st { 289 ASN1_INTEGER *version; 290 X509_ALGOR *pkeyalg; 291 ASN1_OCTET_STRING *pkey; 292 STACK_OF(X509_ATTRIBUTE) *attributes; 293 }; 294 295 struct X509_sig_st { 296 X509_ALGOR *algor; 297 ASN1_OCTET_STRING *digest; 298 }; 299 300 struct x509_object_st { 301 /* one of the above types */ 302 X509_LOOKUP_TYPE type; 303 union { 304 char *ptr; 305 X509 *x509; 306 X509_CRL *crl; 307 EVP_PKEY *pkey; 308 } data; 309 }; 310 311 int ossl_a2i_ipadd(unsigned char *ipout, const char *ipasc); 312 int ossl_x509_set1_time(ASN1_TIME **ptm, const ASN1_TIME *tm); 313 int ossl_x509_print_ex_brief(BIO *bio, X509 *cert, unsigned long neg_cflags); 314 int ossl_x509v3_cache_extensions(X509 *x); 315 int ossl_x509_init_sig_info(X509 *x); 316 317 int ossl_x509_set0_libctx(X509 *x, OSSL_LIB_CTX *libctx, const char *propq); 318 int ossl_x509_crl_set0_libctx(X509_CRL *x, OSSL_LIB_CTX *libctx, 319 const char *propq); 320 int ossl_x509_req_set0_libctx(X509_REQ *x, OSSL_LIB_CTX *libctx, 321 const char *propq); 322 int ossl_asn1_item_digest_ex(const ASN1_ITEM *it, const EVP_MD *type, 323 void *data, unsigned char *md, unsigned int *len, 324 OSSL_LIB_CTX *libctx, const char *propq); 325 int ossl_x509_add_cert_new(STACK_OF(X509) **sk, X509 *cert, int flags); 326 int ossl_x509_add_certs_new(STACK_OF(X509) **p_sk, STACK_OF(X509) *certs, 327 int flags); 328 329 STACK_OF(X509_ATTRIBUTE) *ossl_x509at_dup(const STACK_OF(X509_ATTRIBUTE) *x); 330 331 int ossl_x509_PUBKEY_get0_libctx(OSSL_LIB_CTX **plibctx, const char **ppropq, 332 const X509_PUBKEY *key); 333 /* Calculate default key identifier according to RFC 5280 section 4.2.1.2 (1) */ 334 ASN1_OCTET_STRING *ossl_x509_pubkey_hash(X509_PUBKEY *pubkey); 335 336 X509_PUBKEY *ossl_d2i_X509_PUBKEY_INTERNAL(const unsigned char **pp, 337 long len, OSSL_LIB_CTX *libctx); 338 void ossl_X509_PUBKEY_INTERNAL_free(X509_PUBKEY *xpub); 339 340 RSA *ossl_d2i_RSA_PSS_PUBKEY(RSA **a, const unsigned char **pp, long length); 341 int ossl_i2d_RSA_PSS_PUBKEY(const RSA *a, unsigned char **pp); 342 # ifndef OPENSSL_NO_DSA 343 DSA *ossl_d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length); 344 # endif /* OPENSSL_NO_DSA */ 345 # ifndef OPENSSL_NO_DH 346 DH *ossl_d2i_DH_PUBKEY(DH **a, const unsigned char **pp, long length); 347 int ossl_i2d_DH_PUBKEY(const DH *a, unsigned char **pp); 348 DH *ossl_d2i_DHx_PUBKEY(DH **a, const unsigned char **pp, long length); 349 int ossl_i2d_DHx_PUBKEY(const DH *a, unsigned char **pp); 350 # endif /* OPENSSL_NO_DH */ 351 # ifndef OPENSSL_NO_EC 352 ECX_KEY *ossl_d2i_ED25519_PUBKEY(ECX_KEY **a, 353 const unsigned char **pp, long length); 354 int ossl_i2d_ED25519_PUBKEY(const ECX_KEY *a, unsigned char **pp); 355 ECX_KEY *ossl_d2i_ED448_PUBKEY(ECX_KEY **a, 356 const unsigned char **pp, long length); 357 int ossl_i2d_ED448_PUBKEY(const ECX_KEY *a, unsigned char **pp); 358 ECX_KEY *ossl_d2i_X25519_PUBKEY(ECX_KEY **a, 359 const unsigned char **pp, long length); 360 int ossl_i2d_X25519_PUBKEY(const ECX_KEY *a, unsigned char **pp); 361 ECX_KEY *ossl_d2i_X448_PUBKEY(ECX_KEY **a, 362 const unsigned char **pp, long length); 363 int ossl_i2d_X448_PUBKEY(const ECX_KEY *a, unsigned char **pp); 364 # endif /* OPENSSL_NO_EC */ 365 EVP_PKEY *ossl_d2i_PUBKEY_legacy(EVP_PKEY **a, const unsigned char **pp, 366 long length); 367 368 int x509v3_add_len_value_uchar(const char *name, const unsigned char *value, 369 size_t vallen, STACK_OF(CONF_VALUE) **extlist); 370 /* Attribute addition functions not checking for duplicate attributes */ 371 STACK_OF(X509_ATTRIBUTE) *ossl_x509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, 372 X509_ATTRIBUTE *attr); 373 STACK_OF(X509_ATTRIBUTE) *ossl_x509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, 374 const ASN1_OBJECT *obj, 375 int type, 376 const unsigned char *bytes, 377 int len); 378 STACK_OF(X509_ATTRIBUTE) *ossl_x509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, 379 int nid, int type, 380 const unsigned char *bytes, 381 int len); 382 STACK_OF(X509_ATTRIBUTE) *ossl_x509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, 383 const char *attrname, 384 int type, 385 const unsigned char *bytes, 386 int len); 387 #endif /* OSSL_CRYPTO_X509_H */ 388