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 */
31struct 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. */
39struct 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
50struct 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
63struct 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
76struct 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
89struct 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
100struct 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
130struct 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
152struct 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
160struct 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
174struct 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 */
215struct 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
288struct 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
295struct X509_sig_st {
296    X509_ALGOR *algor;
297    ASN1_OCTET_STRING *digest;
298};
299
300struct 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
311int ossl_a2i_ipadd(unsigned char *ipout, const char *ipasc);
312int ossl_x509_set1_time(ASN1_TIME **ptm, const ASN1_TIME *tm);
313int ossl_x509_print_ex_brief(BIO *bio, X509 *cert, unsigned long neg_cflags);
314int ossl_x509v3_cache_extensions(X509 *x);
315int ossl_x509_init_sig_info(X509 *x);
316
317int ossl_x509_set0_libctx(X509 *x, OSSL_LIB_CTX *libctx, const char *propq);
318int ossl_x509_crl_set0_libctx(X509_CRL *x, OSSL_LIB_CTX *libctx,
319                              const char *propq);
320int ossl_x509_req_set0_libctx(X509_REQ *x, OSSL_LIB_CTX *libctx,
321                              const char *propq);
322int 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);
325int ossl_x509_add_cert_new(STACK_OF(X509) **sk, X509 *cert, int flags);
326int ossl_x509_add_certs_new(STACK_OF(X509) **p_sk, STACK_OF(X509) *certs,
327                            int flags);
328
329STACK_OF(X509_ATTRIBUTE) *ossl_x509at_dup(const STACK_OF(X509_ATTRIBUTE) *x);
330
331int 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) */
334ASN1_OCTET_STRING *ossl_x509_pubkey_hash(X509_PUBKEY *pubkey);
335
336X509_PUBKEY *ossl_d2i_X509_PUBKEY_INTERNAL(const unsigned char **pp,
337                                           long len, OSSL_LIB_CTX *libctx);
338void ossl_X509_PUBKEY_INTERNAL_free(X509_PUBKEY *xpub);
339
340RSA *ossl_d2i_RSA_PSS_PUBKEY(RSA **a, const unsigned char **pp, long length);
341int ossl_i2d_RSA_PSS_PUBKEY(const RSA *a, unsigned char **pp);
342# ifndef OPENSSL_NO_DSA
343DSA *ossl_d2i_DSA_PUBKEY(DSA **a, const unsigned char **pp, long length);
344# endif /* OPENSSL_NO_DSA */
345# ifndef OPENSSL_NO_DH
346DH *ossl_d2i_DH_PUBKEY(DH **a, const unsigned char **pp, long length);
347int ossl_i2d_DH_PUBKEY(const DH *a, unsigned char **pp);
348DH *ossl_d2i_DHx_PUBKEY(DH **a, const unsigned char **pp, long length);
349int ossl_i2d_DHx_PUBKEY(const DH *a, unsigned char **pp);
350# endif /* OPENSSL_NO_DH */
351# ifndef OPENSSL_NO_EC
352ECX_KEY *ossl_d2i_ED25519_PUBKEY(ECX_KEY **a,
353                                 const unsigned char **pp, long length);
354int ossl_i2d_ED25519_PUBKEY(const ECX_KEY *a, unsigned char **pp);
355ECX_KEY *ossl_d2i_ED448_PUBKEY(ECX_KEY **a,
356                               const unsigned char **pp, long length);
357int ossl_i2d_ED448_PUBKEY(const ECX_KEY *a, unsigned char **pp);
358ECX_KEY *ossl_d2i_X25519_PUBKEY(ECX_KEY **a,
359                                const unsigned char **pp, long length);
360int ossl_i2d_X25519_PUBKEY(const ECX_KEY *a, unsigned char **pp);
361ECX_KEY *ossl_d2i_X448_PUBKEY(ECX_KEY **a,
362                              const unsigned char **pp, long length);
363int ossl_i2d_X448_PUBKEY(const ECX_KEY *a, unsigned char **pp);
364# endif /* OPENSSL_NO_EC */
365EVP_PKEY *ossl_d2i_PUBKEY_legacy(EVP_PKEY **a, const unsigned char **pp,
366                                 long length);
367
368int 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 */
371STACK_OF(X509_ATTRIBUTE) *ossl_x509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
372                                                X509_ATTRIBUTE *attr);
373STACK_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);
378STACK_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);
382STACK_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