| // Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. |
| // Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef OPENSSL_HEADER_X509_H |
| #define OPENSSL_HEADER_X509_H |
| |
| #include <openssl/base.h> // IWYU pragma: export |
| |
| #include <time.h> |
| |
| #include <openssl/asn1.h> |
| #include <openssl/bio.h> |
| #include <openssl/cipher.h> |
| #include <openssl/conf.h> |
| #include <openssl/dh.h> |
| #include <openssl/dsa.h> |
| #include <openssl/ec.h> |
| #include <openssl/ecdh.h> |
| #include <openssl/ecdsa.h> |
| #include <openssl/evp.h> |
| #include <openssl/obj.h> |
| #include <openssl/pkcs7.h> |
| #include <openssl/pool.h> |
| #include <openssl/rsa.h> |
| #include <openssl/sha2.h> |
| #include <openssl/stack.h> |
| #include <openssl/x509v3_errors.h> // IWYU pragma: export |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| |
| // Legacy X.509 library. |
| // |
| // This header is part of OpenSSL's X.509 implementation. It is retained for |
| // compatibility but should not be used by new code. The functions are difficult |
| // to use correctly, and have buggy or non-standard behaviors. They are thus |
| // particularly prone to behavior changes and API removals, as BoringSSL |
| // iterates on these issues. |
| // |
| // In the future, a replacement library will be available. Meanwhile, minimize |
| // dependencies on this header where possible. |
| |
| |
| // Certificates. |
| // |
| // An `X509` object represents an X.509 certificate, defined in RFC 5280. |
| // |
| // Although an `X509` is a mutable object, mutating an `X509` can give incorrect |
| // results. Callers typically obtain `X509`s by parsing some input with |
| // `d2i_X509`, etc. Such objects carry information such as the serialized |
| // TBSCertificate and decoded extensions, which will become inconsistent when |
| // mutated. |
| // |
| // Instead, mutation functions should only be used when issuing new |
| // certificates, as described in a later section. |
| |
| DEFINE_STACK_OF(X509) |
| |
| // X509 is an `ASN1_ITEM` whose ASN.1 type is X.509 Certificate (RFC 5280) and C |
| // type is `X509*`. |
| DECLARE_ASN1_ITEM(X509) |
| |
| // X509_up_ref adds one to the reference count of `x509` and returns one. |
| OPENSSL_EXPORT int X509_up_ref(X509 *x509); |
| |
| // X509_dup_ref increments the reference count of `x509` and returns `x509`. |
| // The caller must call `X509_free` on the result to release the reference. |
| // |
| // WARNING: Although the result is non-const for use with `X509_free`, it is |
| // still shared with other parts of the appplication for the same object. Avoid |
| // mutating shared `X509`s. |
| OPENSSL_EXPORT X509 *X509_dup_ref(const X509 *x509); |
| |
| // X509_chain_up_ref returns a newly-allocated `STACK_OF(X509)` containing a |
| // shallow copy of `chain`, or NULL on error. That is, the return value has the |
| // same contents as `chain`, and each `X509`'s reference count is incremented by |
| // one. |
| OPENSSL_EXPORT STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain); |
| |
| // X509_dup returns a newly-allocated copy of `x509`, or NULL on error. This |
| // function works by serializing the structure, so auxiliary properties (see |
| // `i2d_X509_AUX`) are not preserved. Additionally, if `x509` is incomplete, |
| // this function may fail. |
| OPENSSL_EXPORT X509 *X509_dup(const X509 *x509); |
| |
| // X509_free decrements `x509`'s reference count and, if zero, releases memory |
| // associated with `x509`. |
| OPENSSL_EXPORT void X509_free(X509 *x509); |
| |
| // d2i_X509 parses up to `len` bytes from `*inp` as a DER-encoded X.509 |
| // Certificate (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509 *d2i_X509(X509 **out, const uint8_t **inp, long len); |
| |
| // X509_parse_with_algorithms parses an X.509 structure from `buf` and returns a |
| // fresh X509 or NULL on error. There must not be any trailing data in `buf`. |
| // The returned structure (if any) increment's `buf`'s reference count and |
| // retains a reference to it. |
| // |
| // Only the `num_algs` algorithms from `algs` will be considered when parsing |
| // the certificate's public key. If the certificate uses a different algorithm, |
| // it will still be parsed, but `X509_get0_pubkey` will return NULL. |
| OPENSSL_EXPORT X509 *X509_parse_with_algorithms(CRYPTO_BUFFER *buf, |
| const EVP_PKEY_ALG *const *algs, |
| size_t num_algs); |
| |
| // X509_parse_from_buffer behaves like `X509_parse_with_algorithms` but uses a |
| // default algorithm list. |
| OPENSSL_EXPORT X509 *X509_parse_from_buffer(CRYPTO_BUFFER *buf); |
| |
| // i2d_X509 marshals `x509` as a DER-encoded X.509 Certificate (RFC 5280), as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509(const X509 *x509, uint8_t **outp); |
| |
| // X509_VERSION_* are X.509 version numbers. Note the numerical values of all |
| // defined X.509 versions are one less than the named version. |
| #define X509_VERSION_1 0 |
| #define X509_VERSION_2 1 |
| #define X509_VERSION_3 2 |
| |
| // X509_get_version returns the numerical value of `x509`'s version, which will |
| // be one of the `X509_VERSION_*` constants. |
| OPENSSL_EXPORT long X509_get_version(const X509 *x509); |
| |
| // X509_get0_serialNumber returns `x509`'s serial number. |
| OPENSSL_EXPORT const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x509); |
| |
| // X509_get0_notBefore returns `x509`'s notBefore time. |
| OPENSSL_EXPORT const ASN1_TIME *X509_get0_notBefore(const X509 *x509); |
| |
| // X509_get0_notAfter returns `x509`'s notAfter time. |
| OPENSSL_EXPORT const ASN1_TIME *X509_get0_notAfter(const X509 *x509); |
| |
| // X509_get_issuer_name returns `x509`'s issuer. |
| OPENSSL_EXPORT X509_NAME *X509_get_issuer_name(const X509 *x509); |
| |
| // X509_get_subject_name returns `x509`'s subject. |
| OPENSSL_EXPORT X509_NAME *X509_get_subject_name(const X509 *x509); |
| |
| // X509_get_X509_PUBKEY returns the public key of `x509`. Note this function is |
| // not const-correct for legacy reasons. Callers should not modify the returned |
| // object. |
| OPENSSL_EXPORT X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x509); |
| |
| // X509_get0_pubkey returns `x509`'s public key as an `EVP_PKEY`, or NULL if the |
| // public key was unsupported or could not be decoded. The `EVP_PKEY` is cached |
| // in `x509`, so callers must not mutate the result. |
| OPENSSL_EXPORT EVP_PKEY *X509_get0_pubkey(const X509 *x509); |
| |
| // X509_get_pubkey behaves like `X509_get0_pubkey` but increments the reference |
| // count on the `EVP_PKEY`. The caller must release the result with |
| // `EVP_PKEY_free` when done. The `EVP_PKEY` is cached in `x509`, so callers |
| // must not mutate the result. |
| OPENSSL_EXPORT EVP_PKEY *X509_get_pubkey(const X509 *x509); |
| |
| // X509_get0_pubkey_bitstr returns the BIT STRING portion of `x509`'s public |
| // key. Note this does not contain the AlgorithmIdentifier portion. |
| // |
| // WARNING: This function returns a non-const pointer for OpenSSL compatibility, |
| // but the caller must not modify the resulting object. Doing so will break |
| // internal invariants in `x509`. |
| OPENSSL_EXPORT ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x509); |
| |
| // X509_check_private_key returns one if `x509`'s public key matches `pkey` and |
| // zero otherwise. |
| OPENSSL_EXPORT int X509_check_private_key(const X509 *x509, |
| const EVP_PKEY *pkey); |
| |
| // X509_get0_uids sets `*out_issuer_uid` to a non-owning pointer to the |
| // issuerUID field of `x509`, or NULL if `x509` has no issuerUID. It similarly |
| // outputs `x509`'s subjectUID field to `*out_subject_uid`. |
| // |
| // Callers may pass NULL to either `out_issuer_uid` or `out_subject_uid` to |
| // ignore the corresponding field. |
| OPENSSL_EXPORT void X509_get0_uids(const X509 *x509, |
| const ASN1_BIT_STRING **out_issuer_uid, |
| const ASN1_BIT_STRING **out_subject_uid); |
| |
| // The following bits are returned from `X509_get_extension_flags`. |
| |
| // EXFLAG_BCONS indicates the certificate has a basic constraints extension. |
| #define EXFLAG_BCONS 0x1 |
| // EXFLAG_KUSAGE indicates the certificate has a key usage extension. |
| #define EXFLAG_KUSAGE 0x2 |
| // EXFLAG_XKUSAGE indicates the certificate has an extended key usage extension. |
| #define EXFLAG_XKUSAGE 0x4 |
| // EXFLAG_CA indicates the certificate has a basic constraints extension with |
| // the CA bit set. |
| #define EXFLAG_CA 0x10 |
| // EXFLAG_SI indicates the certificate is self-issued, i.e. its subject and |
| // issuer names match. |
| #define EXFLAG_SI 0x20 |
| // EXFLAG_V1 indicates an X.509v1 certificate. |
| #define EXFLAG_V1 0x40 |
| // EXFLAG_INVALID indicates an error processing some extension. The certificate |
| // should not be accepted. Note the lack of this bit does not imply all |
| // extensions are valid, only those used to compute extension flags. |
| #define EXFLAG_INVALID 0x80 |
| // EXFLAG_SET is an internal bit that indicates extension flags were computed. |
| #define EXFLAG_SET 0x100 |
| // EXFLAG_CRITICAL indicates an unsupported critical extension. The certificate |
| // should not be accepted. |
| #define EXFLAG_CRITICAL 0x200 |
| // EXFLAG_SS indicates the certificate is likely self-signed. That is, if it is |
| // self-issued, its authority key identifier (if any) matches itself, and its |
| // key usage extension (if any) allows certificate signatures. The signature |
| // itself is not checked in computing this bit. |
| #define EXFLAG_SS 0x2000 |
| |
| // X509_get_extension_flags decodes a set of extensions from `x509` and returns |
| // a collection of `EXFLAG_*` bits which reflect `x509`. If there was an error |
| // in computing this bitmask, the result will include the `EXFLAG_INVALID` bit. |
| OPENSSL_EXPORT uint32_t X509_get_extension_flags(X509 *x509); |
| |
| // X509_get_pathlen returns path length constraint from the basic constraints |
| // extension in `x509`. (See RFC 5280, section 4.2.1.9.) It returns -1 if the |
| // constraint is not present, or if some extension in `x509` was invalid. |
| // |
| // TODO(crbug.com/boringssl/381): Decoding an `X509` object will not check for |
| // invalid extensions. To detect the error case, call |
| // `X509_get_extension_flags` and check the `EXFLAG_INVALID` bit. |
| OPENSSL_EXPORT long X509_get_pathlen(X509 *x509); |
| |
| // X509v3_KU_* are key usage bits returned from `X509_get_key_usage`. |
| #define X509v3_KU_DIGITAL_SIGNATURE 0x0080 |
| #define X509v3_KU_NON_REPUDIATION 0x0040 |
| #define X509v3_KU_KEY_ENCIPHERMENT 0x0020 |
| #define X509v3_KU_DATA_ENCIPHERMENT 0x0010 |
| #define X509v3_KU_KEY_AGREEMENT 0x0008 |
| #define X509v3_KU_KEY_CERT_SIGN 0x0004 |
| #define X509v3_KU_CRL_SIGN 0x0002 |
| #define X509v3_KU_ENCIPHER_ONLY 0x0001 |
| #define X509v3_KU_DECIPHER_ONLY 0x8000 |
| |
| // X509_get_key_usage returns a bitmask of key usages (see Section 4.2.1.3 of |
| // RFC 5280) which `x509` is valid for. This function only reports the first 16 |
| // bits, in a little-endian byte order, but big-endian bit order. That is, bits |
| // 0 though 7 are reported at 1<<7 through 1<<0, and bits 8 through 15 are |
| // reported at 1<<15 through 1<<8. |
| // |
| // Instead of depending on this bit order, callers should compare against the |
| // `X509v3_KU_*` constants. |
| // |
| // If `x509` has no key usage extension, all key usages are valid and this |
| // function returns `UINT32_MAX`. If there was an error processing `x509`'s |
| // extensions, or if the first 16 bits in the key usage extension were all zero, |
| // this function returns zero. |
| OPENSSL_EXPORT uint32_t X509_get_key_usage(X509 *x509); |
| |
| // XKU_* are extended key usage bits returned from |
| // `X509_get_extended_key_usage`. |
| #define XKU_SSL_SERVER 0x1 |
| #define XKU_SSL_CLIENT 0x2 |
| #define XKU_SMIME 0x4 |
| #define XKU_CODE_SIGN 0x8 |
| #define XKU_SGC 0x10 |
| #define XKU_OCSP_SIGN 0x20 |
| #define XKU_TIMESTAMP 0x40 |
| #define XKU_DVCS 0x80 |
| #define XKU_ANYEKU 0x100 |
| |
| // X509_get_extended_key_usage returns a bitmask of extended key usages (see |
| // Section 4.2.1.12 of RFC 5280) which `x509` is valid for. The result will be |
| // a combination of `XKU_*` constants. If checking an extended key usage not |
| // defined above, callers should extract the extended key usage extension |
| // separately, e.g. via `X509_get_ext_d2i`. |
| // |
| // If `x509` has no extended key usage extension, all extended key usages are |
| // valid and this function returns `UINT32_MAX`. If there was an error |
| // processing `x509`'s extensions, or if `x509`'s extended key usage extension |
| // contained no recognized usages, this function returns zero. |
| OPENSSL_EXPORT uint32_t X509_get_extended_key_usage(X509 *x509); |
| |
| // X509_get0_subject_key_id returns `x509`'s subject key identifier, if present. |
| // (See RFC 5280, section 4.2.1.2.) It returns NULL if the extension is not |
| // present or if some extension in `x509` was invalid. |
| // |
| // TODO(crbug.com/boringssl/381): Decoding an `X509` object will not check for |
| // invalid extensions. To detect the error case, call |
| // `X509_get_extension_flags` and check the `EXFLAG_INVALID` bit. |
| OPENSSL_EXPORT const ASN1_OCTET_STRING *X509_get0_subject_key_id(X509 *x509); |
| |
| // X509_get0_authority_key_id returns keyIdentifier of `x509`'s authority key |
| // identifier, if the extension and field are present. (See RFC 5280, |
| // section 4.2.1.1.) It returns NULL if the extension is not present, if it is |
| // present but lacks a keyIdentifier field, or if some extension in `x509` was |
| // invalid. |
| // |
| // TODO(crbug.com/boringssl/381): Decoding an `X509` object will not check for |
| // invalid extensions. To detect the error case, call |
| // `X509_get_extension_flags` and check the `EXFLAG_INVALID` bit. |
| OPENSSL_EXPORT const ASN1_OCTET_STRING *X509_get0_authority_key_id(X509 *x509); |
| |
| DEFINE_STACK_OF(GENERAL_NAME) |
| typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES; |
| |
| // X509_get0_authority_issuer returns the authorityCertIssuer of `x509`'s |
| // authority key identifier, if the extension and field are present. (See |
| // RFC 5280, section 4.2.1.1.) It returns NULL if the extension is not present, |
| // if it is present but lacks a authorityCertIssuer field, or if some extension |
| // in `x509` was invalid. |
| // |
| // TODO(crbug.com/boringssl/381): Decoding an `X509` object will not check for |
| // invalid extensions. To detect the error case, call |
| // `X509_get_extension_flags` and check the `EXFLAG_INVALID` bit. |
| OPENSSL_EXPORT const GENERAL_NAMES *X509_get0_authority_issuer(X509 *x509); |
| |
| // X509_get0_authority_serial returns the authorityCertSerialNumber of `x509`'s |
| // authority key identifier, if the extension and field are present. (See |
| // RFC 5280, section 4.2.1.1.) It returns NULL if the extension is not present, |
| // if it is present but lacks a authorityCertSerialNumber field, or if some |
| // extension in `x509` was invalid. |
| // |
| // TODO(crbug.com/boringssl/381): Decoding an `X509` object will not check for |
| // invalid extensions. To detect the error case, call |
| // `X509_get_extension_flags` and check the `EXFLAG_INVALID` bit. |
| OPENSSL_EXPORT const ASN1_INTEGER *X509_get0_authority_serial(X509 *x509); |
| |
| // X509_get0_extensions returns `x509`'s extension list, or NULL if `x509` omits |
| // it. |
| OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_get0_extensions( |
| const X509 *x509); |
| |
| // X509_get_ext_count returns the number of extensions in `x`. |
| OPENSSL_EXPORT int X509_get_ext_count(const X509 *x); |
| |
| // X509_get_ext_by_NID behaves like `X509v3_get_ext_by_NID` but searches for |
| // extensions in `x`. |
| OPENSSL_EXPORT int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos); |
| |
| // X509_get_ext_by_OBJ behaves like `X509v3_get_ext_by_OBJ` but searches for |
| // extensions in `x`. |
| OPENSSL_EXPORT int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, |
| int lastpos); |
| |
| // X509_get_ext_by_critical behaves like `X509v3_get_ext_by_critical` but |
| // searches for extensions in `x`. |
| OPENSSL_EXPORT int X509_get_ext_by_critical(const X509 *x, int crit, |
| int lastpos); |
| |
| // X509_get_ext returns the extension in `x` at index `loc`, or NULL if `loc` is |
| // out of bounds. This function returns a non-const pointer for OpenSSL |
| // compatibility, but callers should not mutate the result. |
| OPENSSL_EXPORT X509_EXTENSION *X509_get_ext(const X509 *x, int loc); |
| |
| // X509_get_ext_d2i behaves like `X509V3_get_d2i` but looks for the extension in |
| // `x509`'s extension list. |
| // |
| // WARNING: This function is difficult to use correctly. See the documentation |
| // for `X509V3_get_d2i` for details. |
| OPENSSL_EXPORT void *X509_get_ext_d2i(const X509 *x509, int nid, |
| int *out_critical, int *out_idx); |
| |
| // X509_get0_tbs_sigalg returns the signature algorithm in `x509`'s |
| // TBSCertificate. For the outer signature algorithm, see `X509_get0_signature`. |
| // |
| // Certificates with mismatched signature algorithms will successfully parse, |
| // but they will be rejected when verifying. |
| OPENSSL_EXPORT const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x509); |
| |
| // X509_get0_signature sets `*out_sig` and `*out_alg` to the signature and |
| // signature algorithm of `x509`, respectively. Either output pointer may be |
| // NULL to ignore the value. |
| // |
| // This function outputs the outer signature algorithm. For the one in the |
| // TBSCertificate, see `X509_get0_tbs_sigalg`. Certificates with mismatched |
| // signature algorithms will successfully parse, but they will be rejected when |
| // verifying. |
| OPENSSL_EXPORT void X509_get0_signature(const ASN1_BIT_STRING **out_sig, |
| const X509_ALGOR **out_alg, |
| const X509 *x509); |
| |
| // X509_get_signature_nid returns the NID corresponding to `x509`'s signature |
| // algorithm, or `NID_undef` if the signature algorithm does not correspond to |
| // a known NID. |
| OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509); |
| |
| // i2d_X509_tbs serializes the TBSCertificate portion of `x509`, as described in |
| // `i2d_SAMPLE`. |
| // |
| // This function preserves the original encoding of the TBSCertificate and may |
| // not reflect modifications made to `x509`. It may be used to manually verify |
| // the signature of an existing certificate. To generate certificates, use |
| // `i2d_re_X509_tbs` instead. |
| OPENSSL_EXPORT int i2d_X509_tbs(const X509 *x509, uint8_t **outp); |
| |
| // X509_verify checks that `x509` has a valid signature by `pkey`. It returns |
| // one if the signature is valid and zero otherwise. Note this function only |
| // checks the signature itself and does not perform a full certificate |
| // validation. |
| OPENSSL_EXPORT int X509_verify(const X509 *x509, EVP_PKEY *pkey); |
| |
| // X509_get1_email returns a newly-allocated list of NUL-terminated strings |
| // containing all email addresses in `x509`'s subject and all rfc822name names |
| // in `x509`'s subject alternative names. Email addresses which contain embedded |
| // NUL bytes are skipped. The results are returned in an arbitrary order. |
| // |
| // On error, or if there are no such email addresses, it returns NULL. When |
| // done, the caller must release the result with `X509_email_free`. |
| OPENSSL_EXPORT STACK_OF(OPENSSL_STRING) *X509_get1_email(const X509 *x509); |
| |
| // X509_get1_ocsp returns a newly-allocated list of NUL-terminated strings |
| // containing all OCSP URIs in `x509`. That is, it collects all URI |
| // AccessDescriptions with an accessMethod of id-ad-ocsp in `x509`'s authority |
| // information access extension. URIs which contain embedded NUL bytes are |
| // skipped. The results are returned in an arbitrary order. |
| // |
| // On error, or if there are no such URIs, it returns NULL. When done, the |
| // caller must release the result with `X509_email_free`. |
| OPENSSL_EXPORT STACK_OF(OPENSSL_STRING) *X509_get1_ocsp(const X509 *x509); |
| |
| // X509_email_free releases memory associated with `sk`, including `sk` itself. |
| // Each `OPENSSL_STRING` in `sk` must be a NUL-terminated string allocated with |
| // `OPENSSL_malloc`. If `sk` is NULL, no action is taken. |
| OPENSSL_EXPORT void X509_email_free(STACK_OF(OPENSSL_STRING) *sk); |
| |
| // X509_cmp compares `a` and `b` and returns zero if they are equal, a negative |
| // number if `b` sorts after `a` and a negative number if `a` sorts after `b`. |
| // The sort order implemented by this function is arbitrary and does not |
| // reflect properties of the certificate such as expiry. Applications should not |
| // rely on the order itself. |
| // |
| // TODO(https://crbug.com/boringssl/355): This function works by comparing a |
| // cached hash of the encoded certificate. If `a` or `b` could not be |
| // serialized, the current behavior is to compare all unencodable certificates |
| // as equal. This function should only be used with `X509` objects that were |
| // parsed from bytes and never mutated. |
| OPENSSL_EXPORT int X509_cmp(const X509 *a, const X509 *b); |
| |
| |
| // Issuing certificates. |
| // |
| // An `X509` object may also represent an incomplete certificate. Callers may |
| // construct empty `X509` objects, fill in fields individually, and finally sign |
| // the result. The following functions may be used for this purpose. |
| |
| // X509_new returns a newly-allocated, empty `X509` object, or NULL on error. |
| // This produces an incomplete certificate which may be filled in to issue a new |
| // certificate. |
| OPENSSL_EXPORT X509 *X509_new(void); |
| |
| // X509_set_version sets `x509`'s version to `version`, which should be one of |
| // the `X509V_VERSION_*` constants. It returns one on success and zero on error. |
| // |
| // If unsure, use `X509_VERSION_3`. |
| OPENSSL_EXPORT int X509_set_version(X509 *x509, long version); |
| |
| // X509_set_serialNumber sets `x509`'s serial number to `serial`. It returns one |
| // on success and zero on error. |
| OPENSSL_EXPORT int X509_set_serialNumber(X509 *x509, |
| const ASN1_INTEGER *serial); |
| |
| // X509_set1_notBefore sets `x509`'s notBefore time to `tm`. It returns one on |
| // success and zero on error. |
| OPENSSL_EXPORT int X509_set1_notBefore(X509 *x509, const ASN1_TIME *tm); |
| |
| // X509_set1_notAfter sets `x509`'s notAfter time to `tm`. it returns one on |
| // success and zero on error. |
| OPENSSL_EXPORT int X509_set1_notAfter(X509 *x509, const ASN1_TIME *tm); |
| |
| // X509_getm_notBefore returns a mutable pointer to `x509`'s notBefore time. |
| OPENSSL_EXPORT ASN1_TIME *X509_getm_notBefore(X509 *x509); |
| |
| // X509_getm_notAfter returns a mutable pointer to `x509`'s notAfter time. |
| OPENSSL_EXPORT ASN1_TIME *X509_getm_notAfter(X509 *x); |
| |
| // X509_set_issuer_name sets `x509`'s issuer to a copy of `name`. It returns one |
| // on success and zero on error. |
| OPENSSL_EXPORT int X509_set_issuer_name(X509 *x509, const X509_NAME *name); |
| |
| // X509_set_subject_name sets `x509`'s subject to a copy of `name`. It returns |
| // one on success and zero on error. |
| OPENSSL_EXPORT int X509_set_subject_name(X509 *x509, const X509_NAME *name); |
| |
| // X509_set_pubkey sets `x509`'s public key to `pkey`. It returns one on success |
| // and zero on error. This function does not take ownership of `pkey` and |
| // internally copies and updates reference counts as needed. |
| OPENSSL_EXPORT int X509_set_pubkey(X509 *x509, EVP_PKEY *pkey); |
| |
| // X509_delete_ext removes the extension in `x` at index `loc` and returns the |
| // removed extension, or NULL if `loc` was out of bounds. If non-NULL, the |
| // caller must release the result with `X509_EXTENSION_free`. |
| OPENSSL_EXPORT X509_EXTENSION *X509_delete_ext(X509 *x, int loc); |
| |
| // X509_add_ext adds a copy of `ex` to `x`. It returns one on success and zero |
| // on failure. The caller retains ownership of `ex` and can release it |
| // independently of `x`. |
| // |
| // The new extension is inserted at index `loc`, shifting extensions to the |
| // right. If `loc` is -1 or out of bounds, the new extension is appended to the |
| // list. |
| OPENSSL_EXPORT int X509_add_ext(X509 *x, const X509_EXTENSION *ex, int loc); |
| |
| // X509_add1_ext_i2d behaves like `X509V3_add1_i2d` but adds the extension to |
| // `x`'s extension list. |
| // |
| // WARNING: This function may return zero or -1 on error. The caller must also |
| // ensure `value`'s type matches `nid`. See the documentation for |
| // `X509V3_add1_i2d` for details. |
| OPENSSL_EXPORT int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit, |
| unsigned long flags); |
| |
| // X509_sign signs `x509` with `pkey` and replaces the signature algorithm and |
| // signature fields. It returns the length of the signature on success and zero |
| // on error. This function uses digest algorithm `md`, or `pkey`'s default if |
| // NULL. Other signing parameters use `pkey`'s defaults. To customize them, use |
| // `X509_sign_ctx`. |
| OPENSSL_EXPORT int X509_sign(X509 *x509, EVP_PKEY *pkey, const EVP_MD *md); |
| |
| // X509_sign_ctx signs `x509` with `ctx` and replaces the signature algorithm |
| // and signature fields. It returns the length of the signature on success and |
| // zero on error. The signature algorithm and parameters come from `ctx`, which |
| // must have been initialized with `EVP_DigestSignInit`. The caller should |
| // configure the corresponding `EVP_PKEY_CTX` before calling this function. |
| // |
| // On success or failure, this function mutates `ctx` and resets it to the empty |
| // state. Caller should not rely on its contents after the function returns. |
| OPENSSL_EXPORT int X509_sign_ctx(X509 *x509, EVP_MD_CTX *ctx); |
| |
| // i2d_re_X509_tbs serializes the TBSCertificate portion of `x509`, as described |
| // in `i2d_SAMPLE`. |
| // |
| // This function re-encodes the TBSCertificate and may not reflect `x509`'s |
| // original encoding. It may be used to manually generate a signature for a new |
| // certificate. To verify certificates, use `i2d_X509_tbs` instead. |
| // |
| // Unlike `i2d_X509_tbs`, this function is not `const` and thus may not be to |
| // use concurrently with other functions that access `x509`. It mutates `x509` |
| // by dropping the cached encoding. This function is intended to be used during |
| // certificate construction, where `x509` is still single-threaded and being |
| // mutated. |
| OPENSSL_EXPORT int i2d_re_X509_tbs(X509 *x509, uint8_t **outp); |
| |
| // X509_set1_signature_algo sets `x509`'s signature algorithm to `algo` and |
| // returns one on success or zero on error. It updates both the signature field |
| // of the TBSCertificate structure, and the signatureAlgorithm field of the |
| // Certificate. |
| OPENSSL_EXPORT int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo); |
| |
| // X509_set1_signature_value sets `x509`'s signature to a copy of the `sig_len` |
| // bytes pointed by `sig`. It returns one on success and zero on error. |
| // |
| // Due to a specification error, X.509 certificates store signatures in ASN.1 |
| // BIT STRINGs, but signature algorithms return byte strings rather than bit |
| // strings. This function creates a BIT STRING containing a whole number of |
| // bytes, with the bit order matching the DER encoding. This matches the |
| // encoding used by all X.509 signature algorithms. |
| OPENSSL_EXPORT int X509_set1_signature_value(X509 *x509, const uint8_t *sig, |
| size_t sig_len); |
| |
| |
| // Auxiliary certificate properties. |
| // |
| // `X509` objects optionally maintain auxiliary properties. These are not part |
| // of the certificates themselves, and thus are not covered by signatures or |
| // preserved by the standard serialization. They are used as inputs or outputs |
| // to other functions in this library. |
| |
| // i2d_X509_AUX marshals `x509` as a DER-encoded X.509 Certificate (RFC 5280), |
| // followed optionally by a separate, OpenSSL-specific structure with auxiliary |
| // properties. It behaves as described in `i2d_SAMPLE`. |
| // |
| // Unlike similarly-named functions, this function does not output a single |
| // ASN.1 element. Directly embedding the output in a larger ASN.1 structure will |
| // not behave correctly. |
| OPENSSL_EXPORT int i2d_X509_AUX(const X509 *x509, uint8_t **outp); |
| |
| // d2i_X509_AUX parses up to `length` bytes from `*inp` as a DER-encoded X.509 |
| // Certificate (RFC 5280), followed optionally by a separate, OpenSSL-specific |
| // structure with auxiliary properties. It behaves as described in `d2i_SAMPLE`. |
| // |
| // WARNING: Passing untrusted input to this function allows an attacker to |
| // control auxiliary properties. This can allow unexpected influence over the |
| // application if the certificate is used in a context that reads auxiliary |
| // properties. This includes PKCS#12 serialization, trusted certificates in |
| // `X509_STORE`, and callers of `X509_alias_get0` or `X509_keyid_get0`. |
| // |
| // Unlike similarly-named functions, this function does not parse a single |
| // ASN.1 element. Trying to parse data directly embedded in a larger ASN.1 |
| // structure will not behave correctly. |
| OPENSSL_EXPORT X509 *d2i_X509_AUX(X509 **x509, const uint8_t **inp, |
| long length); |
| |
| // X509_alias_set1 sets `x509`'s alias to `len` bytes from `name`. If `name` is |
| // NULL, the alias is cleared instead. Aliases are not part of the certificate |
| // itself and will not be serialized by `i2d_X509`. If `x509` is serialized in |
| // a PKCS#12 structure, the friendlyName attribute (RFC 2985) will contain this |
| // alias. |
| OPENSSL_EXPORT int X509_alias_set1(X509 *x509, const uint8_t *name, |
| ossl_ssize_t len); |
| |
| // X509_keyid_set1 sets `x509`'s key ID to `len` bytes from `id`. If `id` is |
| // NULL, the key ID is cleared instead. Key IDs are not part of the certificate |
| // itself and will not be serialized by `i2d_X509`. |
| OPENSSL_EXPORT int X509_keyid_set1(X509 *x509, const uint8_t *id, |
| ossl_ssize_t len); |
| |
| // X509_alias_get0 looks up `x509`'s alias. If found, it sets `*out_len` to the |
| // alias's length and returns a pointer to a buffer containing the contents. If |
| // not found, it outputs the empty string by returning NULL and setting |
| // `*out_len` to zero. |
| // |
| // If `x509` was parsed from a PKCS#12 structure (see |
| // `PKCS12_get_key_and_certs`), the alias will reflect the friendlyName |
| // attribute (RFC 2985). |
| // |
| // WARNING: In OpenSSL, this function did not set `*out_len` when the alias was |
| // missing. Callers that target both OpenSSL and BoringSSL should set the value |
| // to zero before calling this function. |
| OPENSSL_EXPORT const uint8_t *X509_alias_get0(const X509 *x509, int *out_len); |
| |
| // X509_keyid_get0 looks up `x509`'s key ID. If found, it sets `*out_len` to the |
| // key ID's length and returns a pointer to a buffer containing the contents. If |
| // not found, it outputs the empty string by returning NULL and setting |
| // `*out_len` to zero. |
| // |
| // WARNING: In OpenSSL, this function did not set `*out_len` when the alias was |
| // missing. Callers that target both OpenSSL and BoringSSL should set the value |
| // to zero before calling this function. |
| OPENSSL_EXPORT const uint8_t *X509_keyid_get0(const X509 *x509, int *out_len); |
| |
| // X509_add1_trust_object configures `x509` as a valid trust anchor for `obj`. |
| // It returns one on success and zero on error. `obj` should be a certificate |
| // usage OID associated with an `X509_TRUST_*` constant. |
| // |
| // See `X509_VERIFY_PARAM_set_trust` for details on how this value is evaluated. |
| // Note this only takes effect if `x509` was configured as a trusted certificate |
| // via `X509_STORE`. |
| OPENSSL_EXPORT int X509_add1_trust_object(X509 *x509, const ASN1_OBJECT *obj); |
| |
| // X509_add1_reject_object configures `x509` as distrusted for `obj`. It returns |
| // one on success and zero on error. `obj` should be a certificate usage OID |
| // associated with an `X509_TRUST_*` constant. |
| // |
| // See `X509_VERIFY_PARAM_set_trust` for details on how this value is evaluated. |
| // Note this only takes effect if `x509` was configured as a trusted certificate |
| // via `X509_STORE`. |
| OPENSSL_EXPORT int X509_add1_reject_object(X509 *x509, const ASN1_OBJECT *obj); |
| |
| // X509_trust_clear clears the list of OIDs for which `x509` is trusted. See |
| // also `X509_add1_trust_object`. |
| OPENSSL_EXPORT void X509_trust_clear(X509 *x509); |
| |
| // X509_reject_clear clears the list of OIDs for which `x509` is distrusted. See |
| // also `X509_add1_reject_object`. |
| OPENSSL_EXPORT void X509_reject_clear(X509 *x509); |
| |
| |
| // Certificate revocation lists. |
| // |
| // An `X509_CRL` object represents an X.509 certificate revocation list (CRL), |
| // defined in RFC 5280. A CRL is a signed list of certificates, the |
| // revokedCertificates field, which are no longer considered valid. Each entry |
| // of this list is represented with an `X509_REVOKED` object, documented in the |
| // "CRL entries" section below. |
| // |
| // Although an `X509_CRL` is a mutable object, mutating an `X509_CRL` or its |
| // `X509_REVOKED`s can give incorrect results. Callers typically obtain |
| // `X509_CRL`s by parsing some input with `d2i_X509_CRL`, etc. Such objects |
| // carry information such as the serialized TBSCertList and decoded extensions, |
| // which will become inconsistent when mutated. |
| // |
| // Instead, mutation functions should only be used when issuing new CRLs, as |
| // described in a later section. |
| |
| DEFINE_STACK_OF(X509_CRL) |
| DEFINE_STACK_OF(X509_REVOKED) |
| |
| // X509_CRL_up_ref adds one to the reference count of `crl` and returns one. |
| OPENSSL_EXPORT int X509_CRL_up_ref(X509_CRL *crl); |
| |
| // X509_CRL_dup returns a newly-allocated copy of `crl`, or NULL on error. This |
| // function works by serializing the structure, so if `crl` is incomplete, it |
| // may fail. |
| OPENSSL_EXPORT X509_CRL *X509_CRL_dup(const X509_CRL *crl); |
| |
| // X509_CRL_free decrements `crl`'s reference count and, if zero, releases |
| // memory associated with `crl`. |
| OPENSSL_EXPORT void X509_CRL_free(X509_CRL *crl); |
| |
| // d2i_X509_CRL parses up to `len` bytes from `*inp` as a DER-encoded X.509 |
| // CertificateList (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_CRL *d2i_X509_CRL(X509_CRL **out, const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_CRL marshals `crl` as a X.509 CertificateList (RFC 5280), as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_CRL(const X509_CRL *crl, uint8_t **outp); |
| |
| // X509_CRL_match compares `a` and `b` and returns zero if they are equal, a |
| // negative number if `b` sorts after `a` and a negative number if `a` sorts |
| // after `b`. The sort order implemented by this function is arbitrary and does |
| // not reflect properties of the CRL such as expiry. Applications should not |
| // rely on the order itself. |
| // |
| // TODO(https://crbug.com/boringssl/355): This function works by comparing a |
| // cached hash of the encoded CRL. This cached hash is computed when the CRL is |
| // parsed, but not when mutating or issuing CRLs. This function should only be |
| // used with `X509_CRL` objects that were parsed from bytes and never mutated. |
| OPENSSL_EXPORT int X509_CRL_match(const X509_CRL *a, const X509_CRL *b); |
| |
| #define X509_CRL_VERSION_1 0 |
| #define X509_CRL_VERSION_2 1 |
| |
| // X509_CRL_get_version returns the numerical value of `crl`'s version, which |
| // will be one of the `X509_CRL_VERSION_*` constants. |
| OPENSSL_EXPORT long X509_CRL_get_version(const X509_CRL *crl); |
| |
| // X509_CRL_get0_lastUpdate returns `crl`'s thisUpdate time. The OpenSSL API |
| // refers to this field as lastUpdate. |
| OPENSSL_EXPORT const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl); |
| |
| // X509_CRL_get0_nextUpdate returns `crl`'s nextUpdate time, or NULL if `crl` |
| // has none. |
| OPENSSL_EXPORT const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl); |
| |
| // X509_CRL_get_issuer returns `crl`'s issuer name. Note this function is not |
| // const-correct for legacy reasons. |
| OPENSSL_EXPORT X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl); |
| |
| // X509_CRL_get0_by_serial finds the entry in `crl` whose serial number is |
| // `serial`. If found, it sets `*out` to the entry and returns one. If not |
| // found, it returns zero. |
| // |
| // On success, `*out` continues to be owned by `crl`. It is an error to free or |
| // otherwise modify `*out`. |
| // |
| // TODO(crbug.com/42290473): Ideally `crl` would be const. It is broadly |
| // thread-safe, but changes the order of entries in `crl`. It cannot be called |
| // concurrently with `i2d_X509_CRL`. |
| OPENSSL_EXPORT int X509_CRL_get0_by_serial(X509_CRL *crl, X509_REVOKED **out, |
| const ASN1_INTEGER *serial); |
| |
| // X509_CRL_get0_by_cert behaves like `X509_CRL_get0_by_serial`, except it looks |
| // for the entry that matches `x509`. |
| // |
| // TODO(crbug.com/42290473): Ideally `crl` would be const. It is broadly |
| // thread-safe, but changes the order of entries in `crl`. It cannot be called |
| // concurrently with `i2d_X509_CRL`. |
| OPENSSL_EXPORT int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **out, |
| const X509 *x509); |
| |
| // X509_CRL_get_REVOKED returns the list of revoked certificates in `crl`, or |
| // NULL if `crl` omits it. |
| // |
| // TODO(davidben): This function was originally a macro, without clear const |
| // semantics. It should take a const input and give const output, but the latter |
| // would break existing callers. For now, we match upstream. |
| OPENSSL_EXPORT STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl); |
| |
| // X509_CRL_get0_extensions returns `crl`'s extension list, or NULL if `crl` |
| // omits it. A CRL can have extensions on individual entries, which is |
| // `X509_REVOKED_get0_extensions`, or on the overall CRL, which is this |
| // function. |
| OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions( |
| const X509_CRL *crl); |
| |
| // X509_CRL_get_ext_count returns the number of extensions in `x`. |
| OPENSSL_EXPORT int X509_CRL_get_ext_count(const X509_CRL *x); |
| |
| // X509_CRL_get_ext_by_NID behaves like `X509v3_get_ext_by_NID` but searches for |
| // extensions in `x`. |
| OPENSSL_EXPORT int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, |
| int lastpos); |
| |
| // X509_CRL_get_ext_by_OBJ behaves like `X509v3_get_ext_by_OBJ` but searches for |
| // extensions in `x`. |
| OPENSSL_EXPORT int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, |
| const ASN1_OBJECT *obj, int lastpos); |
| |
| // X509_CRL_get_ext_by_critical behaves like `X509v3_get_ext_by_critical` but |
| // searches for extensions in `x`. |
| OPENSSL_EXPORT int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, |
| int lastpos); |
| |
| // X509_CRL_get_ext returns the extension in `x` at index `loc`, or NULL if |
| // `loc` is out of bounds. This function returns a non-const pointer for OpenSSL |
| // compatibility, but callers should not mutate the result. |
| OPENSSL_EXPORT X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc); |
| |
| // X509_CRL_get_ext_d2i behaves like `X509V3_get_d2i` but looks for the |
| // extension in `crl`'s extension list. |
| // |
| // WARNING: This function is difficult to use correctly. See the documentation |
| // for `X509V3_get_d2i` for details. |
| OPENSSL_EXPORT void *X509_CRL_get_ext_d2i(const X509_CRL *crl, int nid, |
| int *out_critical, int *out_idx); |
| |
| // X509_CRL_get0_signature sets `*out_sig` and `*out_alg` to the signature and |
| // signature algorithm of `crl`, respectively. Either output pointer may be NULL |
| // to ignore the value. |
| // |
| // This function outputs the outer signature algorithm, not the one in the |
| // TBSCertList. CRLs with mismatched signature algorithms will successfully |
| // parse, but they will be rejected when verifying. |
| OPENSSL_EXPORT void X509_CRL_get0_signature(const X509_CRL *crl, |
| const ASN1_BIT_STRING **out_sig, |
| const X509_ALGOR **out_alg); |
| |
| // X509_CRL_get_signature_nid returns the NID corresponding to `crl`'s signature |
| // algorithm, or `NID_undef` if the signature algorithm does not correspond to |
| // a known NID. |
| OPENSSL_EXPORT int X509_CRL_get_signature_nid(const X509_CRL *crl); |
| |
| // i2d_X509_CRL_tbs serializes the TBSCertList portion of `crl`, as described in |
| // `i2d_SAMPLE`. |
| // |
| // This function preserves the original encoding of the TBSCertList and may not |
| // reflect modifications made to `crl`. It may be used to manually verify the |
| // signature of an existing CRL. To generate CRLs, use `i2d_re_X509_CRL_tbs` |
| // instead. |
| OPENSSL_EXPORT int i2d_X509_CRL_tbs(const X509_CRL *crl, unsigned char **outp); |
| |
| // X509_CRL_verify checks that `crl` has a valid signature by `pkey`. It returns |
| // one if the signature is valid and zero otherwise. |
| OPENSSL_EXPORT int X509_CRL_verify(const X509_CRL *crl, EVP_PKEY *pkey); |
| |
| |
| // Issuing certificate revocation lists. |
| // |
| // An `X509_CRL` object may also represent an incomplete CRL. Callers may |
| // construct empty `X509_CRL` objects, fill in fields individually, and finally |
| // sign the result. The following functions may be used for this purpose. |
| |
| // X509_CRL_new returns a newly-allocated, empty `X509_CRL` object, or NULL on |
| // error. This object may be filled in and then signed to construct a CRL. |
| OPENSSL_EXPORT X509_CRL *X509_CRL_new(void); |
| |
| // X509_CRL_set_version sets `crl`'s version to `version`, which should be one |
| // of the `X509_CRL_VERSION_*` constants. It returns one on success and zero on |
| // error. |
| // |
| // If unsure, use `X509_CRL_VERSION_2`. Note that, unlike certificates, CRL |
| // versions are only defined up to v2. Callers should not use `X509_VERSION_3`. |
| OPENSSL_EXPORT int X509_CRL_set_version(X509_CRL *crl, long version); |
| |
| // X509_CRL_set_issuer_name sets `crl`'s issuer to a copy of `name`. It returns |
| // one on success and zero on error. |
| OPENSSL_EXPORT int X509_CRL_set_issuer_name(X509_CRL *crl, |
| const X509_NAME *name); |
| |
| // X509_CRL_set1_lastUpdate sets `crl`'s thisUpdate time to `tm`. It returns one |
| // on success and zero on error. The OpenSSL API refers to this field as |
| // lastUpdate. |
| OPENSSL_EXPORT int X509_CRL_set1_lastUpdate(X509_CRL *crl, const ASN1_TIME *tm); |
| |
| // X509_CRL_set1_nextUpdate sets `crl`'s nextUpdate time to `tm`. It returns one |
| // on success and zero on error. |
| OPENSSL_EXPORT int X509_CRL_set1_nextUpdate(X509_CRL *crl, const ASN1_TIME *tm); |
| |
| // X509_CRL_add0_revoked adds `rev` to `crl`. On success, it takes ownership of |
| // `rev` and returns one. On error, it returns zero. If this function fails, the |
| // caller retains ownership of `rev` and must release it when done. |
| OPENSSL_EXPORT int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); |
| |
| // X509_CRL_sort sorts the entries in `crl` by serial number. It returns one on |
| // success and zero on error. |
| OPENSSL_EXPORT int X509_CRL_sort(X509_CRL *crl); |
| |
| // X509_CRL_delete_ext removes the extension in `x` at index `loc` and returns |
| // the removed extension, or NULL if `loc` was out of bounds. If non-NULL, the |
| // caller must release the result with `X509_EXTENSION_free`. |
| OPENSSL_EXPORT X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc); |
| |
| // X509_CRL_add_ext adds a copy of `ex` to `x`. It returns one on success and |
| // zero on failure. The caller retains ownership of `ex` and can release it |
| // independently of `x`. |
| // |
| // The new extension is inserted at index `loc`, shifting extensions to the |
| // right. If `loc` is -1 or out of bounds, the new extension is appended to the |
| // list. |
| OPENSSL_EXPORT int X509_CRL_add_ext(X509_CRL *x, const X509_EXTENSION *ex, |
| int loc); |
| |
| // X509_CRL_add1_ext_i2d behaves like `X509V3_add1_i2d` but adds the extension |
| // to `x`'s extension list. |
| // |
| // WARNING: This function may return zero or -1 on error. The caller must also |
| // ensure `value`'s type matches `nid`. See the documentation for |
| // `X509V3_add1_i2d` for details. |
| OPENSSL_EXPORT int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, |
| int crit, unsigned long flags); |
| |
| // X509_CRL_sign signs `crl` with `pkey` and replaces the signature algorithm |
| // and signature fields. It returns the length of the signature on success and |
| // zero on error. This function uses digest algorithm `md`, or `pkey`'s default |
| // if NULL. Other signing parameters use `pkey`'s defaults. To customize them, |
| // use `X509_CRL_sign_ctx`. |
| OPENSSL_EXPORT int X509_CRL_sign(X509_CRL *crl, EVP_PKEY *pkey, |
| const EVP_MD *md); |
| |
| // X509_CRL_sign_ctx signs `crl` with `ctx` and replaces the signature algorithm |
| // and signature fields. It returns the length of the signature on success and |
| // zero on error. The signature algorithm and parameters come from `ctx`, which |
| // must have been initialized with `EVP_DigestSignInit`. The caller should |
| // configure the corresponding `EVP_PKEY_CTX` before calling this function. |
| // |
| // On success or failure, this function mutates `ctx` and resets it to the empty |
| // state. Caller should not rely on its contents after the function returns. |
| OPENSSL_EXPORT int X509_CRL_sign_ctx(X509_CRL *crl, EVP_MD_CTX *ctx); |
| |
| // i2d_re_X509_CRL_tbs serializes the TBSCertList portion of `crl`, as described |
| // in `i2d_SAMPLE`. |
| // |
| // This function re-encodes the TBSCertList and may not reflect `crl`'s original |
| // encoding. It may be used to manually generate a signature for a new CRL. To |
| // verify CRLs, use `i2d_X509_CRL_tbs` instead. |
| OPENSSL_EXPORT int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **outp); |
| |
| // X509_CRL_set1_signature_algo sets `crl`'s signature algorithm to `algo` and |
| // returns one on success or zero on error. It updates both the signature field |
| // of the TBSCertList structure, and the signatureAlgorithm field of the CRL. |
| OPENSSL_EXPORT int X509_CRL_set1_signature_algo(X509_CRL *crl, |
| const X509_ALGOR *algo); |
| |
| // X509_CRL_set1_signature_value sets `crl`'s signature to a copy of the |
| // `sig_len` bytes pointed by `sig`. It returns one on success and zero on |
| // error. |
| // |
| // Due to a specification error, X.509 CRLs store signatures in ASN.1 BIT |
| // STRINGs, but signature algorithms return byte strings rather than bit |
| // strings. This function creates a BIT STRING containing a whole number of |
| // bytes, with the bit order matching the DER encoding. This matches the |
| // encoding used by all X.509 signature algorithms. |
| OPENSSL_EXPORT int X509_CRL_set1_signature_value(X509_CRL *crl, |
| const uint8_t *sig, |
| size_t sig_len); |
| |
| |
| // CRL entries. |
| // |
| // Each entry of a CRL is represented as an `X509_REVOKED` object, which |
| // describes a revoked certificate by serial number. |
| // |
| // When an `X509_REVOKED` is obtained from an `X509_CRL` object, it is an error |
| // to mutate the object. Doing so may break `X509_CRL`'s and cause the library |
| // to behave incorrectly. |
| |
| // X509_REVOKED_new returns a newly-allocated, empty `X509_REVOKED` object, or |
| // NULL on allocation error. |
| OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_new(void); |
| |
| // X509_REVOKED_free releases memory associated with `rev`. |
| OPENSSL_EXPORT void X509_REVOKED_free(X509_REVOKED *rev); |
| |
| // d2i_X509_REVOKED parses up to `len` bytes from `*inp` as a DER-encoded X.509 |
| // CRL entry, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_REVOKED *d2i_X509_REVOKED(X509_REVOKED **out, |
| const uint8_t **inp, long len); |
| |
| // i2d_X509_REVOKED marshals `alg` as a DER-encoded X.509 CRL entry, as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_REVOKED(const X509_REVOKED *alg, uint8_t **outp); |
| |
| // X509_REVOKED_dup returns a newly-allocated copy of `rev`, or NULL on error. |
| // This function works by serializing the structure, so if `rev` is incomplete, |
| // it may fail. |
| OPENSSL_EXPORT X509_REVOKED *X509_REVOKED_dup(const X509_REVOKED *rev); |
| |
| // X509_REVOKED_get0_serialNumber returns the serial number of the certificate |
| // revoked by `revoked`. |
| OPENSSL_EXPORT const ASN1_INTEGER *X509_REVOKED_get0_serialNumber( |
| const X509_REVOKED *revoked); |
| |
| // X509_REVOKED_set_serialNumber sets `revoked`'s serial number to `serial`. It |
| // returns one on success or zero on error. |
| OPENSSL_EXPORT int X509_REVOKED_set_serialNumber(X509_REVOKED *revoked, |
| const ASN1_INTEGER *serial); |
| |
| // X509_REVOKED_get0_revocationDate returns the revocation time of the |
| // certificate revoked by `revoked`. |
| OPENSSL_EXPORT const ASN1_TIME *X509_REVOKED_get0_revocationDate( |
| const X509_REVOKED *revoked); |
| |
| // X509_REVOKED_set_revocationDate sets `revoked`'s revocation time to `tm`. It |
| // returns one on success or zero on error. |
| OPENSSL_EXPORT int X509_REVOKED_set_revocationDate(X509_REVOKED *revoked, |
| const ASN1_TIME *tm); |
| |
| // X509_REVOKED_get0_extensions returns `r`'s extensions list, or NULL if `r` |
| // omits it. A CRL can have extensions on individual entries, which is this |
| // function, or on the overall CRL, which is `X509_CRL_get0_extensions`. |
| OPENSSL_EXPORT const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions( |
| const X509_REVOKED *r); |
| |
| // X509_REVOKED_get_ext_count returns the number of extensions in `x`. |
| OPENSSL_EXPORT int X509_REVOKED_get_ext_count(const X509_REVOKED *x); |
| |
| // X509_REVOKED_get_ext_by_NID behaves like `X509v3_get_ext_by_NID` but searches |
| // for extensions in `x`. |
| OPENSSL_EXPORT int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, |
| int lastpos); |
| |
| // X509_REVOKED_get_ext_by_OBJ behaves like `X509v3_get_ext_by_OBJ` but searches |
| // for extensions in `x`. |
| OPENSSL_EXPORT int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, |
| const ASN1_OBJECT *obj, |
| int lastpos); |
| |
| // X509_REVOKED_get_ext_by_critical behaves like `X509v3_get_ext_by_critical` |
| // but searches for extensions in `x`. |
| OPENSSL_EXPORT int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, |
| int crit, int lastpos); |
| |
| // X509_REVOKED_get_ext returns the extension in `x` at index `loc`, or NULL if |
| // `loc` is out of bounds. This function returns a non-const pointer for OpenSSL |
| // compatibility, but callers should not mutate the result. |
| OPENSSL_EXPORT X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, |
| int loc); |
| |
| // X509_REVOKED_delete_ext removes the extension in `x` at index `loc` and |
| // returns the removed extension, or NULL if `loc` was out of bounds. If |
| // non-NULL, the caller must release the result with `X509_EXTENSION_free`. |
| OPENSSL_EXPORT X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, |
| int loc); |
| |
| // X509_REVOKED_add_ext adds a copy of `ex` to `x`. It returns one on success |
| // and zero on failure. The caller retains ownership of `ex` and can release it |
| // independently of `x`. |
| // |
| // The new extension is inserted at index `loc`, shifting extensions to the |
| // right. If `loc` is -1 or out of bounds, the new extension is appended to the |
| // list. |
| OPENSSL_EXPORT int X509_REVOKED_add_ext(X509_REVOKED *x, |
| const X509_EXTENSION *ex, int loc); |
| |
| // X509_REVOKED_get_ext_d2i behaves like `X509V3_get_d2i` but looks for the |
| // extension in `revoked`'s extension list. |
| // |
| // WARNING: This function is difficult to use correctly. See the documentation |
| // for `X509V3_get_d2i` for details. |
| OPENSSL_EXPORT void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *revoked, |
| int nid, int *out_critical, |
| int *out_idx); |
| |
| // X509_REVOKED_add1_ext_i2d behaves like `X509V3_add1_i2d` but adds the |
| // extension to `x`'s extension list. |
| // |
| // WARNING: This function may return zero or -1 on error. The caller must also |
| // ensure `value`'s type matches `nid`. See the documentation for |
| // `X509V3_add1_i2d` for details. |
| OPENSSL_EXPORT int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, |
| void *value, int crit, |
| unsigned long flags); |
| |
| |
| // Certificate requests. |
| // |
| // An `X509_REQ` represents a PKCS #10 certificate request (RFC 2986). These are |
| // also referred to as certificate signing requests or CSRs. CSRs are a common |
| // format used to request a certificate from a CA. |
| // |
| // Although an `X509_REQ` is a mutable object, mutating an `X509_REQ` can give |
| // incorrect results. Callers typically obtain `X509_REQ`s by parsing some input |
| // with `d2i_X509_REQ`, etc. Such objects carry information such as the |
| // serialized CertificationRequestInfo, which will become inconsistent when |
| // mutated. |
| // |
| // Instead, mutation functions should only be used when issuing new CRLs, as |
| // described in a later section. |
| |
| // X509_REQ_dup returns a newly-allocated copy of `req`, or NULL on error. This |
| // function works by serializing the structure, so if `req` is incomplete, it |
| // may fail. |
| OPENSSL_EXPORT X509_REQ *X509_REQ_dup(const X509_REQ *req); |
| |
| // X509_REQ_free releases memory associated with `req`. |
| OPENSSL_EXPORT void X509_REQ_free(X509_REQ *req); |
| |
| // d2i_X509_REQ parses up to `len` bytes from `*inp` as a DER-encoded |
| // CertificateRequest (RFC 2986), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_REQ *d2i_X509_REQ(X509_REQ **out, const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_REQ marshals `req` as a CertificateRequest (RFC 2986), as described |
| // in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_REQ(const X509_REQ *req, uint8_t **outp); |
| |
| // X509_REQ_VERSION_1 is the version constant for `X509_REQ` objects. No other |
| // versions are defined. |
| #define X509_REQ_VERSION_1 0 |
| |
| // X509_REQ_get_version returns the numerical value of `req`'s version. This |
| // will always be `X509_REQ_VERSION_1` for valid CSRs. For compatibility, |
| // `d2i_X509_REQ` also accepts some invalid version numbers, in which case this |
| // function may return other values. |
| OPENSSL_EXPORT long X509_REQ_get_version(const X509_REQ *req); |
| |
| // X509_REQ_get_subject_name returns `req`'s subject name. Note this function is |
| // not const-correct for legacy reasons. |
| OPENSSL_EXPORT X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req); |
| |
| // X509_REQ_get0_pubkey returns `req`'s public key as an `EVP_PKEY`, or NULL if |
| // the public key was unsupported or could not be decoded. The `EVP_PKEY` is |
| // cached in `req`, so callers must not mutate the result. |
| OPENSSL_EXPORT EVP_PKEY *X509_REQ_get0_pubkey(const X509_REQ *req); |
| |
| // X509_REQ_get_pubkey behaves like `X509_REQ_get0_pubkey` but increments the |
| // reference count on the `EVP_PKEY`. The caller must release the result with |
| // `EVP_PKEY_free` when done. The `EVP_PKEY` is cached in `req`, so callers must |
| // not mutate the result. |
| OPENSSL_EXPORT EVP_PKEY *X509_REQ_get_pubkey(const X509_REQ *req); |
| |
| // X509_REQ_check_private_key returns one if `req`'s public key matches `pkey` |
| // and zero otherwise. |
| OPENSSL_EXPORT int X509_REQ_check_private_key(const X509_REQ *req, |
| const EVP_PKEY *pkey); |
| |
| // X509_REQ_get_attr_count returns the number of attributes in `req`. |
| OPENSSL_EXPORT int X509_REQ_get_attr_count(const X509_REQ *req); |
| |
| // X509_REQ_get_attr returns the attribute at index `loc` in `req`, or NULL if |
| // out of bounds. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc); |
| |
| // X509_REQ_get_attr_by_NID returns the index of the attribute in `req` of type |
| // `nid`, or a negative number if not found. If found, callers can use |
| // `X509_REQ_get_attr` to look up the attribute by index. |
| // |
| // If `lastpos` is non-negative, it begins searching at `lastpos` + 1. Callers |
| // can thus loop over all matching attributes by first passing -1 and then |
| // passing the previously-returned value until no match is returned. |
| OPENSSL_EXPORT int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, |
| int lastpos); |
| |
| // X509_REQ_get_attr_by_OBJ behaves like `X509_REQ_get_attr_by_NID` but looks |
| // for attributes of type `obj`. |
| OPENSSL_EXPORT int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, |
| const ASN1_OBJECT *obj, |
| int lastpos); |
| |
| // X509_REQ_extension_nid returns one if `nid` is a supported CSR attribute type |
| // for carrying extensions and zero otherwise. The supported types are |
| // `NID_ext_req` (pkcs-9-at-extensionRequest from RFC 2985) and `NID_ms_ext_req` |
| // (a Microsoft szOID_CERT_EXTENSIONS variant). |
| OPENSSL_EXPORT int X509_REQ_extension_nid(int nid); |
| |
| // X509_REQ_get_extensions decodes the most preferred list of requested |
| // extensions in `req` and returns a newly-allocated `STACK_OF(X509_EXTENSION)` |
| // containing the result. It returns NULL on error, or if `req` did not request |
| // extensions. |
| // |
| // CSRs do not store extensions directly. Instead there are attribute types |
| // which are defined to hold extensions. See `X509_REQ_extension_nid`. This |
| // function supports both pkcs-9-at-extensionRequest from RFC 2985 and the |
| // Microsoft szOID_CERT_EXTENSIONS variant. If both are present, |
| // pkcs-9-at-extensionRequest is preferred. |
| OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions( |
| const X509_REQ *req); |
| |
| // X509_REQ_get0_signature sets `*out_sig` and `*out_alg` to the signature and |
| // signature algorithm of `req`, respectively. Either output pointer may be NULL |
| // to ignore the value. |
| OPENSSL_EXPORT void X509_REQ_get0_signature(const X509_REQ *req, |
| const ASN1_BIT_STRING **out_sig, |
| const X509_ALGOR **out_alg); |
| |
| // X509_REQ_get_signature_nid returns the NID corresponding to `req`'s signature |
| // algorithm, or `NID_undef` if the signature algorithm does not correspond to |
| // a known NID. |
| OPENSSL_EXPORT int X509_REQ_get_signature_nid(const X509_REQ *req); |
| |
| // X509_REQ_verify checks that `req` has a valid signature by `pkey`. It returns |
| // one if the signature is valid and zero otherwise. |
| OPENSSL_EXPORT int X509_REQ_verify(const X509_REQ *req, EVP_PKEY *pkey); |
| |
| // X509_REQ_get1_email returns a newly-allocated list of NUL-terminated strings |
| // containing all email addresses in `req`'s subject and all rfc822name names |
| // in `req`'s subject alternative names. The subject alternative names extension |
| // is extracted from the result of `X509_REQ_get_extensions`. Email addresses |
| // which contain embedded NUL bytes are skipped. The results are returned in an |
| // arbitrary order. |
| // |
| // On error, or if there are no such email addresses, it returns NULL. When |
| // done, the caller must release the result with `X509_email_free`. |
| OPENSSL_EXPORT STACK_OF(OPENSSL_STRING) *X509_REQ_get1_email( |
| const X509_REQ *req); |
| |
| |
| // Issuing certificate requests. |
| // |
| // An `X509_REQ` object may also represent an incomplete CSR. Callers may |
| // construct empty `X509_REQ` objects, fill in fields individually, and finally |
| // sign the result. The following functions may be used for this purpose. |
| |
| // X509_REQ_new returns a newly-allocated, empty `X509_REQ` object, or NULL on |
| // error. This object may be filled in and then signed to construct a CSR. |
| OPENSSL_EXPORT X509_REQ *X509_REQ_new(void); |
| |
| // X509_REQ_set_version sets `req`'s version to `version`, which should be |
| // `X509_REQ_VERSION_1`. It returns one on success and zero on error. |
| // |
| // The only defined CSR version is `X509_REQ_VERSION_1`, so there is no need to |
| // call this function. |
| OPENSSL_EXPORT int X509_REQ_set_version(X509_REQ *req, long version); |
| |
| // X509_REQ_set_subject_name sets `req`'s subject to a copy of `name`. It |
| // returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_REQ_set_subject_name(X509_REQ *req, X509_NAME *name); |
| |
| // X509_REQ_set_pubkey sets `req`'s public key to `pkey`. It returns one on |
| // success and zero on error. This function does not take ownership of `pkey` |
| // and internally copies and updates reference counts as needed. |
| OPENSSL_EXPORT int X509_REQ_set_pubkey(X509_REQ *req, EVP_PKEY *pkey); |
| |
| // X509_REQ_delete_attr removes the attribute at index `loc` in `req`. It |
| // returns the removed attribute to the caller, or NULL if `loc` was out of |
| // bounds. If non-NULL, the caller must release the result with |
| // `X509_ATTRIBUTE_free` when done. It is also safe, but not necessary, to call |
| // `X509_ATTRIBUTE_free` if the result is NULL. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc); |
| |
| // X509_REQ_add1_attr appends a copy of `attr` to `req`'s list of attributes. It |
| // returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_REQ_add1_attr(X509_REQ *req, |
| const X509_ATTRIBUTE *attr); |
| |
| // X509_REQ_add1_attr_by_OBJ appends a new attribute to `req` with type `obj`. |
| // It returns one on success and zero on error. The value is determined by |
| // `X509_ATTRIBUTE_set1_data`. |
| // |
| // WARNING: The interpretation of `attrtype`, `data`, and `len` is complex and |
| // error-prone. See `X509_ATTRIBUTE_set1_data` for details. |
| OPENSSL_EXPORT int X509_REQ_add1_attr_by_OBJ(X509_REQ *req, |
| const ASN1_OBJECT *obj, |
| int attrtype, |
| const unsigned char *data, |
| int len); |
| |
| // X509_REQ_add1_attr_by_NID behaves like `X509_REQ_add1_attr_by_OBJ` except the |
| // attribute type is determined by `nid`. |
| OPENSSL_EXPORT int X509_REQ_add1_attr_by_NID(X509_REQ *req, int nid, |
| int attrtype, |
| const unsigned char *data, |
| int len); |
| |
| // X509_REQ_add1_attr_by_txt behaves like `X509_REQ_add1_attr_by_OBJ` except the |
| // attribute type is determined by calling `OBJ_txt2obj` with `attrname`. |
| OPENSSL_EXPORT int X509_REQ_add1_attr_by_txt(X509_REQ *req, |
| const char *attrname, int attrtype, |
| const unsigned char *data, |
| int len); |
| |
| // X509_REQ_add_extensions_nid adds an attribute to `req` of type `nid`, to |
| // request the certificate extensions in `exts`. It returns one on success and |
| // zero on error. `nid` should be `NID_ext_req` or `NID_ms_ext_req`. |
| OPENSSL_EXPORT int X509_REQ_add_extensions_nid( |
| X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts, int nid); |
| |
| // X509_REQ_add_extensions behaves like `X509_REQ_add_extensions_nid`, using the |
| // standard `NID_ext_req` for the attribute type. |
| OPENSSL_EXPORT int X509_REQ_add_extensions( |
| X509_REQ *req, const STACK_OF(X509_EXTENSION) *exts); |
| |
| // X509_REQ_sign signs `req` with `pkey` and replaces the signature algorithm |
| // and signature fields. It returns the length of the signature on success and |
| // zero on error. This function uses digest algorithm `md`, or `pkey`'s default |
| // if NULL. Other signing parameters use `pkey`'s defaults. To customize them, |
| // use `X509_REQ_sign_ctx`. |
| OPENSSL_EXPORT int X509_REQ_sign(X509_REQ *req, EVP_PKEY *pkey, |
| const EVP_MD *md); |
| |
| // X509_REQ_sign_ctx signs `req` with `ctx` and replaces the signature algorithm |
| // and signature fields. It returns the length of the signature on success and |
| // zero on error. The signature algorithm and parameters come from `ctx`, which |
| // must have been initialized with `EVP_DigestSignInit`. The caller should |
| // configure the corresponding `EVP_PKEY_CTX` before calling this function. |
| // |
| // On success or failure, this function mutates `ctx` and resets it to the empty |
| // state. Caller should not rely on its contents after the function returns. |
| OPENSSL_EXPORT int X509_REQ_sign_ctx(X509_REQ *req, EVP_MD_CTX *ctx); |
| |
| // i2d_re_X509_REQ_tbs serializes the CertificationRequestInfo (see RFC 2986) |
| // portion of `req`, as described in `i2d_SAMPLE`. |
| // |
| // This function re-encodes the CertificationRequestInfo and may not reflect |
| // `req`'s original encoding. It may be used to manually generate a signature |
| // for a new certificate request. |
| OPENSSL_EXPORT int i2d_re_X509_REQ_tbs(X509_REQ *req, uint8_t **outp); |
| |
| // X509_REQ_set1_signature_algo sets `req`'s signature algorithm to `algo` and |
| // returns one on success or zero on error. |
| OPENSSL_EXPORT int X509_REQ_set1_signature_algo(X509_REQ *req, |
| const X509_ALGOR *algo); |
| |
| // X509_REQ_set1_signature_value sets `req`'s signature to a copy of the |
| // `sig_len` bytes pointed by `sig`. It returns one on success and zero on |
| // error. |
| // |
| // Due to a specification error, PKCS#10 certificate requests store signatures |
| // in ASN.1 BIT STRINGs, but signature algorithms return byte strings rather |
| // than bit strings. This function creates a BIT STRING containing a whole |
| // number of bytes, with the bit order matching the DER encoding. This matches |
| // the encoding used by all X.509 signature algorithms. |
| OPENSSL_EXPORT int X509_REQ_set1_signature_value(X509_REQ *req, |
| const uint8_t *sig, |
| size_t sig_len); |
| |
| |
| // Names. |
| // |
| // An `X509_NAME` represents an X.509 Name structure (RFC 5280). X.509 names are |
| // a complex, hierarchical structure over a collection of attributes. Each name |
| // is sequence of relative distinguished names (RDNs), decreasing in |
| // specificity. For example, the first RDN may specify the country, while the |
| // next RDN may specify a locality. Each RDN is, itself, a set of attributes. |
| // Having more than one attribute in an RDN is uncommon, but possible. Within an |
| // RDN, attributes have the same level in specificity. Attribute types are |
| // OBJECT IDENTIFIERs. This determines the ASN.1 type of the value, which is |
| // commonly a string but may be other types. |
| // |
| // The `X509_NAME` representation flattens this two-level structure into a |
| // single list of attributes. Each attribute is stored in an `X509_NAME_ENTRY`, |
| // with also maintains the index of the RDN it is part of, accessible via |
| // `X509_NAME_ENTRY_set`. This can be used to recover the two-level structure. |
| // |
| // X.509 names are largely vestigial. Historically, DNS names were parsed out of |
| // the subject's common name attribute, but this is deprecated and has since |
| // moved to the subject alternative name extension. In modern usage, X.509 names |
| // are primarily opaque identifiers to link a certificate with its issuer. |
| |
| DEFINE_STACK_OF(X509_NAME_ENTRY) |
| DEFINE_STACK_OF(X509_NAME) |
| |
| // X509_NAME is an `ASN1_ITEM` whose ASN.1 type is X.509 Name (RFC 5280) and C |
| // type is `X509_NAME*`. |
| DECLARE_ASN1_ITEM(X509_NAME) |
| |
| // X509_NAME_new returns a new, empty `X509_NAME`, or NULL on error. |
| OPENSSL_EXPORT X509_NAME *X509_NAME_new(void); |
| |
| // X509_NAME_free releases memory associated with `name`. |
| OPENSSL_EXPORT void X509_NAME_free(X509_NAME *name); |
| |
| // d2i_X509_NAME parses up to `len` bytes from `*inp` as a DER-encoded X.509 |
| // Name (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_NAME *d2i_X509_NAME(X509_NAME **out, const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_NAME marshals `in` as a DER-encoded X.509 Name (RFC 5280), as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_NAME(const X509_NAME *in, uint8_t **outp); |
| |
| // X509_NAME_dup returns a newly-allocated copy of `name`, or NULL on error. |
| OPENSSL_EXPORT X509_NAME *X509_NAME_dup(const X509_NAME *name); |
| |
| // X509_NAME_cmp compares `a` and `b`'s canonicalized forms. It returns zero if |
| // they are equal, one if `a` sorts after `b`, -1 if `b` sorts after `a`, and -2 |
| // on error. |
| // |
| // TODO(https://crbug.com/boringssl/355): The -2 return is very inconvenient to |
| // pass to a sorting function. Can we make this infallible? In the meantime, |
| // prefer to use this function only for equality checks rather than comparisons. |
| // Although even the library itself passes this to a sorting function. |
| OPENSSL_EXPORT int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b); |
| |
| // X509_NAME_get0_der marshals `name` as a DER-encoded X.509 Name (RFC 5280). On |
| // success, it returns one and sets `*out_der` and `*out_der_len` to a buffer |
| // containing the result. Otherwise, it returns zero. `*out_der` is owned by |
| // `name` and must not be freed by the caller. It is invalidated after `name` is |
| // mutated or freed. |
| OPENSSL_EXPORT int X509_NAME_get0_der(const X509_NAME *name, |
| const uint8_t **out_der, |
| size_t *out_der_len); |
| |
| // X509_NAME_set makes a copy of `name`. On success, it frees `*xn`, sets `*xn` |
| // to the copy, and returns one. Otherwise, it returns zero. |
| OPENSSL_EXPORT int X509_NAME_set(X509_NAME **xn, const X509_NAME *name); |
| |
| // X509_NAME_entry_count returns the number of entries in `name`. |
| OPENSSL_EXPORT int X509_NAME_entry_count(const X509_NAME *name); |
| |
| // X509_NAME_get_index_by_NID returns the zero-based index of the first |
| // attribute in `name` with type `nid`, or -1 if there is none. `nid` should be |
| // one of the `NID_*` constants. If `lastpos` is non-negative, it begins |
| // searching at `lastpos+1`. To search all attributes, pass in -1, not zero. |
| // |
| // Indices from this function refer to `X509_NAME`'s flattened representation. |
| OPENSSL_EXPORT int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, |
| int lastpos); |
| |
| // X509_NAME_get_index_by_OBJ behaves like `X509_NAME_get_index_by_NID` but |
| // looks for attributes with type `obj`. |
| OPENSSL_EXPORT int X509_NAME_get_index_by_OBJ(const X509_NAME *name, |
| const ASN1_OBJECT *obj, |
| int lastpos); |
| |
| // X509_NAME_get_entry returns the attribute in `name` at index `loc`, or NULL |
| // if `loc` is out of range. `loc` is interpreted using `X509_NAME`'s flattened |
| // representation. This function returns a non-const pointer for OpenSSL |
| // compatibility, but callers should not mutate the result. Doing so will break |
| // internal invariants in the library. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, |
| int loc); |
| |
| // X509_NAME_delete_entry removes and returns the attribute in `name` at index |
| // `loc`, or NULL if `loc` is out of range. `loc` is interpreted using |
| // `X509_NAME`'s flattened representation. If the attribute is found, the caller |
| // is responsible for releasing the result with `X509_NAME_ENTRY_free`. |
| // |
| // This function will internally update RDN indices (see `X509_NAME_ENTRY_set`) |
| // so they continue to be consecutive. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, |
| int loc); |
| |
| // X509_NAME_add_entry adds a copy of `entry` to `name` and returns one on |
| // success or zero on error. If `loc` is -1, the entry is appended to `name`. |
| // Otherwise, it is inserted at index `loc`. If `set` is -1, the entry is added |
| // to the previous entry's RDN. If it is 0, the entry becomes a singleton RDN. |
| // If 1, it is added to next entry's RDN. |
| // |
| // This function will internally update RDN indices (see `X509_NAME_ENTRY_set`) |
| // so they continue to be consecutive. |
| OPENSSL_EXPORT int X509_NAME_add_entry(X509_NAME *name, |
| const X509_NAME_ENTRY *entry, int loc, |
| int set); |
| |
| // X509_NAME_add_entry_by_OBJ adds a new entry to `name` and returns one on |
| // success or zero on error. The entry's attribute type is `obj`. The entry's |
| // attribute value is determined by `type`, `bytes`, and `len`, as in |
| // `X509_NAME_ENTRY_set_data`. The entry's position is determined by `loc` and |
| // `set` as in `X509_NAME_add_entry`. |
| OPENSSL_EXPORT int X509_NAME_add_entry_by_OBJ(X509_NAME *name, |
| const ASN1_OBJECT *obj, int type, |
| const uint8_t *bytes, |
| ossl_ssize_t len, int loc, |
| int set); |
| |
| // X509_NAME_add_entry_by_NID behaves like `X509_NAME_add_entry_by_OBJ` but sets |
| // the entry's attribute type to `nid`, which should be one of the `NID_*` |
| // constants. |
| OPENSSL_EXPORT int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, |
| int type, const uint8_t *bytes, |
| ossl_ssize_t len, int loc, |
| int set); |
| |
| // X509_NAME_add_entry_by_txt behaves like `X509_NAME_add_entry_by_OBJ` but sets |
| // the entry's attribute type to `field`, which is passed to `OBJ_txt2obj`. |
| OPENSSL_EXPORT int X509_NAME_add_entry_by_txt(X509_NAME *name, |
| const char *field, int type, |
| const uint8_t *bytes, |
| ossl_ssize_t len, int loc, |
| int set); |
| |
| // X509_NAME_ENTRY_new returns a new, empty `X509_NAME_ENTRY`, or NULL on error. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_new(void); |
| |
| // X509_NAME_ENTRY_free releases memory associated with `entry`. |
| OPENSSL_EXPORT void X509_NAME_ENTRY_free(X509_NAME_ENTRY *entry); |
| |
| // X509_NAME_ENTRY_dup returns a newly-allocated copy of `entry`, or NULL on |
| // error. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_dup( |
| const X509_NAME_ENTRY *entry); |
| |
| // X509_NAME_ENTRY_get_object returns `entry`'s attribute type. This function |
| // returns a non-const pointer for OpenSSL compatibility, but callers should not |
| // mutate the result. Doing so will break internal invariants in the library. |
| OPENSSL_EXPORT ASN1_OBJECT *X509_NAME_ENTRY_get_object( |
| const X509_NAME_ENTRY *entry); |
| |
| // X509_NAME_ENTRY_set_object sets `entry`'s attribute type to `obj`. It returns |
| // one on success and zero on error. |
| OPENSSL_EXPORT int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *entry, |
| const ASN1_OBJECT *obj); |
| |
| // X509_NAME_ENTRY_get_data returns `entry`'s attribute value, represented as an |
| // `ASN1_STRING`. This value may have any ASN.1 type, so callers must check the |
| // type before interpreting the contents. This function returns a non-const |
| // pointer for OpenSSL compatibility, but callers should not mutate the result. |
| // Doing so will break internal invariants in the library. |
| // |
| // See `ASN1_STRING` for how values are represented in this library. Where a |
| // specific `ASN1_STRING` representation exists, that representation is used. |
| // Otherwise, the `V_ASN1_OTHER` representation is used. Note that NULL, OBJECT |
| // IDENTIFIER, and BOOLEAN attribute values are represented as `V_ASN1_OTHER`, |
| // because their usual representation in this library is not |
| // `ASN1_STRING`-compatible. |
| OPENSSL_EXPORT ASN1_STRING *X509_NAME_ENTRY_get_data( |
| const X509_NAME_ENTRY *entry); |
| |
| // X509_NAME_ENTRY_set_data sets `entry`'s value to `len` bytes from `bytes`. It |
| // returns one on success and zero on error. If `len` is -1, `bytes` must be a |
| // NUL-terminated C string and the length is determined by `strlen`. `bytes` is |
| // converted to an ASN.1 type as follows: |
| // |
| // If `type` is a `MBSTRING_*` constant, the value is an ASN.1 string. The |
| // string is determined by decoding `bytes` in the encoding specified by `type`, |
| // and then re-encoding it in a form appropriate for `entry`'s attribute type. |
| // See `ASN1_STRING_set_by_NID` for details. |
| // |
| // Otherwise, the value is an `ASN1_STRING` with type `type` and value `bytes`. |
| // See `ASN1_STRING` for how to format ASN.1 types as an `ASN1_STRING`. If |
| // `type` is `V_ASN1_UNDEF` the previous `ASN1_STRING` type is reused. |
| OPENSSL_EXPORT int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *entry, int type, |
| const uint8_t *bytes, |
| ossl_ssize_t len); |
| |
| // X509_NAME_ENTRY_set returns the zero-based index of the RDN which contains |
| // `entry`. Consecutive entries with the same index are part of the same RDN. |
| OPENSSL_EXPORT int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *entry); |
| |
| // X509_NAME_ENTRY_create_by_OBJ creates a new `X509_NAME_ENTRY` with attribute |
| // type `obj`. The attribute value is determined from `type`, `bytes`, and `len` |
| // as in `X509_NAME_ENTRY_set_data`. It returns the `X509_NAME_ENTRY` on success |
| // and NULL on error. |
| // |
| // If `out` is non-NULL and `*out` is NULL, it additionally sets `*out` to the |
| // result on success. If both `out` and `*out` are non-NULL, it updates the |
| // object at `*out` instead of allocating a new one. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ( |
| X509_NAME_ENTRY **out, const ASN1_OBJECT *obj, int type, |
| const uint8_t *bytes, ossl_ssize_t len); |
| |
| // X509_NAME_ENTRY_create_by_NID behaves like `X509_NAME_ENTRY_create_by_OBJ` |
| // except the attribute type is `nid`, which should be one of the `NID_*` |
| // constants. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID( |
| X509_NAME_ENTRY **out, int nid, int type, const uint8_t *bytes, |
| ossl_ssize_t len); |
| |
| // X509_NAME_ENTRY_create_by_txt behaves like `X509_NAME_ENTRY_create_by_OBJ` |
| // except the attribute type is `field`, which is passed to `OBJ_txt2obj`. |
| OPENSSL_EXPORT X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt( |
| X509_NAME_ENTRY **out, const char *field, int type, const uint8_t *bytes, |
| ossl_ssize_t len); |
| |
| |
| // Public keys. |
| // |
| // X.509 encodes public keys as SubjectPublicKeyInfo (RFC 5280), sometimes |
| // referred to as SPKI. These are represented in this library by `X509_PUBKEY`. |
| |
| // X509_PUBKEY_new returns a newly-allocated, empty `X509_PUBKEY` object, or |
| // NULL on error. |
| OPENSSL_EXPORT X509_PUBKEY *X509_PUBKEY_new(void); |
| |
| // X509_PUBKEY_free releases memory associated with `key`. |
| OPENSSL_EXPORT void X509_PUBKEY_free(X509_PUBKEY *key); |
| |
| // d2i_X509_PUBKEY parses up to `len` bytes from `*inp` as a DER-encoded |
| // SubjectPublicKeyInfo, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_PUBKEY *d2i_X509_PUBKEY(X509_PUBKEY **out, |
| const uint8_t **inp, long len); |
| |
| // i2d_X509_PUBKEY marshals `key` as a DER-encoded SubjectPublicKeyInfo, as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_PUBKEY(const X509_PUBKEY *key, uint8_t **outp); |
| |
| // X509_PUBKEY_set serializes `pkey` into a newly-allocated `X509_PUBKEY` |
| // structure. On success, it frees `*x` if non-NULL, then sets `*x` to the new |
| // object, and returns one. Otherwise, it returns zero. |
| OPENSSL_EXPORT int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey); |
| |
| // X509_PUBKEY_get0 returns `key` as an `EVP_PKEY`, or NULL if `key` either |
| // could not be parsed or is an unrecognized algorithm. The `EVP_PKEY` is cached |
| // in `key`, so callers must not mutate the result. |
| OPENSSL_EXPORT EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key); |
| |
| // X509_PUBKEY_get behaves like `X509_PUBKEY_get0` but increments the reference |
| // count on the `EVP_PKEY`. The caller must release the result with |
| // `EVP_PKEY_free` when done. The `EVP_PKEY` is cached in `key`, so callers must |
| // not mutate the result. |
| OPENSSL_EXPORT EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key); |
| |
| // X509_PUBKEY_set0_param sets `pub` to a key with AlgorithmIdentifier |
| // determined by `obj`, `param_type`, and `param_value`, and an encoded |
| // public key of `key`. On success, it gives `pub` ownership of all the other |
| // parameters and returns one. Otherwise, it returns zero. `key` must have been |
| // allocated by `OPENSSL_malloc`. `obj` and, if applicable, `param_value` must |
| // not be freed after a successful call, and must have been allocated in a |
| // manner compatible with `ASN1_OBJECT_free` or `ASN1_STRING_free`. |
| // |
| // `obj`, `param_type`, and `param_value` are interpreted as in |
| // `X509_ALGOR_set0`. See `X509_ALGOR_set0` for details. |
| OPENSSL_EXPORT int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *obj, |
| int param_type, void *param_value, |
| uint8_t *key, int key_len); |
| |
| // X509_PUBKEY_get0_param outputs fields of `pub` and returns one. If `out_obj` |
| // is not NULL, it sets `*out_obj` to AlgorithmIdentifier's OID. If `out_key` |
| // is not NULL, it sets `*out_key` and `*out_key_len` to the encoded public key. |
| // If `out_alg` is not NULL, it sets `*out_alg` to the AlgorithmIdentifier. |
| // |
| // All pointers outputted by this function are internal to `pub` and must not be |
| // freed by the caller. Additionally, although some outputs are non-const, |
| // callers must not mutate the resulting objects. |
| // |
| // Note: X.509 SubjectPublicKeyInfo structures store the encoded public key as a |
| // BIT STRING. `*out_key` and `*out_key_len` will silently pad the key with zero |
| // bits if `pub` did not contain a whole number of bytes. Use |
| // `X509_PUBKEY_get0_public_key` to preserve this information. |
| OPENSSL_EXPORT int X509_PUBKEY_get0_param(ASN1_OBJECT **out_obj, |
| const uint8_t **out_key, |
| int *out_key_len, |
| X509_ALGOR **out_alg, |
| X509_PUBKEY *pub); |
| |
| // X509_PUBKEY_get0_public_key returns `pub`'s encoded public key. |
| OPENSSL_EXPORT const ASN1_BIT_STRING *X509_PUBKEY_get0_public_key( |
| const X509_PUBKEY *pub); |
| |
| |
| // Extensions. |
| // |
| // X.509 certificates and CRLs may contain a list of extensions (RFC 5280). |
| // Extensions have a type, specified by an object identifier (`ASN1_OBJECT`) and |
| // a byte string value, which should a DER-encoded structure whose type is |
| // determined by the extension type. This library represents extensions with the |
| // `X509_EXTENSION` type. |
| |
| // X509_EXTENSION is an `ASN1_ITEM` whose ASN.1 type is X.509 Extension (RFC |
| // 5280) and C type is `X509_EXTENSION*`. |
| DECLARE_ASN1_ITEM(X509_EXTENSION) |
| |
| // X509_EXTENSION_new returns a newly-allocated, empty `X509_EXTENSION` object |
| // or NULL on error. |
| OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_new(void); |
| |
| // X509_EXTENSION_free releases memory associated with `ex`. |
| OPENSSL_EXPORT void X509_EXTENSION_free(X509_EXTENSION *ex); |
| |
| // d2i_X509_EXTENSION parses up to `len` bytes from `*inp` as a DER-encoded |
| // X.509 Extension (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_EXTENSION *d2i_X509_EXTENSION(X509_EXTENSION **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_EXTENSION marshals `ex` as a DER-encoded X.509 Extension (RFC |
| // 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_EXTENSION(const X509_EXTENSION *ex, uint8_t **outp); |
| |
| // X509_EXTENSION_dup returns a newly-allocated copy of `ex`, or NULL on error. |
| // This function works by serializing the structure, so if `ex` is incomplete, |
| // it may fail. |
| OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_dup(const X509_EXTENSION *ex); |
| |
| // X509_EXTENSION_create_by_NID creates a new `X509_EXTENSION` with type `nid`, |
| // value `data`, and critical bit `crit`. It returns an `X509_EXTENSION` on |
| // success, and NULL on error. `nid` should be a `NID_*` constant. |
| // |
| // If `ex` and `*ex` are both non-NULL, `*ex` is used to hold the result, |
| // otherwise a new object is allocated. If `ex` is non-NULL and `*ex` is NULL, |
| // the function sets `*ex` to point to the newly allocated result, in addition |
| // to returning the result. |
| OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_create_by_NID( |
| X509_EXTENSION **ex, int nid, int crit, const ASN1_OCTET_STRING *data); |
| |
| // X509_EXTENSION_create_by_OBJ behaves like `X509_EXTENSION_create_by_NID`, but |
| // the extension type is determined by an `ASN1_OBJECT`. |
| OPENSSL_EXPORT X509_EXTENSION *X509_EXTENSION_create_by_OBJ( |
| X509_EXTENSION **ex, const ASN1_OBJECT *obj, int crit, |
| const ASN1_OCTET_STRING *data); |
| |
| // X509_EXTENSION_get_object returns `ex`'s extension type. This function |
| // returns a non-const pointer for OpenSSL compatibility, but callers should not |
| // mutate the result. |
| OPENSSL_EXPORT ASN1_OBJECT *X509_EXTENSION_get_object(const X509_EXTENSION *ex); |
| |
| // X509_EXTENSION_get_data returns `ne`'s extension value. This function returns |
| // a non-const pointer for OpenSSL compatibility, but callers should not mutate |
| // the result. |
| OPENSSL_EXPORT ASN1_OCTET_STRING *X509_EXTENSION_get_data( |
| const X509_EXTENSION *ne); |
| |
| // X509_EXTENSION_get_critical returns one if `ex` is critical and zero |
| // otherwise. |
| OPENSSL_EXPORT int X509_EXTENSION_get_critical(const X509_EXTENSION *ex); |
| |
| // X509_EXTENSION_set_object sets `ex`'s extension type to `obj`. It returns one |
| // on success and zero on error. |
| OPENSSL_EXPORT int X509_EXTENSION_set_object(X509_EXTENSION *ex, |
| const ASN1_OBJECT *obj); |
| |
| // X509_EXTENSION_set_critical sets `ex` to critical if `crit` is non-zero and |
| // to non-critical if `crit` is zero. |
| OPENSSL_EXPORT int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit); |
| |
| // X509_EXTENSION_set_data set's `ex`'s extension value to a copy of `data`. It |
| // returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_EXTENSION_set_data(X509_EXTENSION *ex, |
| const ASN1_OCTET_STRING *data); |
| |
| |
| // Extension lists. |
| // |
| // The following functions manipulate lists of extensions. Most of them have |
| // corresponding functions on the containing `X509`, `X509_CRL`, or |
| // `X509_REVOKED`. |
| |
| DEFINE_STACK_OF(X509_EXTENSION) |
| typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS; |
| |
| // d2i_X509_EXTENSIONS parses up to `len` bytes from `*inp` as a DER-encoded |
| // SEQUENCE OF Extension (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_EXTENSIONS *d2i_X509_EXTENSIONS(X509_EXTENSIONS **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_EXTENSIONS marshals `alg` as a DER-encoded SEQUENCE OF Extension |
| // (RFC 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_EXTENSIONS(const X509_EXTENSIONS *alg, |
| uint8_t **outp); |
| |
| // X509v3_get_ext_count returns the number of extensions in `x`. |
| OPENSSL_EXPORT int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x); |
| |
| // X509v3_get_ext_by_NID returns the index of the first extension in `x` with |
| // type `nid`, or a negative number if not found. If found, callers can use |
| // `X509v3_get_ext` to look up the extension by index. |
| // |
| // If `lastpos` is non-negative, it begins searching at `lastpos` + 1. Callers |
| // can thus loop over all matching extensions by first passing -1 and then |
| // passing the previously-returned value until no match is returned. |
| OPENSSL_EXPORT int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, |
| int nid, int lastpos); |
| |
| // X509v3_get_ext_by_OBJ behaves like `X509v3_get_ext_by_NID` but looks for |
| // extensions matching `obj`. |
| OPENSSL_EXPORT int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x, |
| const ASN1_OBJECT *obj, int lastpos); |
| |
| // X509v3_get_ext_by_critical returns the index of the first extension in `x` |
| // whose critical bit matches `crit`, or a negative number if no such extension |
| // was found. |
| // |
| // If `lastpos` is non-negative, it begins searching at `lastpos` + 1. Callers |
| // can thus loop over all matching extensions by first passing -1 and then |
| // passing the previously-returned value until no match is returned. |
| OPENSSL_EXPORT int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x, |
| int crit, int lastpos); |
| |
| // X509v3_get_ext returns the extension in `x` at index `loc`, or NULL if `loc` |
| // is out of bounds. This function returns a non-const pointer for OpenSSL |
| // compatibility, but callers should not mutate the result. |
| OPENSSL_EXPORT X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, |
| int loc); |
| |
| // X509v3_delete_ext removes the extension in `x` at index `loc` and returns the |
| // removed extension, or NULL if `loc` was out of bounds. If an extension was |
| // returned, the caller must release it with `X509_EXTENSION_free`. |
| OPENSSL_EXPORT X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, |
| int loc); |
| |
| // X509v3_add_ext adds a copy of `ex` to the extension list in `*x`. If `*x` is |
| // NULL, it allocates a new `STACK_OF(X509_EXTENSION)` to hold the copy and sets |
| // `*x` to the new list. It returns `*x` on success and NULL on error. The |
| // caller retains ownership of `ex` and can release it independently of `*x`. |
| // |
| // The new extension is inserted at index `loc`, shifting extensions to the |
| // right. If `loc` is -1 or out of bounds, the new extension is appended to the |
| // list. |
| OPENSSL_EXPORT STACK_OF(X509_EXTENSION) *X509v3_add_ext( |
| STACK_OF(X509_EXTENSION) **x, const X509_EXTENSION *ex, int loc); |
| |
| |
| // Built-in extensions. |
| // |
| // Several functions in the library encode and decode extension values into a |
| // C structure to that extension. The following extensions are supported: |
| // |
| // - `NID_authority_key_identifier` with type `AUTHORITY_KEYID` |
| // - `NID_basic_constraints` with type `BASIC_CONSTRAINTS` |
| // - `NID_certificate_issuer` with type `GENERAL_NAMES` |
| // - `NID_certificate_policies` with type `CERTIFICATEPOLICIES` |
| // - `NID_crl_distribution_points` with type `CRL_DIST_POINTS` |
| // - `NID_crl_number` with type `ASN1_INTEGER` |
| // - `NID_crl_reason` with type `ASN1_ENUMERATED` |
| // - `NID_delta_crl` with type `ASN1_INTEGER` |
| // - `NID_ext_key_usage` with type `EXTENDED_KEY_USAGE` |
| // - `NID_freshest_crl` with type `ISSUING_DIST_POINT` |
| // - `NID_id_pkix_OCSP_noCheck` with type `ASN1_NULL` |
| // - `NID_info_access` with type `AUTHORITY_INFO_ACCESS` |
| // - `NID_inhibit_any_policy` with type `ASN1_INTEGER` |
| // - `NID_invalidity_date` with type `ASN1_GENERALIZEDTIME` |
| // - `NID_issuer_alt_name` with type `GENERAL_NAMES` |
| // - `NID_issuing_distribution_point` with type `ISSUING_DIST_POINT` |
| // - `NID_key_usage` with type `ASN1_BIT_STRING` |
| // - `NID_name_constraints` with type `NAME_CONSTRAINTS` |
| // - `NID_netscape_base_url` with type `ASN1_IA5STRING` |
| // - `NID_netscape_ca_policy_url` with type `ASN1_IA5STRING` |
| // - `NID_netscape_ca_revocation_url` with type `ASN1_IA5STRING` |
| // - `NID_netscape_cert_type` with type `ASN1_BIT_STRING` |
| // - `NID_netscape_comment` with type `ASN1_IA5STRING` |
| // - `NID_netscape_renewal_url` with type `ASN1_IA5STRING` |
| // - `NID_netscape_revocation_url` with type `ASN1_IA5STRING` |
| // - `NID_netscape_ssl_server_name` with type `ASN1_IA5STRING` |
| // - `NID_policy_constraints` with type `POLICY_CONSTRAINTS` |
| // - `NID_policy_mappings` with type `POLICY_MAPPINGS` |
| // - `NID_sinfo_access` with type `AUTHORITY_INFO_ACCESS` |
| // - `NID_subject_alt_name` with type `GENERAL_NAMES` |
| // - `NID_subject_key_identifier` with type `ASN1_OCTET_STRING` |
| // |
| // If an extension does not appear in this list, e.g. for a custom extension, |
| // callers can instead use functions such as `X509_get_ext_by_OBJ`, |
| // `X509_EXTENSION_get_data`, and `X509_EXTENSION_create_by_OBJ` to inspect or |
| // create extensions directly. Although the `X509V3_EXT_METHOD` mechanism allows |
| // registering custom extensions, doing so is deprecated and may result in |
| // threading or memory errors. |
| |
| // X509V3_EXT_d2i decodes `ext` and returns a pointer to a newly-allocated |
| // structure, with type dependent on the type of the extension. It returns NULL |
| // if `ext` is an unsupported extension or if there was a syntax error in the |
| // extension. The caller should cast the return value to the expected type and |
| // free the structure when done. |
| // |
| // WARNING: Casting the return value to the wrong type is a potentially |
| // exploitable memory error, so callers must not use this function before |
| // checking `ext` is of a known type. See the list at the top of this section |
| // for the correct types. |
| OPENSSL_EXPORT void *X509V3_EXT_d2i(const X509_EXTENSION *ext); |
| |
| // X509V3_get_d2i finds and decodes the extension in `extensions` of type `nid`. |
| // If found, it decodes it and returns a newly-allocated structure, with type |
| // dependent on `nid`. If the extension is not found or on error, it returns |
| // NULL. The caller may distinguish these cases using the `out_critical` value. |
| // |
| // If `out_critical` is not NULL, this function sets `*out_critical` to one if |
| // the extension is found and critical, zero if it is found and not critical, -1 |
| // if it is not found, and -2 if there is an invalid duplicate extension. Note |
| // this function may set `*out_critical` to one or zero and still return NULL if |
| // the extension is found but has a syntax error. |
| // |
| // If `out_idx` is not NULL, this function looks for the first occurrence of the |
| // extension after `*out_idx`. It then sets `*out_idx` to the index of the |
| // extension, or -1 if not found. If `out_idx` is non-NULL, duplicate extensions |
| // are not treated as an error. Callers, however, should not rely on this |
| // behavior as it may be removed in the future. Duplicate extensions are |
| // forbidden in RFC 5280. |
| // |
| // WARNING: This function is difficult to use correctly. Callers should pass a |
| // non-NULL `out_critical` and check both the return value and `*out_critical` |
| // to handle errors. If the return value is NULL and `*out_critical` is not -1, |
| // there was an error. Otherwise, the function succeeded and but may return NULL |
| // for a missing extension. Callers should pass NULL to `out_idx` so that |
| // duplicate extensions are handled correctly. |
| // |
| // Additionally, casting the return value to the wrong type is a potentially |
| // exploitable memory error, so callers must ensure the cast and `nid` match. |
| // See the list at the top of this section for the correct types. |
| OPENSSL_EXPORT void *X509V3_get_d2i(const STACK_OF(X509_EXTENSION) *extensions, |
| int nid, int *out_critical, int *out_idx); |
| |
| // X509V3_EXT_free casts `ext_data` into the type that corresponds to `nid` and |
| // releases memory associated with it. It returns one on success and zero if |
| // `nid` is not a known extension. |
| // |
| // WARNING: Casting `ext_data` to the wrong type is a potentially exploitable |
| // memory error, so callers must ensure `ext_data`'s type matches `nid`. See the |
| // list at the top of this section for the correct types. |
| // |
| // TODO(davidben): OpenSSL upstream no longer exposes this function. Remove it? |
| OPENSSL_EXPORT int X509V3_EXT_free(int nid, void *ext_data); |
| |
| // X509V3_EXT_i2d casts `ext_struc` into the type that corresponds to |
| // `ext_nid`, serializes it, and returns a newly-allocated `X509_EXTENSION` |
| // object containing the serialization, or NULL on error. The `X509_EXTENSION` |
| // has OID `ext_nid` and is critical if `crit` is one. |
| // |
| // WARNING: Casting `ext_struc` to the wrong type is a potentially exploitable |
| // memory error, so callers must ensure `ext_struct`'s type matches `ext_nid`. |
| // See the list at the top of this section for the correct types. |
| OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, |
| void *ext_struc); |
| |
| // The following constants control the behavior of `X509V3_add1_i2d` and related |
| // functions. |
| |
| // X509V3_ADD_OP_MASK can be ANDed with the flags to determine how duplicate |
| // extensions are processed. |
| #define X509V3_ADD_OP_MASK 0xfL |
| |
| // X509V3_ADD_DEFAULT causes the function to fail if the extension was already |
| // present. |
| #define X509V3_ADD_DEFAULT 0L |
| |
| // X509V3_ADD_APPEND causes the function to unconditionally appended the new |
| // extension to to the extensions list, even if there is a duplicate. |
| #define X509V3_ADD_APPEND 1L |
| |
| // X509V3_ADD_REPLACE causes the function to replace the existing extension, or |
| // append if it is not present. |
| #define X509V3_ADD_REPLACE 2L |
| |
| // X509V3_ADD_REPLACE_EXISTING causes the function to replace the existing |
| // extension and fail if it is not present. |
| #define X509V3_ADD_REPLACE_EXISTING 3L |
| |
| // X509V3_ADD_KEEP_EXISTING causes the function to succeed without replacing the |
| // extension if already present. |
| #define X509V3_ADD_KEEP_EXISTING 4L |
| |
| // X509V3_ADD_DELETE causes the function to remove the matching extension. No |
| // new extension is added. If there is no matching extension, the function |
| // fails. The `value` parameter is ignored in this mode. |
| #define X509V3_ADD_DELETE 5L |
| |
| // X509V3_ADD_SILENT may be ORed into one of the values above to indicate the |
| // function should not add to the error queue on duplicate or missing extension. |
| // The function will continue to return zero in those cases, and it will |
| // continue to return -1 and add to the error queue on other errors. |
| #define X509V3_ADD_SILENT 0x10 |
| |
| // X509V3_add1_i2d casts `value` to the type that corresponds to `nid`, |
| // serializes it, and appends it to the extension list in `*x`. If `*x` is NULL, |
| // it will set `*x` to a newly-allocated `STACK_OF(X509_EXTENSION)` as needed. |
| // The `crit` parameter determines whether the new extension is critical. |
| // `flags` may be some combination of the `X509V3_ADD_*` constants to control |
| // the function's behavior on duplicate extension. |
| // |
| // This function returns one on success, zero if the operation failed due to a |
| // missing or duplicate extension, and -1 on other errors. |
| // |
| // WARNING: Casting `value` to the wrong type is a potentially exploitable |
| // memory error, so callers must ensure `value`'s type matches `nid`. See the |
| // list at the top of this section for the correct types. |
| OPENSSL_EXPORT int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, |
| void *value, int crit, unsigned long flags); |
| |
| |
| // Basic constraints. |
| // |
| // The basic constraints extension (RFC 5280, section 4.2.1.9) determines |
| // whether a certificate is a CA certificate and, if so, optionally constrains |
| // the maximum depth of the certificate chain. |
| |
| // A BASIC_CONSTRAINTS_st, aka `BASIC_CONSTRAINTS` represents an |
| // BasicConstraints structure (RFC 5280). |
| struct BASIC_CONSTRAINTS_st { |
| ASN1_BOOLEAN ca; |
| ASN1_INTEGER *pathlen; |
| } /* BASIC_CONSTRAINTS */; |
| |
| // BASIC_CONSTRAINTS is an `ASN1_ITEM` whose ASN.1 type is BasicConstraints (RFC |
| // 5280) and C type is `BASIC_CONSTRAINTS*`. |
| DECLARE_ASN1_ITEM(BASIC_CONSTRAINTS) |
| |
| // BASIC_CONSTRAINTS_new returns a newly-allocated, empty `BASIC_CONSTRAINTS` |
| // object, or NULL on error. |
| OPENSSL_EXPORT BASIC_CONSTRAINTS *BASIC_CONSTRAINTS_new(void); |
| |
| // BASIC_CONSTRAINTS_free releases memory associated with `bcons`. |
| OPENSSL_EXPORT void BASIC_CONSTRAINTS_free(BASIC_CONSTRAINTS *bcons); |
| |
| // d2i_BASIC_CONSTRAINTS parses up to `len` bytes from `*inp` as a DER-encoded |
| // BasicConstraints (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT BASIC_CONSTRAINTS *d2i_BASIC_CONSTRAINTS(BASIC_CONSTRAINTS **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_BASIC_CONSTRAINTS marshals `bcons` as a DER-encoded BasicConstraints (RFC |
| // 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_BASIC_CONSTRAINTS(const BASIC_CONSTRAINTS *bcons, |
| uint8_t **outp); |
| |
| |
| // Extended key usage. |
| // |
| // The extended key usage extension (RFC 5280, section 4.2.1.12) indicates the |
| // purposes of the certificate's public key. Such constraints are important to |
| // avoid cross-protocol attacks. |
| |
| typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE; |
| |
| // EXTENDED_KEY_USAGE is an `ASN1_ITEM` whose ASN.1 type is ExtKeyUsageSyntax |
| // (RFC 5280) and C type is `STACK_OF(ASN1_OBJECT)*`, or `EXTENDED_KEY_USAGE*`. |
| DECLARE_ASN1_ITEM(EXTENDED_KEY_USAGE) |
| |
| // EXTENDED_KEY_USAGE_new returns a newly-allocated, empty `EXTENDED_KEY_USAGE` |
| // object, or NULL on error. |
| OPENSSL_EXPORT EXTENDED_KEY_USAGE *EXTENDED_KEY_USAGE_new(void); |
| |
| // EXTENDED_KEY_USAGE_free releases memory associated with `eku`. |
| OPENSSL_EXPORT void EXTENDED_KEY_USAGE_free(EXTENDED_KEY_USAGE *eku); |
| |
| // d2i_EXTENDED_KEY_USAGE parses up to `len` bytes from `*inp` as a DER-encoded |
| // ExtKeyUsageSyntax (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT EXTENDED_KEY_USAGE *d2i_EXTENDED_KEY_USAGE( |
| EXTENDED_KEY_USAGE **out, const uint8_t **inp, long len); |
| |
| // i2d_EXTENDED_KEY_USAGE marshals `eku` as a DER-encoded ExtKeyUsageSyntax (RFC |
| // 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_EXTENDED_KEY_USAGE(const EXTENDED_KEY_USAGE *eku, |
| uint8_t **outp); |
| |
| |
| // General names. |
| // |
| // A `GENERAL_NAME` represents an X.509 GeneralName structure, defined in RFC |
| // 5280, Section 4.2.1.6. General names are distinct from names (`X509_NAME`). A |
| // general name is a CHOICE type which may contain one of several name types, |
| // most commonly a DNS name or an IP address. General names most commonly appear |
| // in the subject alternative name (SAN) extension, though they are also used in |
| // other extensions. |
| // |
| // Many extensions contain a SEQUENCE OF GeneralName, or GeneralNames, so |
| // `STACK_OF(GENERAL_NAME)` is defined and aliased to `GENERAL_NAMES`. |
| |
| typedef struct otherName_st { |
| ASN1_OBJECT *type_id; |
| ASN1_TYPE *value; |
| } OTHERNAME; |
| |
| typedef struct EDIPartyName_st { |
| ASN1_STRING *nameAssigner; |
| ASN1_STRING *partyName; |
| } EDIPARTYNAME; |
| |
| // GEN_* are constants for the `type` field of `GENERAL_NAME`, defined below. |
| #define GEN_OTHERNAME 0 |
| #define GEN_EMAIL 1 |
| #define GEN_DNS 2 |
| #define GEN_X400 3 |
| #define GEN_DIRNAME 4 |
| #define GEN_EDIPARTY 5 |
| #define GEN_URI 6 |
| #define GEN_IPADD 7 |
| #define GEN_RID 8 |
| |
| // A GENERAL_NAME_st, aka `GENERAL_NAME`, represents an X.509 GeneralName. The |
| // `type` field determines which member of `d` is active. A `GENERAL_NAME` may |
| // also be empty, in which case `type` is -1 and `d` is NULL. Empty |
| // `GENERAL_NAME`s are invalid and will never be returned from the parser, but |
| // may be created temporarily, e.g. by `GENERAL_NAME_new`. |
| // |
| // WARNING: `type` and `d` must be kept consistent. An inconsistency will result |
| // in a potentially exploitable memory error. |
| struct GENERAL_NAME_st { |
| int type; |
| union { |
| char *ptr; |
| OTHERNAME *otherName; |
| ASN1_IA5STRING *rfc822Name; |
| ASN1_IA5STRING *dNSName; |
| ASN1_STRING *x400Address; |
| X509_NAME *directoryName; |
| EDIPARTYNAME *ediPartyName; |
| ASN1_IA5STRING *uniformResourceIdentifier; |
| ASN1_OCTET_STRING *iPAddress; |
| ASN1_OBJECT *registeredID; |
| |
| // Old names |
| ASN1_OCTET_STRING *ip; // iPAddress |
| X509_NAME *dirn; // dirn |
| ASN1_IA5STRING *ia5; // rfc822Name, dNSName, uniformResourceIdentifier |
| ASN1_OBJECT *rid; // registeredID |
| } d; |
| } /* GENERAL_NAME */; |
| |
| // GENERAL_NAME_new returns a new, empty `GENERAL_NAME`, or NULL on error. |
| OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_new(void); |
| |
| // GENERAL_NAME_free releases memory associated with `gen`. |
| OPENSSL_EXPORT void GENERAL_NAME_free(GENERAL_NAME *gen); |
| |
| // d2i_GENERAL_NAME parses up to `len` bytes from `*inp` as a DER-encoded X.509 |
| // GeneralName (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT GENERAL_NAME *d2i_GENERAL_NAME(GENERAL_NAME **out, |
| const uint8_t **inp, long len); |
| |
| // i2d_GENERAL_NAME marshals `in` as a DER-encoded X.509 GeneralName (RFC 5280), |
| // as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_GENERAL_NAME(const GENERAL_NAME *in, uint8_t **outp); |
| |
| // GENERAL_NAME_dup returns a newly-allocated copy of `gen`, or NULL on error. |
| // This function works by serializing the structure, so it will fail if `gen` is |
| // empty. |
| OPENSSL_EXPORT GENERAL_NAME *GENERAL_NAME_dup(const GENERAL_NAME *gen); |
| |
| // GENERAL_NAMES_new returns a new, empty `GENERAL_NAMES`, or NULL on error. |
| OPENSSL_EXPORT GENERAL_NAMES *GENERAL_NAMES_new(void); |
| |
| // GENERAL_NAMES_free releases memory associated with `gens`. |
| OPENSSL_EXPORT void GENERAL_NAMES_free(GENERAL_NAMES *gens); |
| |
| // d2i_GENERAL_NAMES parses up to `len` bytes from `*inp` as a DER-encoded |
| // SEQUENCE OF GeneralName, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT GENERAL_NAMES *d2i_GENERAL_NAMES(GENERAL_NAMES **out, |
| const uint8_t **inp, long len); |
| |
| // i2d_GENERAL_NAMES marshals `in` as a DER-encoded SEQUENCE OF GeneralName, as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_GENERAL_NAMES(const GENERAL_NAMES *in, uint8_t **outp); |
| |
| // OTHERNAME_new returns a new, empty `OTHERNAME`, or NULL on error. |
| OPENSSL_EXPORT OTHERNAME *OTHERNAME_new(void); |
| |
| // OTHERNAME_free releases memory associated with `name`. |
| OPENSSL_EXPORT void OTHERNAME_free(OTHERNAME *name); |
| |
| // EDIPARTYNAME_new returns a new, empty `EDIPARTYNAME`, or NULL on error. |
| // EDIPartyName is rarely used in practice, so callers are unlikely to need this |
| // function. |
| OPENSSL_EXPORT EDIPARTYNAME *EDIPARTYNAME_new(void); |
| |
| // EDIPARTYNAME_free releases memory associated with `name`. EDIPartyName is |
| // rarely used in practice, so callers are unlikely to need this function. |
| OPENSSL_EXPORT void EDIPARTYNAME_free(EDIPARTYNAME *name); |
| |
| // GENERAL_NAME_set0_value set `gen`'s type and value to `type` and `value`. |
| // `type` must be a `GEN_*` constant and `value` must be an object of the |
| // corresponding type. `gen` takes ownership of `value`, so `value` must have |
| // been an allocated object. |
| // |
| // WARNING: `gen` must be empty (typically as returned from `GENERAL_NAME_new`) |
| // before calling this function. If `gen` already contained a value, the |
| // previous contents will be leaked. |
| OPENSSL_EXPORT void GENERAL_NAME_set0_value(GENERAL_NAME *gen, int type, |
| void *value); |
| |
| // GENERAL_NAME_get0_value returns the in-memory representation of `gen`'s |
| // contents and, `out_type` is not NULL, sets `*out_type` to the type of `gen`, |
| // which will be a `GEN_*` constant. If `gen` is incomplete, the return value |
| // will be NULL and the type will be -1. |
| // |
| // WARNING: Casting the result of this function to the wrong type is a |
| // potentially exploitable memory error. Callers must check `gen`'s type, either |
| // via `*out_type` or checking `gen->type` directly, before inspecting the |
| // result. |
| // |
| // WARNING: This function is not const-correct. The return value should be |
| // const. Callers should not mutate the returned object. |
| OPENSSL_EXPORT void *GENERAL_NAME_get0_value(const GENERAL_NAME *gen, |
| int *out_type); |
| |
| // GENERAL_NAME_set0_othername sets `gen` to be an OtherName with type `oid` and |
| // value `value`. On success, it returns one and takes ownership of `oid` and |
| // `value`, which must be created in a way compatible with `ASN1_OBJECT_free` |
| // and `ASN1_TYPE_free`, respectively. On allocation failure, it returns zero. |
| // In the failure case, the caller retains ownership of `oid` and `value` and |
| // must release them when done. |
| // |
| // WARNING: `gen` must be empty (typically as returned from `GENERAL_NAME_new`) |
| // before calling this function. If `gen` already contained a value, the |
| // previously contents will be leaked. |
| OPENSSL_EXPORT int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, |
| ASN1_OBJECT *oid, |
| ASN1_TYPE *value); |
| |
| // GENERAL_NAME_get0_otherName, if `gen` is an OtherName, sets `*out_oid` and |
| // `*out_value` to the OtherName's type-id and value, respectively, and returns |
| // one. If `gen` is not an OtherName, it returns zero and leaves `*out_oid` and |
| // `*out_value` unmodified. Either of `out_oid` or `out_value` may be NULL to |
| // ignore the value. |
| // |
| // WARNING: This function is not const-correct. `out_oid` and `out_value` are |
| // not const, but callers should not mutate the resulting objects. |
| OPENSSL_EXPORT int GENERAL_NAME_get0_otherName(const GENERAL_NAME *gen, |
| ASN1_OBJECT **out_oid, |
| ASN1_TYPE **out_value); |
| |
| |
| // Authority key identifier. |
| // |
| // The authority key identifier extension (RFC 5280, section 4.2.1.1) allows a |
| // certificate to more precisely identify its issuer. This is helpful when |
| // multiple certificates share a name. Only the keyIdentifier (`keyid` in |
| // `AUTHORITY_KEYID`) field is used in practice. |
| |
| // A AUTHORITY_KEYID_st, aka `AUTHORITY_KEYID`, represents an |
| // AuthorityKeyIdentifier structure (RFC 5280). |
| struct AUTHORITY_KEYID_st { |
| ASN1_OCTET_STRING *keyid; |
| GENERAL_NAMES *issuer; |
| ASN1_INTEGER *serial; |
| } /* AUTHORITY_KEYID */; |
| |
| // AUTHORITY_KEYID is an `ASN1_ITEM` whose ASN.1 type is AuthorityKeyIdentifier |
| // (RFC 5280) and C type is `AUTHORITY_KEYID*`. |
| DECLARE_ASN1_ITEM(AUTHORITY_KEYID) |
| |
| // AUTHORITY_KEYID_new returns a newly-allocated, empty `AUTHORITY_KEYID` |
| // object, or NULL on error. |
| OPENSSL_EXPORT AUTHORITY_KEYID *AUTHORITY_KEYID_new(void); |
| |
| // AUTHORITY_KEYID_free releases memory associated with `akid`. |
| OPENSSL_EXPORT void AUTHORITY_KEYID_free(AUTHORITY_KEYID *akid); |
| |
| // d2i_AUTHORITY_KEYID parses up to `len` bytes from `*inp` as a DER-encoded |
| // AuthorityKeyIdentifier (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT AUTHORITY_KEYID *d2i_AUTHORITY_KEYID(AUTHORITY_KEYID **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_AUTHORITY_KEYID marshals `akid` as a DER-encoded AuthorityKeyIdentifier |
| // (RFC 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_AUTHORITY_KEYID(const AUTHORITY_KEYID *akid, |
| uint8_t **outp); |
| |
| |
| // Name constraints. |
| // |
| // The name constraints extension (RFC 5280, section 4.2.1.10) constrains which |
| // names may be asserted by certificates issued by some CA. For example, a |
| // general CA may issue an intermediate certificate to the owner of example.com, |
| // but constrained to ".example.com". |
| |
| // A GENERAL_SUBTREE represents a GeneralSubtree structure (RFC 5280). |
| typedef struct GENERAL_SUBTREE_st { |
| GENERAL_NAME *base; |
| ASN1_INTEGER *minimum; |
| ASN1_INTEGER *maximum; |
| } GENERAL_SUBTREE; |
| |
| DEFINE_STACK_OF(GENERAL_SUBTREE) |
| |
| // GENERAL_SUBTREE_new returns a newly-allocated, empty `GENERAL_SUBTREE` |
| // object, or NULL on error. |
| OPENSSL_EXPORT GENERAL_SUBTREE *GENERAL_SUBTREE_new(void); |
| |
| // GENERAL_SUBTREE_free releases memory associated with `subtree`. |
| OPENSSL_EXPORT void GENERAL_SUBTREE_free(GENERAL_SUBTREE *subtree); |
| |
| // A NAME_CONSTRAINTS_st, aka `NAME_CONSTRAINTS`, represents a NameConstraints |
| // structure (RFC 5280). |
| struct NAME_CONSTRAINTS_st { |
| STACK_OF(GENERAL_SUBTREE) *permittedSubtrees; |
| STACK_OF(GENERAL_SUBTREE) *excludedSubtrees; |
| } /* NAME_CONSTRAINTS */; |
| |
| // NAME_CONSTRAINTS is an `ASN1_ITEM` whose ASN.1 type is NameConstraints (RFC |
| // 5280) and C type is `NAME_CONSTRAINTS*`. |
| DECLARE_ASN1_ITEM(NAME_CONSTRAINTS) |
| |
| // NAME_CONSTRAINTS_new returns a newly-allocated, empty `NAME_CONSTRAINTS` |
| // object, or NULL on error. |
| OPENSSL_EXPORT NAME_CONSTRAINTS *NAME_CONSTRAINTS_new(void); |
| |
| // NAME_CONSTRAINTS_free releases memory associated with `ncons`. |
| OPENSSL_EXPORT void NAME_CONSTRAINTS_free(NAME_CONSTRAINTS *ncons); |
| |
| |
| // Authority information access. |
| // |
| // The authority information access extension (RFC 5280, 4.2.2.1) describes |
| // where to obtain information about the issuer of a certificate. It is most |
| // commonly used with accessMethod values of id-ad-caIssuers and id-ad-ocsp, to |
| // indicate where to fetch the issuer certificate (if not provided in-band) and |
| // the issuer's OCSP responder, respectively. |
| |
| // An ACCESS_DESCRIPTION represents an AccessDescription structure (RFC 5280). |
| typedef struct ACCESS_DESCRIPTION_st { |
| ASN1_OBJECT *method; |
| GENERAL_NAME *location; |
| } ACCESS_DESCRIPTION; |
| |
| DEFINE_STACK_OF(ACCESS_DESCRIPTION) |
| |
| // ACCESS_DESCRIPTION_new returns a newly-allocated, empty `ACCESS_DESCRIPTION` |
| // object, or NULL on error. |
| OPENSSL_EXPORT ACCESS_DESCRIPTION *ACCESS_DESCRIPTION_new(void); |
| |
| // ACCESS_DESCRIPTION_free releases memory associated with `desc`. |
| OPENSSL_EXPORT void ACCESS_DESCRIPTION_free(ACCESS_DESCRIPTION *desc); |
| |
| typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS; |
| |
| // AUTHORITY_INFO_ACCESS is an `ASN1_ITEM` whose ASN.1 type is |
| // AuthorityInfoAccessSyntax (RFC 5280) and C type is |
| // `STACK_OF(ACCESS_DESCRIPTION)*`, or `AUTHORITY_INFO_ACCESS*`. |
| DECLARE_ASN1_ITEM(AUTHORITY_INFO_ACCESS) |
| |
| // AUTHORITY_INFO_ACCESS_new returns a newly-allocated, empty |
| // `AUTHORITY_INFO_ACCESS` object, or NULL on error. |
| OPENSSL_EXPORT AUTHORITY_INFO_ACCESS *AUTHORITY_INFO_ACCESS_new(void); |
| |
| // AUTHORITY_INFO_ACCESS_free releases memory associated with `aia`. |
| OPENSSL_EXPORT void AUTHORITY_INFO_ACCESS_free(AUTHORITY_INFO_ACCESS *aia); |
| |
| // d2i_AUTHORITY_INFO_ACCESS parses up to `len` bytes from `*inp` as a |
| // DER-encoded AuthorityInfoAccessSyntax (RFC 5280), as described in |
| // `d2i_SAMPLE`. |
| OPENSSL_EXPORT AUTHORITY_INFO_ACCESS *d2i_AUTHORITY_INFO_ACCESS( |
| AUTHORITY_INFO_ACCESS **out, const uint8_t **inp, long len); |
| |
| // i2d_AUTHORITY_INFO_ACCESS marshals `aia` as a DER-encoded |
| // AuthorityInfoAccessSyntax (RFC 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_AUTHORITY_INFO_ACCESS(const AUTHORITY_INFO_ACCESS *aia, |
| uint8_t **outp); |
| |
| |
| // CRL distribution points. |
| // |
| // The CRL distribution points extension (RFC 5280, 4.2.1.13) indicates where to |
| // fetch a certificate issuer's CRL. The corresponding issuing distribution |
| // point CRL extension (RFC 5280, section 5.2.5) matches against this extension. |
| |
| // A DIST_POINT_NAME represents a DistributionPointName structure (RFC 5280). |
| // The `name` field contains the CHOICE value and is determined by `type`. If |
| // `type` is zero, `name` must be a `fullname`. If `type` is one, `name` must be |
| // a `relativename`. |
| // |
| // WARNING: `type` and `name` must be kept consistent. An inconsistency will |
| // result in a potentially exploitable memory error. |
| typedef struct DIST_POINT_NAME_st { |
| int type; |
| union { |
| GENERAL_NAMES *fullname; |
| STACK_OF(X509_NAME_ENTRY) *relativename; |
| } name; |
| // If relativename then this contains the full distribution point name |
| X509_NAME *dpname; |
| } DIST_POINT_NAME; |
| |
| // DIST_POINT_NAME_new returns a newly-allocated, empty `DIST_POINT_NAME` |
| // object, or NULL on error. |
| OPENSSL_EXPORT DIST_POINT_NAME *DIST_POINT_NAME_new(void); |
| |
| // DIST_POINT_NAME_free releases memory associated with `name`. |
| OPENSSL_EXPORT void DIST_POINT_NAME_free(DIST_POINT_NAME *name); |
| |
| // A DIST_POINT_st, aka `DIST_POINT`, represents a DistributionPoint structure |
| // (RFC 5280). |
| struct DIST_POINT_st { |
| DIST_POINT_NAME *distpoint; |
| ASN1_BIT_STRING *reasons; |
| GENERAL_NAMES *CRLissuer; |
| } /* DIST_POINT */; |
| |
| DEFINE_STACK_OF(DIST_POINT) |
| |
| // DIST_POINT_new returns a newly-allocated, empty `DIST_POINT` object, or NULL |
| // on error. |
| OPENSSL_EXPORT DIST_POINT *DIST_POINT_new(void); |
| |
| // DIST_POINT_free releases memory associated with `dp`. |
| OPENSSL_EXPORT void DIST_POINT_free(DIST_POINT *dp); |
| |
| typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS; |
| |
| // CRL_DIST_POINTS is an `ASN1_ITEM` whose ASN.1 type is CRLDistributionPoints |
| // (RFC 5280) and C type is `CRL_DIST_POINTS*`. |
| DECLARE_ASN1_ITEM(CRL_DIST_POINTS) |
| |
| // CRL_DIST_POINTS_new returns a newly-allocated, empty `CRL_DIST_POINTS` |
| // object, or NULL on error. |
| OPENSSL_EXPORT CRL_DIST_POINTS *CRL_DIST_POINTS_new(void); |
| |
| // CRL_DIST_POINTS_free releases memory associated with `crldp`. |
| OPENSSL_EXPORT void CRL_DIST_POINTS_free(CRL_DIST_POINTS *crldp); |
| |
| // d2i_CRL_DIST_POINTS parses up to `len` bytes from `*inp` as a DER-encoded |
| // CRLDistributionPoints (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT CRL_DIST_POINTS *d2i_CRL_DIST_POINTS(CRL_DIST_POINTS **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_CRL_DIST_POINTS marshals `crldp` as a DER-encoded CRLDistributionPoints |
| // (RFC 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_CRL_DIST_POINTS(const CRL_DIST_POINTS *crldp, |
| uint8_t **outp); |
| |
| // A ISSUING_DIST_POINT_st, aka `ISSUING_DIST_POINT`, represents a |
| // IssuingDistributionPoint structure (RFC 5280). |
| struct ISSUING_DIST_POINT_st { |
| DIST_POINT_NAME *distpoint; |
| ASN1_BOOLEAN onlyuser; |
| ASN1_BOOLEAN onlyCA; |
| ASN1_BIT_STRING *onlysomereasons; |
| ASN1_BOOLEAN indirectCRL; |
| ASN1_BOOLEAN onlyattr; |
| } /* ISSUING_DIST_POINT */; |
| |
| // ISSUING_DIST_POINT is an `ASN1_ITEM` whose ASN.1 type is |
| // IssuingDistributionPoint (RFC 5280) and C type is `ISSUING_DIST_POINT*`. |
| DECLARE_ASN1_ITEM(ISSUING_DIST_POINT) |
| |
| // ISSUING_DIST_POINT_new returns a newly-allocated, empty `ISSUING_DIST_POINT` |
| // object, or NULL on error. |
| OPENSSL_EXPORT ISSUING_DIST_POINT *ISSUING_DIST_POINT_new(void); |
| |
| // ISSUING_DIST_POINT_free releases memory associated with `idp`. |
| OPENSSL_EXPORT void ISSUING_DIST_POINT_free(ISSUING_DIST_POINT *idp); |
| |
| // d2i_ISSUING_DIST_POINT parses up to `len` bytes from `*inp` as a DER-encoded |
| // IssuingDistributionPoint (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT ISSUING_DIST_POINT *d2i_ISSUING_DIST_POINT( |
| ISSUING_DIST_POINT **out, const uint8_t **inp, long len); |
| |
| // i2d_ISSUING_DIST_POINT marshals `idp` as a DER-encoded |
| // IssuingDistributionPoint (RFC 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_ISSUING_DIST_POINT(const ISSUING_DIST_POINT *idp, |
| uint8_t **outp); |
| |
| |
| // Certificate policies. |
| // |
| // The certificate policies extension (RFC 5280, section 4.2.1.4), along with a |
| // suite of related extensions determines the "policies" that apply to a |
| // certificate path. Evaluating these policies is extremely complex and has led |
| // to denial-of-service vulnerabilities in several X.509 implementations. See |
| // RFC 9618. |
| // |
| // Do not use this mechanism. |
| |
| // A NOTICEREF represents a NoticeReference structure (RFC 5280). |
| typedef struct NOTICEREF_st { |
| ASN1_STRING *organization; |
| STACK_OF(ASN1_INTEGER) *noticenos; |
| } NOTICEREF; |
| |
| // NOTICEREF_new returns a newly-allocated, empty `NOTICEREF` object, or NULL |
| // on error. |
| OPENSSL_EXPORT NOTICEREF *NOTICEREF_new(void); |
| |
| // NOTICEREF_free releases memory associated with `ref`. |
| OPENSSL_EXPORT void NOTICEREF_free(NOTICEREF *ref); |
| |
| // A USERNOTICE represents a UserNotice structure (RFC 5280). |
| typedef struct USERNOTICE_st { |
| NOTICEREF *noticeref; |
| ASN1_STRING *exptext; |
| } USERNOTICE; |
| |
| // USERNOTICE_new returns a newly-allocated, empty `USERNOTICE` object, or NULL |
| // on error. |
| OPENSSL_EXPORT USERNOTICE *USERNOTICE_new(void); |
| |
| // USERNOTICE_free releases memory associated with `notice`. |
| OPENSSL_EXPORT void USERNOTICE_free(USERNOTICE *notice); |
| |
| // A POLICYQUALINFO represents a PolicyQualifierInfo structure (RFC 5280). `d` |
| // contains the qualifier field of the PolicyQualifierInfo. Its type is |
| // determined by `pqualid`. If `pqualid` is `NID_id_qt_cps`, `d` must be |
| // `cpsuri`. If `pqualid` is `NID_id_qt_unotice`, `d` must be `usernotice`. |
| // Otherwise, `d` must be `other`. |
| // |
| // WARNING: `pqualid` and `d` must be kept consistent. An inconsistency will |
| // result in a potentially exploitable memory error. |
| typedef struct POLICYQUALINFO_st { |
| ASN1_OBJECT *pqualid; |
| union { |
| ASN1_IA5STRING *cpsuri; |
| USERNOTICE *usernotice; |
| ASN1_TYPE *other; |
| } d; |
| } POLICYQUALINFO; |
| |
| DEFINE_STACK_OF(POLICYQUALINFO) |
| |
| // POLICYQUALINFO_new returns a newly-allocated, empty `POLICYQUALINFO` object, |
| // or NULL on error. |
| OPENSSL_EXPORT POLICYQUALINFO *POLICYQUALINFO_new(void); |
| |
| // POLICYQUALINFO_free releases memory associated with `info`. |
| OPENSSL_EXPORT void POLICYQUALINFO_free(POLICYQUALINFO *info); |
| |
| // A POLICYINFO represents a PolicyInformation structure (RFC 5280). |
| typedef struct POLICYINFO_st { |
| ASN1_OBJECT *policyid; |
| STACK_OF(POLICYQUALINFO) *qualifiers; |
| } POLICYINFO; |
| |
| DEFINE_STACK_OF(POLICYINFO) |
| |
| // POLICYINFO_new returns a newly-allocated, empty `POLICYINFO` object, or NULL |
| // on error. |
| OPENSSL_EXPORT POLICYINFO *POLICYINFO_new(void); |
| |
| // POLICYINFO_free releases memory associated with `info`. |
| OPENSSL_EXPORT void POLICYINFO_free(POLICYINFO *info); |
| |
| typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES; |
| |
| // CERTIFICATEPOLICIES is an `ASN1_ITEM` whose ASN.1 type is CertificatePolicies |
| // (RFC 5280) and C type is `STACK_OF(POLICYINFO)*`, or `CERTIFICATEPOLICIES*`. |
| DECLARE_ASN1_ITEM(CERTIFICATEPOLICIES) |
| |
| // CERTIFICATEPOLICIES_new returns a newly-allocated, empty |
| // `CERTIFICATEPOLICIES` object, or NULL on error. |
| OPENSSL_EXPORT CERTIFICATEPOLICIES *CERTIFICATEPOLICIES_new(void); |
| |
| // CERTIFICATEPOLICIES_free releases memory associated with `policies`. |
| OPENSSL_EXPORT void CERTIFICATEPOLICIES_free(CERTIFICATEPOLICIES *policies); |
| |
| // d2i_CERTIFICATEPOLICIES parses up to `len` bytes from `*inp` as a DER-encoded |
| // CertificatePolicies (RFC 5280), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT CERTIFICATEPOLICIES *d2i_CERTIFICATEPOLICIES( |
| CERTIFICATEPOLICIES **out, const uint8_t **inp, long len); |
| |
| // i2d_CERTIFICATEPOLICIES marshals `policies` as a DER-encoded |
| // CertificatePolicies (RFC 5280), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_CERTIFICATEPOLICIES(const CERTIFICATEPOLICIES *policies, |
| uint8_t **outp); |
| |
| // A POLICY_MAPPING represents an individual element of a PolicyMappings |
| // structure (RFC 5280). |
| typedef struct POLICY_MAPPING_st { |
| ASN1_OBJECT *issuerDomainPolicy; |
| ASN1_OBJECT *subjectDomainPolicy; |
| } POLICY_MAPPING; |
| |
| DEFINE_STACK_OF(POLICY_MAPPING) |
| |
| // POLICY_MAPPING_new returns a newly-allocated, empty `POLICY_MAPPING` object, |
| // or NULL on error. |
| OPENSSL_EXPORT POLICY_MAPPING *POLICY_MAPPING_new(void); |
| |
| // POLICY_MAPPING_free releases memory associated with `mapping`. |
| OPENSSL_EXPORT void POLICY_MAPPING_free(POLICY_MAPPING *mapping); |
| |
| typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS; |
| |
| // POLICY_MAPPINGS is an `ASN1_ITEM` whose ASN.1 type is PolicyMappings (RFC |
| // 5280) and C type is `STACK_OF(POLICY_MAPPING)*`, or `POLICY_MAPPINGS*`. |
| DECLARE_ASN1_ITEM(POLICY_MAPPINGS) |
| |
| // A POLICY_CONSTRAINTS represents a PolicyConstraints structure (RFC 5280). |
| typedef struct POLICY_CONSTRAINTS_st { |
| ASN1_INTEGER *requireExplicitPolicy; |
| ASN1_INTEGER *inhibitPolicyMapping; |
| } POLICY_CONSTRAINTS; |
| |
| // POLICY_CONSTRAINTS is an `ASN1_ITEM` whose ASN.1 type is PolicyConstraints |
| // (RFC 5280) and C type is `POLICY_CONSTRAINTS*`. |
| DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS) |
| |
| // POLICY_CONSTRAINTS_new returns a newly-allocated, empty `POLICY_CONSTRAINTS` |
| // object, or NULL on error. |
| OPENSSL_EXPORT POLICY_CONSTRAINTS *POLICY_CONSTRAINTS_new(void); |
| |
| // POLICY_CONSTRAINTS_free releases memory associated with `pcons`. |
| OPENSSL_EXPORT void POLICY_CONSTRAINTS_free(POLICY_CONSTRAINTS *pcons); |
| |
| |
| // Algorithm identifiers. |
| // |
| // An `X509_ALGOR` represents an AlgorithmIdentifier structure, used in X.509 |
| // to represent signature algorithms and public key algorithms. |
| |
| DEFINE_STACK_OF(X509_ALGOR) |
| |
| // X509_ALGOR is an `ASN1_ITEM` whose ASN.1 type is AlgorithmIdentifier and C |
| // type is `X509_ALGOR*`. |
| DECLARE_ASN1_ITEM(X509_ALGOR) |
| |
| // X509_ALGOR_new returns a newly-allocated, empty `X509_ALGOR` object, or NULL |
| // on error. |
| OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_new(void); |
| |
| // X509_ALGOR_dup returns a newly-allocated copy of `alg`, or NULL on error. |
| // This function works by serializing the structure, so if `alg` is incomplete, |
| // it may fail. |
| OPENSSL_EXPORT X509_ALGOR *X509_ALGOR_dup(const X509_ALGOR *alg); |
| |
| // X509_ALGOR_copy sets `dst` to a copy of the contents of `src`. It returns one |
| // on success and zero on error. |
| OPENSSL_EXPORT int X509_ALGOR_copy(X509_ALGOR *dst, const X509_ALGOR *src); |
| |
| // X509_ALGOR_free releases memory associated with `alg`. |
| OPENSSL_EXPORT void X509_ALGOR_free(X509_ALGOR *alg); |
| |
| // d2i_X509_ALGOR parses up to `len` bytes from `*inp` as a DER-encoded |
| // AlgorithmIdentifier, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_ALGOR *d2i_X509_ALGOR(X509_ALGOR **out, const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_ALGOR marshals `alg` as a DER-encoded AlgorithmIdentifier, as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_ALGOR(const X509_ALGOR *alg, uint8_t **outp); |
| |
| // X509_ALGOR_set0 sets `alg` to an AlgorithmIdentifier with algorithm `obj` and |
| // parameter determined by `param_type` and `param_value`. It returns one on |
| // success and zero on error. This function takes ownership of `obj` and |
| // `param_value` on success. |
| // |
| // If `param_type` is `V_ASN1_UNDEF`, the parameter is omitted. If `param_type` |
| // is zero, the parameter is left unchanged. Otherwise, `param_type` and |
| // `param_value` are interpreted as in `ASN1_TYPE_set`. |
| // |
| // Note omitting the parameter (`V_ASN1_UNDEF`) and encoding an explicit NULL |
| // value (`V_ASN1_NULL`) are different. Some algorithms require one and some the |
| // other. Consult the relevant specification before calling this function. The |
| // correct parameter for an RSASSA-PKCS1-v1_5 signature is `V_ASN1_NULL`. The |
| // correct one for an ECDSA or Ed25519 signature is `V_ASN1_UNDEF`. |
| OPENSSL_EXPORT int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *obj, |
| int param_type, void *param_value); |
| |
| // X509_ALGOR_get0 sets `*out_obj` to the `alg`'s algorithm. If `alg`'s |
| // parameter is omitted, it sets `*out_param_type` and `*out_param_value` to |
| // `V_ASN1_UNDEF` and NULL. Otherwise, it sets `*out_param_type` and |
| // `*out_param_value` to the parameter, using the same representation as |
| // `ASN1_TYPE_set0`. See `ASN1_TYPE_set0` and `ASN1_TYPE` for details. |
| // |
| // Callers that require the parameter in serialized form should, after checking |
| // for `V_ASN1_UNDEF`, use `ASN1_TYPE_set1` and `d2i_ASN1_TYPE`, rather than |
| // inspecting `*out_param_value`. |
| // |
| // Each of `out_obj`, `out_param_type`, and `out_param_value` may be NULL to |
| // ignore the output. If `out_param_type` is NULL, `out_param_value` is ignored. |
| // |
| // WARNING: If `*out_param_type` is set to `V_ASN1_UNDEF`, OpenSSL and older |
| // revisions of BoringSSL leave `*out_param_value` unset rather than setting it |
| // to NULL. Callers that support both OpenSSL and BoringSSL should not assume |
| // `*out_param_value` is uniformly initialized. |
| OPENSSL_EXPORT void X509_ALGOR_get0(const ASN1_OBJECT **out_obj, |
| int *out_param_type, |
| const void **out_param_value, |
| const X509_ALGOR *alg); |
| |
| // X509_ALGOR_set_md sets `alg` to the hash function `md`. Note this |
| // AlgorithmIdentifier represents the hash function itself, not a signature |
| // algorithm that uses `md`. It returns one on success and zero on error. |
| // |
| // Due to historical specification mistakes (see Section 2.1 of RFC 4055), the |
| // parameters field is sometimes omitted and sometimes a NULL value. When used |
| // in RSASSA-PSS and RSAES-OAEP, it should be a NULL value. In other contexts, |
| // the parameters should be omitted. This function assumes the caller is |
| // constructing a RSASSA-PSS or RSAES-OAEP AlgorithmIdentifier and includes a |
| // NULL parameter. This differs from OpenSSL's behavior. |
| // |
| // TODO(davidben): Rename this function, or perhaps just add a bespoke API for |
| // constructing PSS and move on. |
| OPENSSL_EXPORT int X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); |
| |
| // X509_ALGOR_cmp returns zero if `a` and `b` are equal, and some non-zero value |
| // otherwise. Note this function can only be used for equality checks, not an |
| // ordering. |
| OPENSSL_EXPORT int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); |
| |
| |
| // Attributes. |
| // |
| // Unlike certificates and CRLs, CSRs use a separate Attribute structure (RFC |
| // 2985, RFC 2986) for extensibility. This is represented by the library as |
| // `X509_ATTRIBUTE`. |
| |
| DEFINE_STACK_OF(X509_ATTRIBUTE) |
| |
| // X509_ATTRIBUTE_new returns a newly-allocated, empty `X509_ATTRIBUTE` object, |
| // or NULL on error. `X509_ATTRIBUTE_set1_*` may be used to finish initializing |
| // it. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_new(void); |
| |
| // X509_ATTRIBUTE_dup returns a newly-allocated copy of `attr`, or NULL on |
| // error. This function works by serializing the structure, so if `attr` is |
| // incomplete, it may fail. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_dup(const X509_ATTRIBUTE *attr); |
| |
| // X509_ATTRIBUTE_free releases memory associated with `attr`. |
| OPENSSL_EXPORT void X509_ATTRIBUTE_free(X509_ATTRIBUTE *attr); |
| |
| // d2i_X509_ATTRIBUTE parses up to `len` bytes from `*inp` as a DER-encoded |
| // Attribute (RFC 2986), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_ATTRIBUTE *d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_ATTRIBUTE marshals `alg` as a DER-encoded Attribute (RFC 2986), as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_ATTRIBUTE(const X509_ATTRIBUTE *alg, |
| uint8_t **outp); |
| |
| // X509_ATTRIBUTE_create returns a newly-allocated `X509_ATTRIBUTE`, or NULL on |
| // error. The attribute has type `nid` and contains a single value determined by |
| // `attrtype` and `value`, which are interpreted as in `ASN1_TYPE_set`. Note |
| // this function takes ownership of `value`. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int attrtype, |
| void *value); |
| |
| // X509_ATTRIBUTE_create_by_NID returns a newly-allocated `X509_ATTRIBUTE` of |
| // type `nid`, or NULL on error. The value is determined as in |
| // `X509_ATTRIBUTE_set1_data`. |
| // |
| // If `attr` is non-NULL, the resulting `X509_ATTRIBUTE` is also written to |
| // `*attr`. If `*attr` was non-NULL when the function was called, `*attr` is |
| // reused instead of creating a new object. |
| // |
| // WARNING: The interpretation of `attrtype`, `data`, and `len` is complex and |
| // error-prone. See `X509_ATTRIBUTE_set1_data` for details. |
| // |
| // WARNING: The object reuse form is deprecated and may be removed in the |
| // future. It also currently incorrectly appends to the reused object's value |
| // set rather than overwriting it. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID( |
| X509_ATTRIBUTE **attr, int nid, int attrtype, const void *data, int len); |
| |
| // X509_ATTRIBUTE_create_by_OBJ behaves like `X509_ATTRIBUTE_create_by_NID` |
| // except the attribute's type is determined by `obj`. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ( |
| X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj, int attrtype, |
| const void *data, int len); |
| |
| // X509_ATTRIBUTE_create_by_txt behaves like `X509_ATTRIBUTE_create_by_NID` |
| // except the attribute's type is determined by calling `OBJ_txt2obj` with |
| // `attrname`. |
| OPENSSL_EXPORT X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt( |
| X509_ATTRIBUTE **attr, const char *attrname, int type, |
| const unsigned char *bytes, int len); |
| |
| // X509_ATTRIBUTE_set1_object sets `attr`'s type to `obj`. It returns one on |
| // success and zero on error. |
| OPENSSL_EXPORT int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, |
| const ASN1_OBJECT *obj); |
| |
| // X509_ATTRIBUTE_set1_data appends a value to `attr`'s value set and returns |
| // one on success or zero on error. The value is determined as follows: |
| // |
| // If `attrtype` is zero, this function returns one and does nothing. This form |
| // may be used when calling `X509_ATTRIBUTE_create_by_*` to create an attribute |
| // with an empty value set. Such attributes are invalid, but OpenSSL supports |
| // creating them. |
| // |
| // Otherwise, if `attrtype` is a `MBSTRING_*` constant, the value is an ASN.1 |
| // string. The string is determined by decoding `len` bytes from `data` in the |
| // encoding specified by `attrtype`, and then re-encoding it in a form |
| // appropriate for `attr`'s type. If `len` is -1, `strlen(data)` is used |
| // instead. See `ASN1_STRING_set_by_NID` for details. |
| // |
| // Otherwise, if `len` is not -1, the value is an ASN.1 string. `attrtype` is an |
| // `ASN1_STRING` type value and the `len` bytes from `data` are copied as the |
| // type-specific representation of `ASN1_STRING`. See `ASN1_STRING` for details. |
| // |
| // Otherwise, if `len` is -1, the value is constructed by passing `attrtype` and |
| // `data` to `ASN1_TYPE_set1`. That is, `attrtype` is an `ASN1_TYPE` type value, |
| // and `data` is cast to the corresponding pointer type. |
| // |
| // WARNING: Despite the name, this function appends to `attr`'s value set, |
| // rather than overwriting it. To overwrite the value set, create a new |
| // `X509_ATTRIBUTE` with `X509_ATTRIBUTE_new`. |
| // |
| // WARNING: If using the `MBSTRING_*` form, pass a length rather than relying on |
| // `strlen`. In particular, `strlen` will not behave correctly if the input is |
| // `MBSTRING_BMP` or `MBSTRING_UNIV`. |
| // |
| // WARNING: This function currently misinterprets `V_ASN1_OTHER` as an |
| // `MBSTRING_*` constant. This matches OpenSSL but means it is impossible to |
| // construct a value with a non-universal tag. |
| OPENSSL_EXPORT int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, |
| const void *data, int len); |
| |
| // X509_ATTRIBUTE_get0_data returns the `idx`th value of `attr` in a |
| // type-specific representation to `attrtype`, or NULL if out of bounds or the |
| // type does not match. `attrtype` is one of the type values in `ASN1_TYPE`. On |
| // match, the return value uses the same representation as `ASN1_TYPE_set0`. See |
| // `ASN1_TYPE` for details. |
| OPENSSL_EXPORT void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, |
| int attrtype, void *unused); |
| |
| // X509_ATTRIBUTE_count returns the number of values in `attr`. |
| OPENSSL_EXPORT int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr); |
| |
| // X509_ATTRIBUTE_get0_object returns the type of `attr`. |
| OPENSSL_EXPORT ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr); |
| |
| // X509_ATTRIBUTE_get0_type returns the `idx`th value in `attr`, or NULL if out |
| // of bounds. Note this function returns one of `attr`'s values, not the type. |
| OPENSSL_EXPORT ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, |
| int idx); |
| |
| |
| // Certificate stores. |
| // |
| // An `X509_STORE` contains trusted certificates, CRLs, and verification |
| // parameters that are shared between multiple certificate verifications. |
| // |
| // Certificates in an `X509_STORE` are referred to as "trusted certificates", |
| // but an individual certificate verification may not necessarily treat every |
| // trusted certificate as a trust anchor. See `X509_VERIFY_PARAM_set_trust` for |
| // details. |
| // |
| // WARNING: Although a trusted certificate which fails the |
| // `X509_VERIFY_PARAM_set_trust` check is functionally an untrusted |
| // intermediate certificate, callers should not rely on this to configure |
| // untrusted intermediates in an `X509_STORE`. The trust check is complex, so |
| // this risks inadvertently treating it as a trust anchor. Instead, configure |
| // untrusted intermediates with the `chain` parameter of `X509_STORE_CTX_init`. |
| // |
| // Certificates in `X509_STORE` may be specified in several ways: |
| // - Added by `X509_STORE_add_cert`. |
| // - Returned by an `X509_LOOKUP` added by `X509_STORE_add_lookup`. |
| // |
| // `X509_STORE`s are reference-counted and may be shared by certificate |
| // verifications running concurrently on multiple threads. However, an |
| // `X509_STORE`'s verification parameters may not be modified concurrently with |
| // certificate verification or other operations. Unless otherwise documented, |
| // functions which take const pointer may be used concurrently, while |
| // functions which take a non-const pointer may not. Callers that wish to modify |
| // verification parameters in a shared `X509_STORE` should instead modify |
| // `X509_STORE_CTX`s individually. |
| // |
| // Objects in an `X509_STORE` are represented as an `X509_OBJECT`. Some |
| // functions in this library return values with this type. |
| |
| // X509_STORE_new returns a newly-allocated `X509_STORE`, or NULL on error. |
| OPENSSL_EXPORT X509_STORE *X509_STORE_new(void); |
| |
| // X509_STORE_up_ref adds one to the reference count of `store` and returns one. |
| // Although `store` is not const, this function's use of `store` is thread-safe. |
| OPENSSL_EXPORT int X509_STORE_up_ref(X509_STORE *store); |
| |
| // X509_STORE_free releases memory associated with `store`. |
| OPENSSL_EXPORT void X509_STORE_free(X509_STORE *store); |
| |
| // X509_STORE_add_cert adds `x509` to `store` as a trusted certificate. It |
| // returns one on success and zero on error. This function internally increments |
| // `x509`'s reference count, so the caller retains ownership of `x509`. |
| // |
| // Certificates configured by this function are still subject to the checks |
| // described in `X509_VERIFY_PARAM_set_trust`. |
| // |
| // Although `store` is not const, this function's use of `store` is thread-safe. |
| // However, if this function is called concurrently with `X509_verify_cert`, it |
| // is a race condition whether `x509` is available for issuer lookups. |
| // Moreover, the result may differ for each issuer lookup performed by a single |
| // `X509_verify_cert` call. |
| OPENSSL_EXPORT int X509_STORE_add_cert(X509_STORE *store, X509 *x509); |
| |
| // X509_STORE_add_crl adds `crl` to `store`. It returns one on success and zero |
| // on error. This function internally increments `crl`'s reference count, so the |
| // caller retains ownership of `crl`. CRLs added in this way are candidates for |
| // CRL lookup when `X509_V_FLAG_CRL_CHECK` is set. |
| // |
| // Although `store` is not const, this function's use of `store` is thread-safe. |
| // However, if this function is called concurrently with `X509_verify_cert`, it |
| // is a race condition whether `crl` is available for CRL checks. Moreover, the |
| // result may differ for each CRL check performed by a single |
| // `X509_verify_cert` call. |
| // |
| // Note there are no supported APIs to remove CRLs from `store` once inserted. |
| // To vary the set of CRLs over time, callers should either create a new |
| // `X509_STORE` or configure CRLs on a per-verification basis with |
| // `X509_STORE_CTX_set0_crls`. |
| OPENSSL_EXPORT int X509_STORE_add_crl(X509_STORE *store, X509_CRL *crl); |
| |
| // X509_STORE_get0_param returns `store`'s verification parameters. This object |
| // is mutable and may be modified by the caller. For an individual certificate |
| // verification operation, `X509_STORE_CTX_init` initializes the |
| // `X509_STORE_CTX`'s parameters with these parameters. |
| // |
| // WARNING: `X509_STORE_CTX_init` applies some default parameters (as in |
| // `X509_VERIFY_PARAM_inherit`) after copying `store`'s parameters. This means |
| // it is impossible to leave some parameters unset at `store`. They must be |
| // explicitly unset after creating the `X509_STORE_CTX`. |
| // |
| // As of writing these late defaults are a depth limit (see |
| // `X509_VERIFY_PARAM_set_depth`) and the `X509_V_FLAG_TRUSTED_FIRST` flag. This |
| // warning does not apply if the parameters were set in `store`. |
| // |
| // TODO(crbug.com/boringssl/441): This behavior is very surprising. Can we |
| // remove this notion of late defaults? The unsettable value at `X509_STORE` is |
| // -1, which rejects everything but explicitly-trusted self-signed certificates. |
| // `X509_V_FLAG_TRUSTED_FIRST` is mostly a workaround for poor path-building. |
| OPENSSL_EXPORT X509_VERIFY_PARAM *X509_STORE_get0_param(X509_STORE *store); |
| |
| // X509_STORE_set1_param copies verification parameters from `param` as in |
| // `X509_VERIFY_PARAM_set1`. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_STORE_set1_param(X509_STORE *store, |
| const X509_VERIFY_PARAM *param); |
| |
| // X509_STORE_set_flags enables all values in `flags` in `store`'s verification |
| // flags. `flags` should be a combination of `X509_V_FLAG_*` constants. |
| // |
| // WARNING: These flags will be combined with default flags when copied to an |
| // `X509_STORE_CTX`. This means it is impossible to unset those defaults from |
| // the `X509_STORE`. See discussion in `X509_STORE_get0_param`. |
| OPENSSL_EXPORT int X509_STORE_set_flags(X509_STORE *store, unsigned long flags); |
| |
| // X509_STORE_set_depth configures `store` to, by default, limit certificate |
| // chains to `depth` intermediate certificates. This count excludes both the |
| // target certificate and the trust anchor (root certificate). |
| OPENSSL_EXPORT int X509_STORE_set_depth(X509_STORE *store, int depth); |
| |
| // X509_STORE_set_purpose configures the purpose check for `store`. See |
| // `X509_VERIFY_PARAM_set_purpose` for details. |
| OPENSSL_EXPORT int X509_STORE_set_purpose(X509_STORE *store, int purpose); |
| |
| // X509_STORE_set_trust configures the trust check for `store`. See |
| // `X509_VERIFY_PARAM_set_trust` for details. |
| OPENSSL_EXPORT int X509_STORE_set_trust(X509_STORE *store, int trust); |
| |
| // The following constants indicate the type of an `X509_OBJECT`. |
| #define X509_LU_NONE 0 |
| #define X509_LU_X509 1 |
| #define X509_LU_CRL 2 |
| #define X509_LU_PKEY 3 |
| |
| DEFINE_STACK_OF(X509_OBJECT) |
| |
| // X509_OBJECT_new returns a newly-allocated, empty `X509_OBJECT` or NULL on |
| // error. |
| OPENSSL_EXPORT X509_OBJECT *X509_OBJECT_new(void); |
| |
| // X509_OBJECT_free releases memory associated with `obj`. |
| OPENSSL_EXPORT void X509_OBJECT_free(X509_OBJECT *obj); |
| |
| // X509_OBJECT_get_type returns the type of `obj`, which will be one of the |
| // `X509_LU_*` constants. |
| OPENSSL_EXPORT int X509_OBJECT_get_type(const X509_OBJECT *obj); |
| |
| // X509_OBJECT_get0_X509 returns `obj` as a certificate, or NULL if `obj` is not |
| // a certificate. |
| OPENSSL_EXPORT X509 *X509_OBJECT_get0_X509(const X509_OBJECT *obj); |
| |
| // X509_STORE_get1_objects returns a newly-allocated stack containing the |
| // contents of `store`, or NULL on error. The caller must release the result |
| // with `sk_X509_OBJECT_pop_free` and `X509_OBJECT_free` when done. |
| // |
| // The result will include all certificates and CRLs added via |
| // `X509_STORE_add_cert` and `X509_STORE_add_crl`, as well as any cached objects |
| // added by `X509_LOOKUP_add_dir`. The last of these may change over time, as |
| // different objects are loaded from the filesystem. Callers should not depend |
| // on this caching behavior. The objects are returned in no particular order. |
| OPENSSL_EXPORT STACK_OF(X509_OBJECT) *X509_STORE_get1_objects( |
| X509_STORE *store); |
| |
| |
| // Certificate verification. |
| // |
| // An `X509_STORE_CTX` object represents a single certificate verification |
| // operation. To verify a certificate chain, callers construct an |
| // `X509_STORE_CTX`, initialize it with `X509_STORE_CTX_init`, configure extra |
| // parameters with `X509_STORE_CTX_get0_param`, and call `X509_verify_cert`. |
| |
| // X509_STORE_CTX_new returns a newly-allocated, empty `X509_STORE_CTX`, or NULL |
| // on error. |
| OPENSSL_EXPORT X509_STORE_CTX *X509_STORE_CTX_new(void); |
| |
| // X509_STORE_CTX_free releases memory associated with `ctx`. |
| OPENSSL_EXPORT void X509_STORE_CTX_free(X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_init initializes `ctx` to verify `x509`, using trusted |
| // certificates and parameters in `store`. It returns one on success and zero on |
| // error. `chain` is a list of untrusted intermediate certificates to use in |
| // verification. |
| // |
| // `ctx` stores pointers to `store`, `x509`, and `chain`. Each of these objects |
| // must outlive `ctx` and may not be mutated for the duration of the certificate |
| // verification. |
| OPENSSL_EXPORT int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, |
| X509 *x509, STACK_OF(X509) *chain); |
| |
| // X509_verify_cert performs certificate verification with `ctx`, which must |
| // have been initialized with `X509_STORE_CTX_init`. It returns one on success |
| // and zero on error. On success, `X509_STORE_CTX_get0_chain` or |
| // `X509_STORE_CTX_get1_chain` may be used to return the verified certificate |
| // chain. On error, `X509_STORE_CTX_get_error` may be used to return additional |
| // error information. |
| // |
| // WARNING: Most failure conditions from this function do not use the error |
| // queue. Use `X509_STORE_CTX_get_error` to determine the cause of the error. |
| OPENSSL_EXPORT int X509_verify_cert(X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get0_chain, after a successful `X509_verify_cert` call, |
| // returns the verified certificate chain. The chain begins with the leaf and |
| // ends with trust anchor. |
| // |
| // At other points, such as after a failed verification or during the deprecated |
| // verification callback, it returns the partial chain built so far. Callers |
| // should avoid relying on this as this exposes unstable library implementation |
| // details. |
| OPENSSL_EXPORT STACK_OF(X509) *X509_STORE_CTX_get0_chain( |
| const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get1_chain behaves like `X509_STORE_CTX_get0_chain` but |
| // returns a newly-allocated `STACK_OF(X509)` containing the completed chain, |
| // with each certificate's reference count incremented. Callers must free the |
| // result with `sk_X509_pop_free` and `X509_free` when done. |
| OPENSSL_EXPORT STACK_OF(X509) *X509_STORE_CTX_get1_chain( |
| const X509_STORE_CTX *ctx); |
| |
| // The following values are possible outputs of `X509_STORE_CTX_get_error`. |
| #define X509_V_OK 0 |
| #define X509_V_ERR_UNSPECIFIED 1 |
| #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 |
| #define X509_V_ERR_UNABLE_TO_GET_CRL 3 |
| #define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 |
| #define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 |
| #define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 |
| #define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 |
| #define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 |
| #define X509_V_ERR_CERT_NOT_YET_VALID 9 |
| #define X509_V_ERR_CERT_HAS_EXPIRED 10 |
| #define X509_V_ERR_CRL_NOT_YET_VALID 11 |
| #define X509_V_ERR_CRL_HAS_EXPIRED 12 |
| #define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 |
| #define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 |
| #define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 |
| #define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 |
| #define X509_V_ERR_OUT_OF_MEM 17 |
| #define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 |
| #define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 |
| #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 |
| #define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 |
| #define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 |
| #define X509_V_ERR_CERT_REVOKED 23 |
| #define X509_V_ERR_INVALID_CA 24 |
| #define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 |
| #define X509_V_ERR_INVALID_PURPOSE 26 |
| #define X509_V_ERR_CERT_UNTRUSTED 27 |
| #define X509_V_ERR_CERT_REJECTED 28 |
| #define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 |
| #define X509_V_ERR_AKID_SKID_MISMATCH 30 |
| #define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 |
| #define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 |
| #define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 |
| #define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 |
| #define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 |
| #define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 |
| #define X509_V_ERR_INVALID_NON_CA 37 |
| #define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 |
| #define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 |
| #define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 |
| #define X509_V_ERR_INVALID_EXTENSION 41 |
| #define X509_V_ERR_INVALID_POLICY_EXTENSION 42 |
| #define X509_V_ERR_NO_EXPLICIT_POLICY 43 |
| #define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 |
| #define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 |
| #define X509_V_ERR_UNNESTED_RESOURCE 46 |
| #define X509_V_ERR_PERMITTED_VIOLATION 47 |
| #define X509_V_ERR_EXCLUDED_VIOLATION 48 |
| #define X509_V_ERR_SUBTREE_MINMAX 49 |
| #define X509_V_ERR_APPLICATION_VERIFICATION 50 |
| #define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 |
| #define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 |
| #define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 |
| #define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 |
| #define X509_V_ERR_HOSTNAME_MISMATCH 62 |
| #define X509_V_ERR_EMAIL_MISMATCH 63 |
| #define X509_V_ERR_IP_ADDRESS_MISMATCH 64 |
| #define X509_V_ERR_INVALID_CALL 65 |
| #define X509_V_ERR_STORE_LOOKUP 66 |
| #define X509_V_ERR_NAME_CONSTRAINTS_WITHOUT_SANS 67 |
| |
| // X509_STORE_CTX_get_error, after `X509_verify_cert` returns, returns |
| // `X509_V_OK` if verification succeeded or an `X509_V_ERR_*` describing why |
| // verification failed. This will be consistent with `X509_verify_cert`'s return |
| // value, unless the caller used the deprecated verification callback (see |
| // `X509_STORE_CTX_set_verify_cb`) in a way that breaks `ctx`'s invariants. |
| // |
| // If called during the deprecated verification callback when `ok` is zero, it |
| // returns the current error under consideration. |
| OPENSSL_EXPORT int X509_STORE_CTX_get_error(const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_set_error sets `ctx`'s error to `err`, which should be |
| // `X509_V_OK` or an `X509_V_ERR_*` constant. It is not expected to be called in |
| // typical `X509_STORE_CTX` usage, but may be used in callback APIs where |
| // applications synthesize `X509_STORE_CTX` error conditions. See also |
| // `X509_STORE_CTX_set_verify_cb` and `SSL_CTX_set_cert_verify_callback`. |
| OPENSSL_EXPORT void X509_STORE_CTX_set_error(X509_STORE_CTX *ctx, int err); |
| |
| // X509_verify_cert_error_string returns `err` as a human-readable string, where |
| // `err` should be one of the `X509_V_*` values. If `err` is unknown, it returns |
| // a default description. |
| OPENSSL_EXPORT const char *X509_verify_cert_error_string(long err); |
| |
| // X509_STORE_CTX_get_error_depth returns the depth at which the error returned |
| // by `X509_STORE_CTX_get_error` occurred. This is zero-indexed integer into the |
| // certificate chain. Zero indicates the target certificate, one its issuer, and |
| // so on. |
| OPENSSL_EXPORT int X509_STORE_CTX_get_error_depth(const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get_current_cert returns the certificate which caused the |
| // error returned by `X509_STORE_CTX_get_error`. |
| OPENSSL_EXPORT X509 *X509_STORE_CTX_get_current_cert(const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get0_current_crl returns the CRL which caused the error |
| // returned by `X509_STORE_CTX_get_error`. |
| OPENSSL_EXPORT X509_CRL *X509_STORE_CTX_get0_current_crl( |
| const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get0_store returns the `X509_STORE` that `ctx` uses. |
| OPENSSL_EXPORT X509_STORE *X509_STORE_CTX_get0_store(const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get0_cert returns the leaf certificate that `ctx` is |
| // verifying. |
| OPENSSL_EXPORT X509 *X509_STORE_CTX_get0_cert(const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_get0_untrusted returns the stack of untrusted intermediates |
| // used by `ctx` for certificate verification. |
| OPENSSL_EXPORT STACK_OF(X509) *X509_STORE_CTX_get0_untrusted( |
| const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_set0_trusted_stack configures `ctx` to trust the certificates |
| // in `sk`. `sk` must remain valid for the duration of `ctx`. Calling this |
| // function causes `ctx` to ignore any certificates configured in the |
| // `X509_STORE`. Certificates in `sk` are still subject to the check described |
| // in `X509_VERIFY_PARAM_set_trust`. |
| // |
| // WARNING: This function differs from most `set0` functions in that it does not |
| // take ownership of its input. The caller is required to ensure the lifetimes |
| // are consistent. |
| OPENSSL_EXPORT void X509_STORE_CTX_set0_trusted_stack(X509_STORE_CTX *ctx, |
| STACK_OF(X509) *sk); |
| |
| // X509_STORE_CTX_set0_crls configures `ctx` to consider the CRLs in `sk` as |
| // candidates for CRL lookup. `sk` must remain valid for the duration of `ctx`. |
| // These CRLs are considered in addition to CRLs found in `X509_STORE`. |
| // |
| // WARNING: This function differs from most `set0` functions in that it does not |
| // take ownership of its input. The caller is required to ensure the lifetimes |
| // are consistent. |
| OPENSSL_EXPORT void X509_STORE_CTX_set0_crls(X509_STORE_CTX *ctx, |
| STACK_OF(X509_CRL) *sk); |
| |
| // X509_STORE_CTX_set_default looks up the set of parameters named `name` and |
| // applies those default verification parameters for `ctx`. As in |
| // `X509_VERIFY_PARAM_inherit`, only unset parameters are changed. This function |
| // returns one on success and zero on error. |
| // |
| // The supported values of `name` are: |
| // - "default" is an internal value which configures some late defaults. See the |
| // discussion in `X509_STORE_get0_param`. |
| // - "pkcs7" configures default trust and purpose checks for PKCS#7 signatures. |
| // - "smime_sign" configures trust and purpose checks for S/MIME signatures. |
| // - "ssl_client" configures trust and purpose checks for TLS clients. |
| // - "ssl_server" configures trust and purpose checks for TLS servers. |
| // |
| // TODO(crbug.com/boringssl/441): Make "default" a no-op. |
| OPENSSL_EXPORT int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, |
| const char *name); |
| |
| // X509_STORE_CTX_get0_param returns `ctx`'s verification parameters. This |
| // object is mutable and may be modified by the caller. |
| OPENSSL_EXPORT X509_VERIFY_PARAM *X509_STORE_CTX_get0_param( |
| X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_set0_param returns `ctx`'s verification parameters to `param` |
| // and takes ownership of `param`. After this function returns, the caller |
| // should not free `param`. |
| // |
| // WARNING: This function discards any values which were previously applied in |
| // `ctx`, including the "default" parameters applied late in |
| // `X509_STORE_CTX_init`. These late defaults are not applied to parameters |
| // created standalone by `X509_VERIFY_PARAM_new`. |
| // |
| // TODO(crbug.com/boringssl/441): This behavior is very surprising. Should we |
| // re-apply the late defaults in `param`, or somehow avoid this notion of late |
| // defaults altogether? |
| OPENSSL_EXPORT void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, |
| X509_VERIFY_PARAM *param); |
| |
| // X509_STORE_CTX_set_flags enables all values in `flags` in `ctx`'s |
| // verification flags. `flags` should be a combination of `X509_V_FLAG_*` |
| // constants. |
| OPENSSL_EXPORT void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, |
| unsigned long flags); |
| |
| // X509_STORE_CTX_set_time configures certificate verification to use `t` |
| // instead of the current time. `flags` is ignored and should be zero. |
| OPENSSL_EXPORT void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, |
| unsigned long flags, time_t t); |
| |
| // X509_STORE_CTX_set_time_posix configures certificate verification to use `t` |
| // instead of the current time. `t` is interpreted as a POSIX timestamp in |
| // seconds. `flags` is ignored and should be zero. |
| OPENSSL_EXPORT void X509_STORE_CTX_set_time_posix(X509_STORE_CTX *ctx, |
| unsigned long flags, |
| int64_t t); |
| |
| // X509_STORE_CTX_set_depth configures `ctx` to, by default, limit certificate |
| // chains to `depth` intermediate certificates. This count excludes both the |
| // target certificate and the trust anchor (root certificate). |
| OPENSSL_EXPORT void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth); |
| |
| // X509_STORE_CTX_set_purpose simultaneously configures `ctx`'s purpose and |
| // trust checks, if unset. It returns one on success and zero if `purpose` is |
| // not a valid purpose value. `purpose` should be an `X509_PURPOSE_*` constant. |
| // If so, it configures `ctx` with a purpose check of `purpose` and a trust |
| // check of `purpose`'s corresponding trust value. If either the purpose or |
| // trust check had already been specified for `ctx`, that corresponding |
| // modification is silently dropped. |
| // |
| // See `X509_VERIFY_PARAM_set_purpose` and `X509_VERIFY_PARAM_set_trust` for |
| // details on the purpose and trust checks, respectively. |
| // |
| // If `purpose` is `X509_PURPOSE_ANY`, this function returns an error because it |
| // has no corresponding `X509_TRUST_*` value. It is not possible to set |
| // `X509_PURPOSE_ANY` with this function, only `X509_VERIFY_PARAM_set_purpose`. |
| // |
| // WARNING: Unlike similarly named functions in this header, this function |
| // silently does not behave the same as `X509_VERIFY_PARAM_set_purpose`. Callers |
| // may use `X509_VERIFY_PARAM_set_purpose` with `X509_STORE_CTX_get0_param` to |
| // avoid this difference. |
| OPENSSL_EXPORT int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose); |
| |
| // X509_STORE_CTX_set_trust configures `ctx`'s trust check, if unset. It returns |
| // one on success and zero if `trust` is not a valid trust value. `trust` should |
| // be an `X509_TRUST_*` constant. If so, it configures `ctx` with a trust check |
| // of `trust`. If the trust check had already been specified for `ctx`, it |
| // silently does nothing. |
| // |
| // See `X509_VERIFY_PARAM_set_trust` for details on the purpose and trust check. |
| // |
| // WARNING: Unlike similarly named functions in this header, this function |
| // does not behave the same as `X509_VERIFY_PARAM_set_trust`. Callers may use |
| // `X509_VERIFY_PARAM_set_trust` with `X509_STORE_CTX_get0_param` to avoid this |
| // difference. |
| OPENSSL_EXPORT int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust); |
| |
| |
| // Verification parameters. |
| // |
| // An `X509_VERIFY_PARAM` contains a set of parameters for certificate |
| // verification. |
| |
| // X509_VERIFY_PARAM_new returns a newly-allocated `X509_VERIFY_PARAM`, or NULL |
| // on error. |
| OPENSSL_EXPORT X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void); |
| |
| // X509_VERIFY_PARAM_free releases memory associated with `param`. |
| OPENSSL_EXPORT void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param); |
| |
| // X509_VERIFY_PARAM_inherit applies `from` as the default values for `to`. That |
| // is, for each parameter that is unset in `to`, it copies the value in `from`. |
| // This function returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to, |
| const X509_VERIFY_PARAM *from); |
| |
| // X509_VERIFY_PARAM_set1 copies parameters from `from` to `to`. If a parameter |
| // is unset in `from`, the existing value in `to` is preserved. This function |
| // returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, |
| const X509_VERIFY_PARAM *from); |
| |
| // X509_V_FLAG_* are flags for `X509_VERIFY_PARAM_set_flags` and |
| // `X509_VERIFY_PARAM_clear_flags`. |
| |
| // X509_V_FLAG_CB_ISSUER_CHECK causes the deprecated verify callback (see |
| // `X509_STORE_CTX_set_verify_cb`) to be called for errors while matching |
| // subject and issuer certificates. |
| #define X509_V_FLAG_CB_ISSUER_CHECK 0x1 |
| // X509_V_FLAG_USE_CHECK_TIME is an internal flag used to track whether |
| // `X509_STORE_CTX_set_time` has been used. If cleared, the system time is |
| // restored. |
| #define X509_V_FLAG_USE_CHECK_TIME 0x2 |
| // X509_V_FLAG_CRL_CHECK enables CRL lookup and checking for the leaf. |
| #define X509_V_FLAG_CRL_CHECK 0x4 |
| // X509_V_FLAG_CRL_CHECK_ALL enables CRL lookup and checking for the entire |
| // certificate chain. `X509_V_FLAG_CRL_CHECK` must be set for this flag to take |
| // effect. |
| #define X509_V_FLAG_CRL_CHECK_ALL 0x8 |
| // X509_V_FLAG_IGNORE_CRITICAL ignores unhandled critical extensions. Do not use |
| // this option. Critical extensions ensure the verifier does not bypass |
| // unrecognized security restrictions in certificates. |
| #define X509_V_FLAG_IGNORE_CRITICAL 0x10 |
| // X509_V_FLAG_X509_STRICT does nothing. Its functionality has been enabled by |
| // default. |
| #define X509_V_FLAG_X509_STRICT 0x00 |
| // X509_V_FLAG_ALLOW_PROXY_CERTS does nothing. Proxy certificate support has |
| // been removed. |
| #define X509_V_FLAG_ALLOW_PROXY_CERTS 0x40 |
| // X509_V_FLAG_POLICY_CHECK does nothing. Policy checking is always enabled. |
| #define X509_V_FLAG_POLICY_CHECK 0x80 |
| // X509_V_FLAG_EXPLICIT_POLICY requires some policy OID to be asserted by the |
| // final certificate chain. See initial-explicit-policy from RFC 5280, |
| // section 6.1.1. |
| #define X509_V_FLAG_EXPLICIT_POLICY 0x100 |
| // X509_V_FLAG_INHIBIT_ANY inhibits the anyPolicy OID. See |
| // initial-any-policy-inhibit from RFC 5280, section 6.1.1. |
| #define X509_V_FLAG_INHIBIT_ANY 0x200 |
| // X509_V_FLAG_INHIBIT_MAP inhibits policy mapping. See |
| // initial-policy-mapping-inhibit from RFC 5280, section 6.1.1. |
| #define X509_V_FLAG_INHIBIT_MAP 0x400 |
| // X509_V_FLAG_NOTIFY_POLICY does nothing. Its functionality has been removed. |
| #define X509_V_FLAG_NOTIFY_POLICY 0x800 |
| // X509_V_FLAG_EXTENDED_CRL_SUPPORT causes all verifications to fail. Extended |
| // CRL features have been removed. |
| #define X509_V_FLAG_EXTENDED_CRL_SUPPORT 0x1000 |
| // X509_V_FLAG_USE_DELTAS causes all verifications to fail. Delta CRL support |
| // has been removed. |
| #define X509_V_FLAG_USE_DELTAS 0x2000 |
| // X509_V_FLAG_CHECK_SS_SIGNATURE checks the redundant signature on self-signed |
| // trust anchors. This check provides no security benefit and only wastes CPU. |
| #define X509_V_FLAG_CHECK_SS_SIGNATURE 0x4000 |
| // X509_V_FLAG_TRUSTED_FIRST, during path-building, checks for a match in the |
| // trust store before considering an untrusted intermediate. This flag is |
| // enabled by default. |
| #define X509_V_FLAG_TRUSTED_FIRST 0x8000 |
| // X509_V_FLAG_PARTIAL_CHAIN treats all trusted certificates as trust anchors, |
| // independent of the `X509_VERIFY_PARAM_set_trust` setting. |
| #define X509_V_FLAG_PARTIAL_CHAIN 0x80000 |
| // X509_V_FLAG_NO_ALT_CHAINS disables building alternative chains if the initial |
| // one was rejected. |
| #define X509_V_FLAG_NO_ALT_CHAINS 0x100000 |
| // X509_V_FLAG_NO_CHECK_TIME disables all time checks in certificate |
| // verification. |
| #define X509_V_FLAG_NO_CHECK_TIME 0x200000 |
| |
| // X509_VERIFY_PARAM_set_flags enables all values in `flags` in `param`'s |
| // verification flags and returns one. `flags` should be a combination of |
| // `X509_V_FLAG_*` constants. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, |
| unsigned long flags); |
| |
| // X509_VERIFY_PARAM_clear_flags disables all values in `flags` in `param`'s |
| // verification flags and returns one. `flags` should be a combination of |
| // `X509_V_FLAG_*` constants. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param, |
| unsigned long flags); |
| |
| // X509_VERIFY_PARAM_get_flags returns `param`'s verification flags. |
| OPENSSL_EXPORT unsigned long X509_VERIFY_PARAM_get_flags( |
| const X509_VERIFY_PARAM *param); |
| |
| // X509_VERIFY_PARAM_set_depth configures `param` to limit certificate chains to |
| // `depth` intermediate certificates. This count excludes both the target |
| // certificate and the trust anchor (root certificate). |
| OPENSSL_EXPORT void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, |
| int depth); |
| |
| // X509_VERIFY_PARAM_get_depth returns the maximum depth configured in `param`. |
| // See `X509_VERIFY_PARAM_set_depth`. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param); |
| |
| // X509_VERIFY_PARAM_set_time configures certificate verification to use `t` |
| // instead of the current time. |
| OPENSSL_EXPORT void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, |
| time_t t); |
| |
| // X509_VERIFY_PARAM_set_time_posix configures certificate verification to use |
| // `t` instead of the current time. `t` is interpreted as a POSIX timestamp in |
| // seconds. |
| OPENSSL_EXPORT void X509_VERIFY_PARAM_set_time_posix(X509_VERIFY_PARAM *param, |
| int64_t t); |
| |
| // X509_VERIFY_PARAM_add0_policy adds `policy` to the user-initial-policy-set |
| // (see Section 6.1.1 of RFC 5280). On success, it takes ownership of |
| // `policy` and returns one. Otherwise, it returns zero and the caller retains |
| // owneship of `policy`. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param, |
| ASN1_OBJECT *policy); |
| |
| // X509_VERIFY_PARAM_set1_policies sets the user-initial-policy-set (see |
| // Section 6.1.1 of RFC 5280) to a copy of `policies`. It returns one on success |
| // and zero on error. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_policies( |
| X509_VERIFY_PARAM *param, const STACK_OF(ASN1_OBJECT) *policies); |
| |
| // X509_VERIFY_PARAM_set1_host configures `param` to check for the DNS name |
| // specified by `name`. It returns one on success and zero on error. |
| // |
| // By default, both subject alternative names and the subject's common name |
| // attribute are checked. The latter has long been deprecated, so callers should |
| // call `X509_VERIFY_PARAM_set_hostflags` with |
| // `X509_CHECK_FLAG_NEVER_CHECK_SUBJECT` to use the standard behavior. |
| // https://crbug.com/boringssl/464 tracks fixing the default. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_host(X509_VERIFY_PARAM *param, |
| const char *name, |
| size_t name_len); |
| |
| // X509_VERIFY_PARAM_add1_host adds `name` to the list of names checked by |
| // `param`. If any configured DNS name matches the certificate, verification |
| // succeeds. It returns one on success and zero on error. |
| // |
| // By default, both subject alternative names and the subject's common name |
| // attribute are checked. The latter has long been deprecated, so callers should |
| // call `X509_VERIFY_PARAM_set_hostflags` with |
| // `X509_CHECK_FLAG_NEVER_CHECK_SUBJECT` to use the standard behavior. |
| // https://crbug.com/boringssl/464 tracks fixing the default. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_add1_host(X509_VERIFY_PARAM *param, |
| const char *name, |
| size_t name_len); |
| |
| // X509_CHECK_FLAG_NO_WILDCARDS disables wildcard matching for DNS names. |
| #define X509_CHECK_FLAG_NO_WILDCARDS 0x2 |
| |
| // X509_CHECK_FLAG_NEVER_CHECK_SUBJECT disables the subject fallback, normally |
| // enabled when subjectAltNames is missing. |
| #define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT 0x20 |
| |
| // X509_VERIFY_PARAM_set_hostflags sets the name-checking flags on `param` to |
| // `flags`. `flags` should be a combination of `X509_CHECK_FLAG_*` constants. |
| OPENSSL_EXPORT void X509_VERIFY_PARAM_set_hostflags(X509_VERIFY_PARAM *param, |
| unsigned int flags); |
| |
| // X509_VERIFY_PARAM_set1_email configures `param` to check for the email |
| // address specified by `email`. It returns one on success and zero on error. |
| // |
| // By default, both subject alternative names and the subject's email address |
| // attribute are checked. The `X509_CHECK_FLAG_NEVER_CHECK_SUBJECT` flag may be |
| // used to change this behavior. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_email(X509_VERIFY_PARAM *param, |
| const char *email, |
| size_t email_len); |
| |
| // X509_VERIFY_PARAM_set1_ip configures `param` to check for the IP address |
| // specified by `ip`. It returns one on success and zero on error. The IP |
| // address is specified in its binary representation. `ip_len` must be 4 for an |
| // IPv4 address and 16 for an IPv6 address. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_ip(X509_VERIFY_PARAM *param, |
| const uint8_t *ip, size_t ip_len); |
| |
| // X509_VERIFY_PARAM_set1_ip_asc decodes `ipasc` as the ASCII representation of |
| // an IPv4 or IPv6 address, and configures `param` to check for it. It returns |
| // one on success and zero on error. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set1_ip_asc(X509_VERIFY_PARAM *param, |
| const char *ipasc); |
| |
| // X509_PURPOSE_SSL_CLIENT validates TLS client certificates. It checks for the |
| // id-kp-clientAuth EKU and one of digitalSignature or keyAgreement key usages. |
| // The TLS library is expected to check for the key usage specific to the |
| // negotiated TLS parameters. |
| #define X509_PURPOSE_SSL_CLIENT 1 |
| // X509_PURPOSE_SSL_SERVER validates TLS server certificates. It checks for the |
| // id-kp-clientAuth EKU and one of digitalSignature, keyAgreement, or |
| // keyEncipherment key usages. The TLS library is expected to check for the key |
| // usage specific to the negotiated TLS parameters. |
| #define X509_PURPOSE_SSL_SERVER 2 |
| // X509_PURPOSE_NS_SSL_SERVER is a legacy mode. It behaves like |
| // `X509_PURPOSE_SSL_SERVER`, but only accepts the keyEncipherment key usage, |
| // used by SSL 2.0 and RSA key exchange. Do not use this. |
| #define X509_PURPOSE_NS_SSL_SERVER 3 |
| // X509_PURPOSE_SMIME_SIGN validates S/MIME signing certificates. It checks for |
| // the id-kp-emailProtection EKU and one of digitalSignature or nonRepudiation |
| // key usages. |
| #define X509_PURPOSE_SMIME_SIGN 4 |
| // X509_PURPOSE_SMIME_ENCRYPT validates S/MIME encryption certificates. It |
| // checks for the id-kp-emailProtection EKU and keyEncipherment key usage. |
| #define X509_PURPOSE_SMIME_ENCRYPT 5 |
| // X509_PURPOSE_CRL_SIGN validates indirect CRL signers. It checks for the |
| // cRLSign key usage. BoringSSL does not support indirect CRLs and does not use |
| // this mode. |
| #define X509_PURPOSE_CRL_SIGN 6 |
| // X509_PURPOSE_ANY performs no EKU or key usage checks. Such checks are the |
| // responsibility of the caller. |
| #define X509_PURPOSE_ANY 7 |
| // X509_PURPOSE_OCSP_HELPER performs no EKU or key usage checks. It was |
| // historically used in OpenSSL's OCSP implementation, which left those checks |
| // to the OCSP implementation itself. |
| #define X509_PURPOSE_OCSP_HELPER 8 |
| // X509_PURPOSE_TIMESTAMP_SIGN validates Time Stamping Authority (RFC 3161) |
| // certificates. It checks for the id-kp-timeStamping EKU and one of |
| // digitalSignature or nonRepudiation key usages. It additionally checks that |
| // the EKU extension is critical and that no other EKUs or key usages are |
| // asserted. |
| #define X509_PURPOSE_TIMESTAMP_SIGN 9 |
| |
| // X509_VERIFY_PARAM_set_purpose configures `param` to validate certificates for |
| // a specified purpose. It returns one on success and zero if `purpose` is not a |
| // valid purpose type. `purpose` should be one of the `X509_PURPOSE_*` values. |
| // |
| // This option controls checking the extended key usage (EKU) and key usage |
| // extensions. These extensions specify how a certificate's public key may be |
| // used and are important to avoid cross-protocol attacks, particularly in PKIs |
| // that may issue certificates for multiple protocols, or for protocols that use |
| // keys in multiple ways. If not configured, these security checks are the |
| // caller's responsibility. |
| // |
| // This library applies the EKU checks to all untrusted intermediates. Although |
| // not defined in RFC 5280, this matches widely-deployed practice. It also does |
| // not accept anyExtendedKeyUsage. |
| // |
| // Many purpose values have a corresponding trust value, which is not configured |
| // by this function. See `X509_VERIFY_PARAM_set_trust` for details. Callers |
| // that wish to configure both should either call both functions, or use |
| // `X509_STORE_CTX_set_purpose`. |
| // |
| // It is currently not possible to configure custom EKU OIDs or key usage bits. |
| // Contact the BoringSSL maintainers if your application needs to do so. OpenSSL |
| // had an `X509_PURPOSE_add` API, but it was not thread-safe and relied on |
| // global mutable state, so we removed it. |
| // |
| // TODO(davidben): This function additionally configures checking the legacy |
| // Netscape certificate type extension. Remove this. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, |
| int purpose); |
| |
| // X509_TRUST_COMPAT evaluates trust using only the self-signed fallback. Trust |
| // and distrust OIDs are ignored. |
| #define X509_TRUST_COMPAT 1 |
| // X509_TRUST_SSL_CLIENT evaluates trust with the `NID_client_auth` OID, for |
| // validating TLS client certificates. |
| #define X509_TRUST_SSL_CLIENT 2 |
| // X509_TRUST_SSL_SERVER evaluates trust with the `NID_server_auth` OID, for |
| // validating TLS server certificates. |
| #define X509_TRUST_SSL_SERVER 3 |
| // X509_TRUST_EMAIL evaluates trust with the `NID_email_protect` OID, for |
| // validating S/MIME email certificates. |
| #define X509_TRUST_EMAIL 4 |
| // X509_TRUST_OBJECT_SIGN evaluates trust with the `NID_code_sign` OID, for |
| // validating code signing certificates. |
| #define X509_TRUST_OBJECT_SIGN 5 |
| // X509_TRUST_TSA evaluates trust with the `NID_time_stamp` OID, for validating |
| // Time Stamping Authority (RFC 3161) certificates. |
| #define X509_TRUST_TSA 8 |
| |
| // X509_VERIFY_PARAM_set_trust configures which certificates from `X509_STORE` |
| // are trust anchors. It returns one on success and zero if `trust` is not a |
| // valid trust value. `trust` should be one of the `X509_TRUST_*` constants. |
| // This function allows applications to vary trust anchors when the same set of |
| // trusted certificates is used in multiple contexts. |
| // |
| // Two properties determine whether a certificate is a trust anchor: |
| // |
| // - Whether it is trusted or distrusted for some OID, via auxiliary information |
| // configured by `X509_add1_trust_object` or `X509_add1_reject_object`. |
| // |
| // - Whether it is "self-signed". That is, whether `X509_get_extension_flags` |
| // includes `EXFLAG_SS`. The signature itself is not checked. |
| // |
| // When this function is called, `trust` determines the OID to check in the |
| // first case. If the certificate is not explicitly trusted or distrusted for |
| // any OID, it is trusted if self-signed instead. |
| // |
| // If unset, the default behavior is to check for the `NID_anyExtendedKeyUsage` |
| // OID. If the certificate is not explicitly trusted or distrusted for this OID, |
| // it is trusted if self-signed instead. Note this slightly differs from the |
| // above. |
| // |
| // If the `X509_V_FLAG_PARTIAL_CHAIN` is set, every certificate from |
| // `X509_STORE` is a trust anchor, unless it was explicitly distrusted for the |
| // OID. |
| // |
| // It is currently not possible to configure custom trust OIDs. Contact the |
| // BoringSSL maintainers if your application needs to do so. OpenSSL had an |
| // `X509_TRUST_add` API, but it was not thread-safe and relied on global mutable |
| // state, so we removed it. |
| OPENSSL_EXPORT int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, |
| int trust); |
| |
| |
| // Filesystem-based certificate stores. |
| // |
| // An `X509_STORE` may be configured to get its contents from the filesystem. |
| // This is done by adding `X509_LOOKUP` structures to the `X509_STORE` with |
| // `X509_STORE_add_lookup` and then configuring the `X509_LOOKUP` with paths. |
| // |
| // Most cases can use `X509_STORE_load_locations`, which configures the same |
| // thing but is simpler to use. |
| |
| // X509_STORE_load_locations configures `store` to load data from filepaths |
| // `file` and `dir`. It returns one on success and zero on error. Either of |
| // `file` or `dir` may be NULL, but at least one must be non-NULL. |
| // |
| // If `file` is non-NULL, it loads CRLs and trusted certificates in PEM format |
| // from the file at `file`, and them to `store`, as in `X509_load_cert_crl_file` |
| // with `X509_FILETYPE_PEM`. |
| // |
| // If `dir` is non-NULL, it configures `store` to load CRLs and trusted |
| // certificates from the directory at `dir` in PEM format, as in |
| // `X509_LOOKUP_add_dir` with `X509_FILETYPE_PEM`. |
| OPENSSL_EXPORT int X509_STORE_load_locations(X509_STORE *store, |
| const char *file, const char *dir); |
| |
| // X509_STORE_add_lookup returns an `X509_LOOKUP` associated with `store` with |
| // type `method`, or NULL on error. The result is owned by `store`, so callers |
| // are not expected to free it. This may be used with `X509_LOOKUP_add_dir` or |
| // `X509_LOOKUP_load_file`, depending on `method`, to configure `store`. |
| // |
| // A single `X509_LOOKUP` may be configured with multiple paths, and an |
| // `X509_STORE` only contains one `X509_LOOKUP` of each type, so there is no |
| // need to call this function multiple times for a single type. Calling it |
| // multiple times will return the previous `X509_LOOKUP` of that type. |
| OPENSSL_EXPORT X509_LOOKUP *X509_STORE_add_lookup( |
| X509_STORE *store, const X509_LOOKUP_METHOD *method); |
| |
| // X509_LOOKUP_hash_dir creates `X509_LOOKUP`s that may be used with |
| // `X509_LOOKUP_add_dir`. |
| OPENSSL_EXPORT const X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void); |
| |
| // X509_LOOKUP_file creates `X509_LOOKUP`s that may be used with |
| // `X509_LOOKUP_load_file`. |
| // |
| // Although this is modeled as an `X509_LOOKUP`, this function is redundant. It |
| // has the same effect as loading a certificate or CRL from the filesystem, in |
| // the caller's desired format, and then adding it with `X509_STORE_add_cert` |
| // and `X509_STORE_add_crl`. |
| OPENSSL_EXPORT const X509_LOOKUP_METHOD *X509_LOOKUP_file(void); |
| |
| // The following constants are used to specify the format of files in an |
| // `X509_LOOKUP`. |
| #define X509_FILETYPE_PEM 1 |
| #define X509_FILETYPE_ASN1 2 |
| #define X509_FILETYPE_DEFAULT 3 |
| |
| // X509_LOOKUP_load_file calls `X509_load_cert_crl_file`. `lookup` must have |
| // been constructed with `X509_LOOKUP_file`. |
| // |
| // If `type` is `X509_FILETYPE_DEFAULT`, it ignores `file` and instead uses some |
| // default system path with `X509_FILETYPE_PEM`. See also |
| // `X509_STORE_set_default_paths`. |
| OPENSSL_EXPORT int X509_LOOKUP_load_file(X509_LOOKUP *lookup, const char *file, |
| int type); |
| |
| // X509_LOOKUP_add_dir configures `lookup` to load CRLs and trusted certificates |
| // from the directories in `path`. It returns one on success and zero on error. |
| // `lookup` must have been constructed with `X509_LOOKUP_hash_dir`. |
| // |
| // WARNING: `path` is interpreted as a colon-separated (semicolon-separated on |
| // Windows) list of paths. It is not possible to configure a path containing the |
| // separator character. https://crbug.com/boringssl/691 tracks removing this |
| // behavior. |
| // |
| // `type` should be one of the `X509_FILETYPE_*` constants and determines the |
| // format of the files. If `type` is `X509_FILETYPE_DEFAULT`, `path` is ignored |
| // and some default system path is used with `X509_FILETYPE_PEM`. See also |
| // `X509_STORE_set_default_paths`. |
| // |
| // Trusted certificates should be named HASH.N and CRLs should be |
| // named HASH.rN. HASH is `X509_NAME_hash` of the certificate subject and CRL |
| // issuer, respectively, in hexadecimal. N is in decimal and counts hash |
| // collisions consecutively, starting from zero. For example, "002c0b4f.0" and |
| // "002c0b4f.r0". |
| // |
| // WARNING: Objects from `path` are loaded on demand, but cached in memory on |
| // the `X509_STORE`. If a CA is removed from the directory, existing |
| // `X509_STORE`s will continue to trust it. Cache entries are not evicted for |
| // the lifetime of the `X509_STORE`. |
| // |
| // WARNING: This mechanism is also not well-suited for CRL updates. |
| // `X509_STORE`s rely on this cache and never load the same CRL file twice. CRL |
| // updates must use a new file, with an incremented suffix, to be reflected in |
| // existing `X509_STORE`s. However, this means each CRL update will use |
| // additional storage and memory. Instead, configure inputs that vary per |
| // verification, such as CRLs, on each `X509_STORE_CTX` separately, using |
| // functions like `X509_STORE_CTX_set0_crl`. |
| OPENSSL_EXPORT int X509_LOOKUP_add_dir(X509_LOOKUP *lookup, const char *path, |
| int type); |
| |
| // X509_L_* are commands for `X509_LOOKUP_ctrl`. |
| #define X509_L_FILE_LOAD 1 |
| #define X509_L_ADD_DIR 2 |
| |
| // X509_LOOKUP_ctrl implements commands on `lookup`. `cmd` specifies the |
| // command. The other arguments specify the operation in a command-specific way. |
| // Use `X509_LOOKUP_load_file` or `X509_LOOKUP_add_dir` instead. |
| OPENSSL_EXPORT int X509_LOOKUP_ctrl(X509_LOOKUP *lookup, int cmd, |
| const char *argc, long argl, char **ret); |
| |
| // X509_load_cert_file loads trusted certificates from `file` and adds them to |
| // `lookup`'s `X509_STORE`. It returns one on success and zero on error. |
| // |
| // If `type` is `X509_FILETYPE_ASN1`, it loads a single DER-encoded certificate. |
| // If `type` is `X509_FILETYPE_PEM`, it loads a sequence of PEM-encoded |
| // certificates. `type` may not be `X509_FILETYPE_DEFAULT`. |
| OPENSSL_EXPORT int X509_load_cert_file(X509_LOOKUP *lookup, const char *file, |
| int type); |
| |
| // X509_load_crl_file loads CRLs from `file` and add them it to `lookup`'s |
| // `X509_STORE`. It returns one on success and zero on error. |
| // |
| // If `type` is `X509_FILETYPE_ASN1`, it loads a single DER-encoded CRL. If |
| // `type` is `X509_FILETYPE_PEM`, it loads a sequence of PEM-encoded CRLs. |
| // `type` may not be `X509_FILETYPE_DEFAULT`. |
| OPENSSL_EXPORT int X509_load_crl_file(X509_LOOKUP *lookup, const char *file, |
| int type); |
| |
| // X509_load_cert_crl_file loads CRLs and trusted certificates from `file` and |
| // adds them to `lookup`'s `X509_STORE`. It returns one on success and zero on |
| // error. |
| // |
| // If `type` is `X509_FILETYPE_ASN1`, it loads a single DER-encoded certificate. |
| // This function cannot be used to load a DER-encoded CRL. If `type` is |
| // `X509_FILETYPE_PEM`, it loads a sequence of PEM-encoded certificates and |
| // CRLs. `type` may not be `X509_FILETYPE_DEFAULT`. |
| OPENSSL_EXPORT int X509_load_cert_crl_file(X509_LOOKUP *lookup, |
| const char *file, int type); |
| |
| // X509_NAME_hash returns a hash of `name`, or zero on error. This is the new |
| // hash used by `X509_LOOKUP_add_dir`. |
| // |
| // This hash is specific to the `X509_LOOKUP_add_dir` filesystem format and is |
| // not suitable for general-purpose X.509 name processing. It is very short, so |
| // there will be hash collisions. It also depends on an OpenSSL-specific |
| // canonicalization process. |
| OPENSSL_EXPORT uint32_t X509_NAME_hash(const X509_NAME *name); |
| |
| // X509_NAME_hash_old returns a hash of `name`, or zero on error. This is the |
| // legacy hash used by `X509_LOOKUP_add_dir`, which is still supported for |
| // compatibility. |
| // |
| // This hash is specific to the `X509_LOOKUP_add_dir` filesystem format and is |
| // not suitable for general-purpose X.509 name processing. It is very short, so |
| // there will be hash collisions. |
| OPENSSL_EXPORT uint32_t X509_NAME_hash_old(const X509_NAME *name); |
| |
| // X509_STORE_set_default_paths configures `store` to read from some "default" |
| // filesystem paths. It returns one on success and zero on error. The filesystem |
| // paths are determined by a combination of hardcoded paths and the SSL_CERT_DIR |
| // and SSL_CERT_FILE environment variables. |
| // |
| // Using this function is not recommended. In OpenSSL, these defaults are |
| // determined by OpenSSL's install prefix. There is no corresponding concept for |
| // BoringSSL. Future versions of BoringSSL may change or remove this |
| // functionality. |
| OPENSSL_EXPORT int X509_STORE_set_default_paths(X509_STORE *store); |
| |
| // The following functions return filesystem paths used to determine the above |
| // "default" paths, when the corresponding environment variables are not set. |
| // |
| // Using these functions is not recommended. In OpenSSL, these defaults are |
| // determined by OpenSSL's install prefix. There is no corresponding concept for |
| // BoringSSL. Future versions of BoringSSL may change or remove this |
| // functionality. |
| OPENSSL_EXPORT const char *X509_get_default_cert_area(void); |
| OPENSSL_EXPORT const char *X509_get_default_cert_dir(void); |
| OPENSSL_EXPORT const char *X509_get_default_cert_file(void); |
| OPENSSL_EXPORT const char *X509_get_default_private_dir(void); |
| |
| // X509_get_default_cert_dir_env returns "SSL_CERT_DIR", an environment variable |
| // used to determine the above "default" paths. |
| OPENSSL_EXPORT const char *X509_get_default_cert_dir_env(void); |
| |
| // X509_get_default_cert_file_env returns "SSL_CERT_FILE", an environment |
| // variable used to determine the above "default" paths. |
| OPENSSL_EXPORT const char *X509_get_default_cert_file_env(void); |
| |
| |
| // SignedPublicKeyAndChallenge structures. |
| // |
| // The SignedPublicKeyAndChallenge (SPKAC) is a legacy structure to request |
| // certificates, primarily in the legacy <keygen> HTML tag. An SPKAC structure |
| // is represented by a `NETSCAPE_SPKI` structure. |
| // |
| // The structure is described in |
| // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/keygen |
| |
| // A Netscape_spki_st, or `NETSCAPE_SPKI`, represents a |
| // SignedPublicKeyAndChallenge structure. Although this structure contains a |
| // `spkac` field of type `NETSCAPE_SPKAC`, these are misnamed. The SPKAC is the |
| // entire structure, not the signed portion. |
| struct Netscape_spki_st { |
| NETSCAPE_SPKAC *spkac; |
| X509_ALGOR *sig_algor; |
| ASN1_BIT_STRING *signature; |
| } /* NETSCAPE_SPKI */; |
| |
| // NETSCAPE_SPKI_new returns a newly-allocated, empty `NETSCAPE_SPKI` object, or |
| // NULL on error. |
| OPENSSL_EXPORT NETSCAPE_SPKI *NETSCAPE_SPKI_new(void); |
| |
| // NETSCAPE_SPKI_free releases memory associated with `spki`. |
| OPENSSL_EXPORT void NETSCAPE_SPKI_free(NETSCAPE_SPKI *spki); |
| |
| // d2i_NETSCAPE_SPKI parses up to `len` bytes from `*inp` as a DER-encoded |
| // SignedPublicKeyAndChallenge structure, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT NETSCAPE_SPKI *d2i_NETSCAPE_SPKI(NETSCAPE_SPKI **out, |
| const uint8_t **inp, long len); |
| |
| // i2d_NETSCAPE_SPKI marshals `spki` as a DER-encoded |
| // SignedPublicKeyAndChallenge structure, as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_NETSCAPE_SPKI(const NETSCAPE_SPKI *spki, uint8_t **outp); |
| |
| // NETSCAPE_SPKI_verify checks that `spki` has a valid signature by `pkey`. It |
| // returns one if the signature is valid and zero otherwise. |
| OPENSSL_EXPORT int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *spki, EVP_PKEY *pkey); |
| |
| // NETSCAPE_SPKI_b64_decode decodes `len` bytes from `str` as a base64-encoded |
| // SignedPublicKeyAndChallenge structure. It returns a newly-allocated |
| // `NETSCAPE_SPKI` structure with the result, or NULL on error. If `len` is 0 or |
| // negative, the length is calculated with `strlen` and `str` must be a |
| // NUL-terminated C string. |
| OPENSSL_EXPORT NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, |
| ossl_ssize_t len); |
| |
| // NETSCAPE_SPKI_b64_encode encodes `spki` as a base64-encoded |
| // SignedPublicKeyAndChallenge structure. It returns a newly-allocated |
| // NUL-terminated C string with the result, or NULL on error. The caller must |
| // release the memory with `OPENSSL_free` when done. |
| OPENSSL_EXPORT char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki); |
| |
| // NETSCAPE_SPKI_get_pubkey decodes and returns the public key in `spki` as an |
| // `EVP_PKEY`, or NULL on error. The caller takes ownership of the resulting |
| // pointer and must call `EVP_PKEY_free` when done. |
| OPENSSL_EXPORT EVP_PKEY *NETSCAPE_SPKI_get_pubkey(const NETSCAPE_SPKI *spki); |
| |
| // NETSCAPE_SPKI_set_pubkey sets `spki`'s public key to `pkey`. It returns one |
| // on success or zero on error. This function does not take ownership of `pkey`, |
| // so the caller may continue to manage its lifetime independently of `spki`. |
| OPENSSL_EXPORT int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *spki, |
| EVP_PKEY *pkey); |
| |
| // NETSCAPE_SPKI_sign signs `spki` with `pkey` and replaces the signature |
| // algorithm and signature fields. It returns the length of the signature on |
| // success and zero on error. This function uses digest algorithm `md`, or |
| // `pkey`'s default if NULL. Other signing parameters use `pkey`'s defaults. |
| OPENSSL_EXPORT int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *spki, EVP_PKEY *pkey, |
| const EVP_MD *md); |
| |
| // A Netscape_spkac_st, or `NETSCAPE_SPKAC`, represents a PublicKeyAndChallenge |
| // structure. This type is misnamed. The full SPKAC includes the signature, |
| // which is represented with the `NETSCAPE_SPKI` type. |
| struct Netscape_spkac_st { |
| X509_PUBKEY *pubkey; |
| ASN1_IA5STRING *challenge; |
| } /* NETSCAPE_SPKAC */; |
| |
| // NETSCAPE_SPKAC_new returns a newly-allocated, empty `NETSCAPE_SPKAC` object, |
| // or NULL on error. |
| OPENSSL_EXPORT NETSCAPE_SPKAC *NETSCAPE_SPKAC_new(void); |
| |
| // NETSCAPE_SPKAC_free releases memory associated with `spkac`. |
| OPENSSL_EXPORT void NETSCAPE_SPKAC_free(NETSCAPE_SPKAC *spkac); |
| |
| // d2i_NETSCAPE_SPKAC parses up to `len` bytes from `*inp` as a DER-encoded |
| // PublicKeyAndChallenge structure, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT NETSCAPE_SPKAC *d2i_NETSCAPE_SPKAC(NETSCAPE_SPKAC **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_NETSCAPE_SPKAC marshals `spkac` as a DER-encoded PublicKeyAndChallenge |
| // structure, as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_NETSCAPE_SPKAC(const NETSCAPE_SPKAC *spkac, |
| uint8_t **outp); |
| |
| |
| // RSASSA-PSS Parameters. |
| // |
| // In X.509, RSASSA-PSS signatures and keys use a complex parameter structure, |
| // defined in RFC 4055. The following functions are provided for compatibility |
| // with some OpenSSL APIs relating to this. Use of RSASSA-PSS in X.509 is |
| // discouraged. The parameters structure is very complex, and it takes more |
| // bytes to merely encode parameters than an entire P-256 ECDSA signature. |
| |
| // An rsa_pss_params_st, aka `RSA_PSS_PARAMS`, represents a parsed |
| // RSASSA-PSS-params structure, as defined in (RFC 4055). |
| struct rsa_pss_params_st { |
| X509_ALGOR *hashAlgorithm; |
| X509_ALGOR *maskGenAlgorithm; |
| ASN1_INTEGER *saltLength; |
| ASN1_INTEGER *trailerField; |
| // OpenSSL caches the MGF hash on `RSA_PSS_PARAMS` in some cases. None of the |
| // cases apply to BoringSSL, so this is always NULL, but Node expects the |
| // field to be present. |
| X509_ALGOR *maskHash; |
| } /* RSA_PSS_PARAMS */; |
| |
| // RSA_PSS_PARAMS is an `ASN1_ITEM` whose ASN.1 type is RSASSA-PSS-params (RFC |
| // 4055) and C type is `RSA_PSS_PARAMS*`. |
| DECLARE_ASN1_ITEM(RSA_PSS_PARAMS) |
| |
| // RSA_PSS_PARAMS_new returns a new, empty `RSA_PSS_PARAMS`, or NULL on error. |
| OPENSSL_EXPORT RSA_PSS_PARAMS *RSA_PSS_PARAMS_new(void); |
| |
| // RSA_PSS_PARAMS_free releases memory associated with `params`. |
| OPENSSL_EXPORT void RSA_PSS_PARAMS_free(RSA_PSS_PARAMS *params); |
| |
| // d2i_RSA_PSS_PARAMS parses up to `len` bytes from `*inp` as a DER-encoded |
| // RSASSA-PSS-params (RFC 4055), as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT RSA_PSS_PARAMS *d2i_RSA_PSS_PARAMS(RSA_PSS_PARAMS **out, |
| const uint8_t **inp, |
| long len); |
| |
| // i2d_RSA_PSS_PARAMS marshals `in` as a DER-encoded RSASSA-PSS-params (RFC |
| // 4055), as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_RSA_PSS_PARAMS(const RSA_PSS_PARAMS *in, uint8_t **outp); |
| |
| |
| // PKCS#8 private keys. |
| // |
| // The `PKCS8_PRIV_KEY_INFO` type represents a PKCS#8 PrivateKeyInfo (RFC 5208) |
| // structure. This is analogous to SubjectPublicKeyInfo and uses the same |
| // AlgorithmIdentifiers, but carries private keys and is not part of X.509 |
| // itself. |
| // |
| // TODO(davidben): Do these functions really belong in this header? |
| |
| // PKCS8_PRIV_KEY_INFO_new returns a newly-allocated, empty |
| // `PKCS8_PRIV_KEY_INFO` object, or NULL on error. |
| OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *PKCS8_PRIV_KEY_INFO_new(void); |
| |
| // PKCS8_PRIV_KEY_INFO_free releases memory associated with `key`. |
| OPENSSL_EXPORT void PKCS8_PRIV_KEY_INFO_free(PKCS8_PRIV_KEY_INFO *key); |
| |
| // d2i_PKCS8_PRIV_KEY_INFO parses up to `len` bytes from `*inp` as a DER-encoded |
| // PrivateKeyInfo, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO( |
| PKCS8_PRIV_KEY_INFO **out, const uint8_t **inp, long len); |
| |
| // i2d_PKCS8_PRIV_KEY_INFO marshals `key` as a DER-encoded PrivateKeyInfo, as |
| // described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO(const PKCS8_PRIV_KEY_INFO *key, |
| uint8_t **outp); |
| |
| // EVP_PKCS82PKEY returns `p8` as a newly-allocated `EVP_PKEY`, or NULL if the |
| // key was unsupported or could not be decoded. The caller must release the |
| // result with `EVP_PKEY_free` when done. |
| // |
| // Use `EVP_parse_private_key` instead. |
| OPENSSL_EXPORT EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8); |
| |
| // EVP_PKEY2PKCS8 encodes `pkey` as a PKCS#8 PrivateKeyInfo (RFC 5208), |
| // represented as a newly-allocated `PKCS8_PRIV_KEY_INFO`, or NULL on error. The |
| // caller must release the result with `PKCS8_PRIV_KEY_INFO_free` when done. |
| // |
| // Use `EVP_marshal_private_key` instead. |
| OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey); |
| |
| |
| // Algorithm and octet string pairs. |
| // |
| // The `X509_SIG` type represents an ASN.1 SEQUENCE type of an |
| // AlgorithmIdentifier and an OCTET STRING. Although named `X509_SIG`, there is |
| // no type in X.509 which matches this format. The two common types which do are |
| // DigestInfo (RFC 2315 and RFC 8017), and EncryptedPrivateKeyInfo (RFC 5208). |
| |
| // X509_SIG_new returns a newly-allocated, empty `X509_SIG` object, or NULL on |
| // error. |
| OPENSSL_EXPORT X509_SIG *X509_SIG_new(void); |
| |
| // X509_SIG_free releases memory associated with `key`. |
| OPENSSL_EXPORT void X509_SIG_free(X509_SIG *key); |
| |
| // d2i_X509_SIG parses up to `len` bytes from `*inp` as a DER-encoded algorithm |
| // and octet string pair, as described in `d2i_SAMPLE`. |
| OPENSSL_EXPORT X509_SIG *d2i_X509_SIG(X509_SIG **out, const uint8_t **inp, |
| long len); |
| |
| // i2d_X509_SIG marshals `sig` as a DER-encoded algorithm |
| // and octet string pair, as described in `i2d_SAMPLE`. |
| OPENSSL_EXPORT int i2d_X509_SIG(const X509_SIG *sig, uint8_t **outp); |
| |
| // X509_SIG_get0 sets `*out_alg` and `*out_digest` to non-owning pointers to |
| // `sig`'s algorithm and digest fields, respectively. Either `out_alg` and |
| // `out_digest` may be NULL to skip those fields. |
| OPENSSL_EXPORT void X509_SIG_get0(const X509_SIG *sig, |
| const X509_ALGOR **out_alg, |
| const ASN1_OCTET_STRING **out_digest); |
| |
| // X509_SIG_getm behaves like `X509_SIG_get0` but returns mutable pointers. |
| OPENSSL_EXPORT void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **out_alg, |
| ASN1_OCTET_STRING **out_digest); |
| |
| |
| // Printing functions. |
| // |
| // The following functions output human-readable representations of |
| // X.509-related structures. They should only be used for debugging or logging |
| // and not parsed programmatically. In many cases, the outputs are ambiguous, so |
| // attempting to parse them can lead to string injection vulnerabilities. |
| |
| // The following flags control `X509_print_ex` and `X509_REQ_print_ex`. These |
| // flags co-exist with `X509V3_EXT_*`, so avoid collisions when adding new ones. |
| |
| // X509_FLAG_COMPAT disables all flags. It additionally causes names to be |
| // printed with a 16-byte indent. |
| #define X509_FLAG_COMPAT 0 |
| |
| // X509_FLAG_NO_HEADER skips a header identifying the type of object printed. |
| #define X509_FLAG_NO_HEADER 1L |
| |
| // X509_FLAG_NO_VERSION skips printing the X.509 version number. |
| #define X509_FLAG_NO_VERSION (1L << 1) |
| |
| // X509_FLAG_NO_SERIAL skips printing the serial number. It is ignored in |
| // `X509_REQ_print_fp`. |
| #define X509_FLAG_NO_SERIAL (1L << 2) |
| |
| // X509_FLAG_NO_SIGNAME skips printing the signature algorithm in the |
| // TBSCertificate. It is ignored in `X509_REQ_print_fp`. |
| #define X509_FLAG_NO_SIGNAME (1L << 3) |
| |
| // X509_FLAG_NO_ISSUER skips printing the issuer. |
| #define X509_FLAG_NO_ISSUER (1L << 4) |
| |
| // X509_FLAG_NO_VALIDITY skips printing the notBefore and notAfter times. It is |
| // ignored in `X509_REQ_print_fp`. |
| #define X509_FLAG_NO_VALIDITY (1L << 5) |
| |
| // X509_FLAG_NO_SUBJECT skips printing the subject. |
| #define X509_FLAG_NO_SUBJECT (1L << 6) |
| |
| // X509_FLAG_NO_PUBKEY skips printing the public key. |
| #define X509_FLAG_NO_PUBKEY (1L << 7) |
| |
| // X509_FLAG_NO_EXTENSIONS skips printing the extension list. It is ignored in |
| // `X509_REQ_print_fp`. CSRs instead have attributes, which is controlled by |
| // `X509_FLAG_NO_ATTRIBUTES`. |
| #define X509_FLAG_NO_EXTENSIONS (1L << 8) |
| |
| // X509_FLAG_NO_SIGDUMP skips printing the signature and outer signature |
| // algorithm. |
| #define X509_FLAG_NO_SIGDUMP (1L << 9) |
| |
| // X509_FLAG_NO_AUX skips printing auxiliary properties. (See `d2i_X509_AUX` and |
| // related functions.) |
| #define X509_FLAG_NO_AUX (1L << 10) |
| |
| // X509_FLAG_NO_ATTRIBUTES skips printing CSR attributes. It does nothing for |
| // certificates and CRLs. |
| #define X509_FLAG_NO_ATTRIBUTES (1L << 11) |
| |
| // X509_FLAG_NO_IDS skips printing the issuerUniqueID and subjectUniqueID in a |
| // certificate. It is ignored in `X509_REQ_print_fp`. |
| #define X509_FLAG_NO_IDS (1L << 12) |
| |
| // The following flags control `X509_print_ex`, `X509_REQ_print_ex`, |
| // `X509V3_EXT_print`, and `X509V3_extensions_print`. These flags coexist with |
| // `X509_FLAG_*`, so avoid collisions when adding new ones. |
| |
| // X509V3_EXT_UNKNOWN_MASK is a mask that determines how unknown extensions are |
| // processed. |
| #define X509V3_EXT_UNKNOWN_MASK (0xfL << 16) |
| |
| // X509V3_EXT_DEFAULT causes unknown extensions or syntax errors to return |
| // failure. |
| #define X509V3_EXT_DEFAULT 0 |
| |
| // X509V3_EXT_ERROR_UNKNOWN causes unknown extensions or syntax errors to print |
| // as "<Not Supported>" or "<Parse Error>", respectively. |
| #define X509V3_EXT_ERROR_UNKNOWN (1L << 16) |
| |
| // X509V3_EXT_PARSE_UNKNOWN is deprecated and behaves like |
| // `X509V3_EXT_DUMP_UNKNOWN`. |
| #define X509V3_EXT_PARSE_UNKNOWN (2L << 16) |
| |
| // X509V3_EXT_DUMP_UNKNOWN causes unknown extensions to be displayed as a |
| // hexdump. |
| #define X509V3_EXT_DUMP_UNKNOWN (3L << 16) |
| |
| // X509_print_ex writes a human-readable representation of `x` to `bp`. It |
| // returns one on success and zero on error. `nmflags` is the flags parameter |
| // for `X509_NAME_print_ex` when printing the subject and issuer. `cflag` should |
| // be some combination of the `X509_FLAG_*` and `X509V3_EXT_*` constants. |
| OPENSSL_EXPORT int X509_print_ex(BIO *bp, const X509 *x, unsigned long nmflag, |
| unsigned long cflag); |
| |
| // X509_print_ex_fp behaves like `X509_print_ex` but writes to `fp`. |
| OPENSSL_EXPORT int X509_print_ex_fp(FILE *fp, const X509 *x, |
| unsigned long nmflag, unsigned long cflag); |
| |
| // X509_print calls `X509_print_ex` with `XN_FLAG_COMPAT` and `X509_FLAG_COMPAT` |
| // flags. |
| OPENSSL_EXPORT int X509_print(BIO *bp, const X509 *x); |
| |
| // X509_print_fp behaves like `X509_print` but writes to `fp`. |
| OPENSSL_EXPORT int X509_print_fp(FILE *fp, const X509 *x); |
| |
| // X509_CRL_print writes a human-readable representation of `x` to `bp`. It |
| // returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_CRL_print(BIO *bp, const X509_CRL *x); |
| |
| // X509_CRL_print_fp behaves like `X509_CRL_print` but writes to `fp`. |
| OPENSSL_EXPORT int X509_CRL_print_fp(FILE *fp, const X509_CRL *x); |
| |
| // X509_REQ_print_ex writes a human-readable representation of `x` to `bp`. It |
| // returns one on success and zero on error. `nmflags` is the flags parameter |
| // for `X509_NAME_print_ex`, when printing the subject. `cflag` should be some |
| // combination of the `X509_FLAG_*` and `X509V3_EXT_*` constants. |
| OPENSSL_EXPORT int X509_REQ_print_ex(BIO *bp, const X509_REQ *x, |
| unsigned long nmflag, unsigned long cflag); |
| |
| // X509_REQ_print calls `X509_REQ_print_ex` with `XN_FLAG_COMPAT` and |
| // `X509_FLAG_COMPAT` flags. |
| OPENSSL_EXPORT int X509_REQ_print(BIO *bp, const X509_REQ *req); |
| |
| // X509_REQ_print_fp behaves like `X509_REQ_print` but writes to `fp`. |
| OPENSSL_EXPORT int X509_REQ_print_fp(FILE *fp, const X509_REQ *req); |
| |
| // The following flags are control `X509_NAME_print_ex`. They must not collide |
| // with `ASN1_STRFLGS_*`. |
| // |
| // TODO(davidben): This is far, far too many options and most of them are |
| // useless. Trim this down. |
| |
| // XN_FLAG_COMPAT prints with `X509_NAME_print`'s format and return value |
| // convention. |
| #define XN_FLAG_COMPAT 0ul |
| |
| // XN_FLAG_SEP_MASK determines the separators to use between attributes. |
| #define XN_FLAG_SEP_MASK (0xful << 16) |
| |
| // XN_FLAG_SEP_COMMA_PLUS separates RDNs with "," and attributes within an RDN |
| // with "+", as in RFC 2253. |
| #define XN_FLAG_SEP_COMMA_PLUS (1ul << 16) |
| |
| // XN_FLAG_SEP_CPLUS_SPC behaves like `XN_FLAG_SEP_COMMA_PLUS` but adds spaces |
| // between the separators. |
| #define XN_FLAG_SEP_CPLUS_SPC (2ul << 16) |
| |
| // XN_FLAG_SEP_SPLUS_SPC separates RDNs with "; " and attributes within an RDN |
| // with " + ". |
| #define XN_FLAG_SEP_SPLUS_SPC (3ul << 16) |
| |
| // XN_FLAG_SEP_MULTILINE prints each attribute on one line. |
| #define XN_FLAG_SEP_MULTILINE (4ul << 16) |
| |
| // XN_FLAG_DN_REV prints RDNs in reverse, from least significant to most |
| // significant, as RFC 2253. |
| #define XN_FLAG_DN_REV (1ul << 20) |
| |
| // XN_FLAG_FN_MASK determines how attribute types are displayed. |
| #define XN_FLAG_FN_MASK (0x3ul << 21) |
| |
| // XN_FLAG_FN_SN uses the attribute type's short name, when available. |
| #define XN_FLAG_FN_SN 0ul |
| |
| // XN_FLAG_SPC_EQ wraps the "=" operator with spaces when printing attributes. |
| #define XN_FLAG_SPC_EQ (1ul << 23) |
| |
| // XN_FLAG_DUMP_UNKNOWN_FIELDS causes unknown attribute types to be printed in |
| // hex, as in RFC 2253. |
| #define XN_FLAG_DUMP_UNKNOWN_FIELDS (1ul << 24) |
| |
| // XN_FLAG_RFC2253 prints like RFC 2253. |
| #define XN_FLAG_RFC2253 \ |
| (ASN1_STRFLGS_RFC2253 | XN_FLAG_SEP_COMMA_PLUS | XN_FLAG_DN_REV | \ |
| XN_FLAG_FN_SN | XN_FLAG_DUMP_UNKNOWN_FIELDS) |
| |
| // XN_FLAG_ONELINE prints a one-line representation of the name. |
| #define XN_FLAG_ONELINE \ |
| (ASN1_STRFLGS_RFC2253 | ASN1_STRFLGS_ESC_QUOTE | XN_FLAG_SEP_CPLUS_SPC | \ |
| XN_FLAG_SPC_EQ | XN_FLAG_FN_SN) |
| |
| // X509_NAME_print_ex writes a human-readable representation of `nm` to `out`. |
| // Each line of output is indented by `indent` spaces. It returns the number of |
| // bytes written on success, and -1 on error. If `out` is NULL, it returns the |
| // number of bytes it would have written but does not write anything. `flags` |
| // should be some combination of `XN_FLAG_*` and `ASN1_STRFLGS_*` values and |
| // determines the output. If unsure, use `XN_FLAG_RFC2253`. |
| // |
| // If `flags` is `XN_FLAG_COMPAT`, or zero, this function calls |
| // `X509_NAME_print` instead. In that case, it returns one on success, rather |
| // than the output length. |
| OPENSSL_EXPORT int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent, |
| unsigned long flags); |
| |
| // X509_NAME_print prints a human-readable representation of `name` to `bp`. It |
| // returns one on success and zero on error. `obase` is ignored. |
| // |
| // This function outputs a legacy format that does not correctly handle string |
| // encodings and other cases. Prefer `X509_NAME_print_ex` if printing a name for |
| // debugging purposes. |
| OPENSSL_EXPORT int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase); |
| |
| // X509_NAME_oneline writes a human-readable representation to `name` to a |
| // buffer as a NUL-terminated C string. |
| // |
| // If `buf` is NULL, returns a newly-allocated buffer containing the result on |
| // success, or NULL on error. The buffer must be released with `OPENSSL_free` |
| // when done. |
| // |
| // If `buf` is non-NULL, at most `size` bytes of output are written to `buf` |
| // instead. `size` includes the trailing NUL. The function then returns `buf` on |
| // success or NULL on error. If the output does not fit in `size` bytes, the |
| // output is silently truncated at an attribute boundary. |
| // |
| // This function outputs a legacy format that does not correctly handle string |
| // encodings and other cases. Prefer `X509_NAME_print_ex` if printing a name for |
| // debugging purposes. |
| OPENSSL_EXPORT char *X509_NAME_oneline(const X509_NAME *name, char *buf, |
| int size); |
| |
| // X509_NAME_print_ex_fp behaves like `X509_NAME_print_ex` but writes to `fp`. |
| OPENSSL_EXPORT int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, |
| int indent, unsigned long flags); |
| |
| // X509_signature_dump writes a human-readable representation of `sig` to `bio`, |
| // indented with `indent` spaces. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_signature_dump(BIO *bio, const ASN1_STRING *sig, |
| int indent); |
| |
| // X509_signature_print writes a human-readable representation of `alg` and |
| // `sig` to `bio`. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_signature_print(BIO *bio, const X509_ALGOR *alg, |
| const ASN1_STRING *sig); |
| |
| // X509V3_EXT_print prints a human-readable representation of `ext` to out. It |
| // returns one on success and zero on error. The output is indented by `indent` |
| // spaces. `flag` is one of the `X509V3_EXT_*` constants and controls printing |
| // of unknown extensions and syntax errors. |
| // |
| // WARNING: Although some applications programmatically parse the output of this |
| // function to process X.509 extensions, this is not safe. In many cases, the |
| // outputs are ambiguous to attempting to parse them can lead to string |
| // injection vulnerabilities. These functions should only be used for debugging |
| // or logging. |
| OPENSSL_EXPORT int X509V3_EXT_print(BIO *out, const X509_EXTENSION *ext, |
| unsigned long flag, int indent); |
| |
| // X509V3_EXT_print_fp behaves like `X509V3_EXT_print` but writes to a `FILE` |
| // instead of a `BIO`. |
| OPENSSL_EXPORT int X509V3_EXT_print_fp(FILE *out, const X509_EXTENSION *ext, |
| int flag, int indent); |
| |
| // X509V3_extensions_print prints `title`, followed by a human-readable |
| // representation of `exts` to `out`. It returns one on success and zero on |
| // error. The output is indented by `indent` spaces. `flag` is one of the |
| // `X509V3_EXT_*` constants and controls printing of unknown extensions and |
| // syntax errors. |
| OPENSSL_EXPORT int X509V3_extensions_print(BIO *out, const char *title, |
| const STACK_OF(X509_EXTENSION) *exts, |
| unsigned long flag, int indent); |
| |
| // GENERAL_NAME_print prints a human-readable representation of `gen` to `out`. |
| // It returns one on success and zero on error. |
| // |
| // TODO(davidben): Actually, it just returns one and doesn't check for I/O or |
| // allocation errors. But it should return zero on error. |
| OPENSSL_EXPORT int GENERAL_NAME_print(BIO *out, const GENERAL_NAME *gen); |
| |
| |
| // Convenience functions. |
| |
| // X509_pubkey_digest hashes the contents of the BIT STRING in `x509`'s |
| // subjectPublicKeyInfo field with `md` and writes the result to `out`. |
| // `EVP_MD_CTX_size` bytes are written, which is at most `EVP_MAX_MD_SIZE`. If |
| // `out_len` is not NULL, `*out_len` is set to the number of bytes written. This |
| // function returns one on success and zero on error. |
| // |
| // This hash omits the BIT STRING tag, length, and number of unused bits. It |
| // also omits the AlgorithmIdentifier which describes the key type. It |
| // corresponds to the OCSP KeyHash definition and is not suitable for other |
| // purposes. |
| OPENSSL_EXPORT int X509_pubkey_digest(const X509 *x509, const EVP_MD *md, |
| uint8_t *out, unsigned *out_len); |
| |
| // X509_digest hashes `x509`'s DER encoding with `md` and writes the result to |
| // `out`. `EVP_MD_CTX_size` bytes are written, which is at most |
| // `EVP_MAX_MD_SIZE`. If `out_len` is not NULL, `*out_len` is set to the number |
| // of bytes written. This function returns one on success and zero on error. |
| // Note this digest covers the entire certificate, not just the signed portion. |
| OPENSSL_EXPORT int X509_digest(const X509 *x509, const EVP_MD *md, uint8_t *out, |
| unsigned *out_len); |
| |
| // X509_CRL_digest hashes `crl`'s DER encoding with `md` and writes the result |
| // to `out`. `EVP_MD_CTX_size` bytes are written, which is at most |
| // `EVP_MAX_MD_SIZE`. If `out_len` is not NULL, `*out_len` is set to the number |
| // of bytes written. This function returns one on success and zero on error. |
| // Note this digest covers the entire CRL, not just the signed portion. |
| OPENSSL_EXPORT int X509_CRL_digest(const X509_CRL *crl, const EVP_MD *md, |
| uint8_t *out, unsigned *out_len); |
| |
| // X509_REQ_digest hashes `req`'s DER encoding with `md` and writes the result |
| // to `out`. `EVP_MD_CTX_size` bytes are written, which is at most |
| // `EVP_MAX_MD_SIZE`. If `out_len` is not NULL, `*out_len` is set to the number |
| // of bytes written. This function returns one on success and zero on error. |
| // Note this digest covers the entire certificate request, not just the signed |
| // portion. |
| OPENSSL_EXPORT int X509_REQ_digest(const X509_REQ *req, const EVP_MD *md, |
| uint8_t *out, unsigned *out_len); |
| |
| // X509_NAME_digest hashes `name`'s DER encoding with `md` and writes the result |
| // to `out`. `EVP_MD_CTX_size` bytes are written, which is at most |
| // `EVP_MAX_MD_SIZE`. If `out_len` is not NULL, `*out_len` is set to the number |
| // of bytes written. This function returns one on success and zero on error. |
| OPENSSL_EXPORT int X509_NAME_digest(const X509_NAME *name, const EVP_MD *md, |
| uint8_t *out, unsigned *out_len); |
| |
| // The following functions behave like the corresponding unsuffixed `d2i_*` |
| // functions, but read the result from `bp` instead. Callers using these |
| // functions with memory `BIO`s to parse structures already in memory should use |
| // `d2i_*` instead. |
| OPENSSL_EXPORT X509 *d2i_X509_bio(BIO *bp, X509 **x509); |
| OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl); |
| OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req); |
| OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa); |
| OPENSSL_EXPORT RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa); |
| OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa); |
| OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa); |
| OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa); |
| OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey); |
| OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey); |
| OPENSSL_EXPORT X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8); |
| OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio( |
| BIO *bp, PKCS8_PRIV_KEY_INFO **p8inf); |
| OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a); |
| OPENSSL_EXPORT DH *d2i_DHparams_bio(BIO *bp, DH **dh); |
| |
| // d2i_PrivateKey_bio behaves like `d2i_AutoPrivateKey`, but reads from `bp` |
| // instead. |
| OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a); |
| |
| // The following functions behave like the corresponding unsuffixed `i2d_*` |
| // functions, but write the result to `bp`. They return one on success and zero |
| // on error. Callers using them with memory `BIO`s to encode structures to |
| // memory should use `i2d_*` directly instead. |
| OPENSSL_EXPORT int i2d_X509_bio(BIO *bp, const X509 *x509); |
| OPENSSL_EXPORT int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl); |
| OPENSSL_EXPORT int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req); |
| OPENSSL_EXPORT int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa); |
| OPENSSL_EXPORT int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa); |
| OPENSSL_EXPORT int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa); |
| OPENSSL_EXPORT int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa); |
| OPENSSL_EXPORT int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa); |
| OPENSSL_EXPORT int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *eckey); |
| OPENSSL_EXPORT int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey); |
| OPENSSL_EXPORT int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8); |
| OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_bio( |
| BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf); |
| OPENSSL_EXPORT int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey); |
| OPENSSL_EXPORT int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey); |
| OPENSSL_EXPORT int i2d_DHparams_bio(BIO *bp, const DH *dh); |
| |
| // i2d_PKCS8PrivateKeyInfo_bio encodes `key` as a PKCS#8 PrivateKeyInfo |
| // structure (see `EVP_marshal_private_key`) and writes the result to `bp`. It |
| // returns one on success and zero on error. |
| OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key); |
| |
| // The following functions behave like the corresponding `d2i_*_bio` functions, |
| // but read from `fp` instead. |
| OPENSSL_EXPORT X509 *d2i_X509_fp(FILE *fp, X509 **x509); |
| OPENSSL_EXPORT X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); |
| OPENSSL_EXPORT X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req); |
| OPENSSL_EXPORT RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa); |
| OPENSSL_EXPORT RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa); |
| OPENSSL_EXPORT RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa); |
| OPENSSL_EXPORT DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa); |
| OPENSSL_EXPORT DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa); |
| OPENSSL_EXPORT EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey); |
| OPENSSL_EXPORT EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey); |
| OPENSSL_EXPORT X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8); |
| OPENSSL_EXPORT PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp( |
| FILE *fp, PKCS8_PRIV_KEY_INFO **p8inf); |
| OPENSSL_EXPORT EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a); |
| OPENSSL_EXPORT EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a); |
| |
| // The following functions behave like the corresponding `i2d_*_bio` functions, |
| // but write to `fp` instead. |
| OPENSSL_EXPORT int i2d_X509_fp(FILE *fp, const X509 *x509); |
| OPENSSL_EXPORT int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl); |
| OPENSSL_EXPORT int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req); |
| OPENSSL_EXPORT int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa); |
| OPENSSL_EXPORT int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa); |
| OPENSSL_EXPORT int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa); |
| OPENSSL_EXPORT int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa); |
| OPENSSL_EXPORT int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa); |
| OPENSSL_EXPORT int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey); |
| OPENSSL_EXPORT int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey); |
| OPENSSL_EXPORT int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8); |
| OPENSSL_EXPORT int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, |
| const PKCS8_PRIV_KEY_INFO *p8inf); |
| OPENSSL_EXPORT int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key); |
| OPENSSL_EXPORT int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey); |
| OPENSSL_EXPORT int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey); |
| |
| // X509_find_by_issuer_and_serial returns the first `X509` in `sk` whose issuer |
| // and serial are `name` and `serial`, respectively. If no match is found, it |
| // returns NULL. |
| OPENSSL_EXPORT X509 *X509_find_by_issuer_and_serial(const STACK_OF(X509) *sk, |
| const X509_NAME *name, |
| const ASN1_INTEGER *serial); |
| |
| // X509_find_by_subject returns the first `X509` in `sk` whose subject is |
| // `name`. If no match is found, it returns NULL. |
| OPENSSL_EXPORT X509 *X509_find_by_subject(const STACK_OF(X509) *sk, |
| const X509_NAME *name); |
| |
| // X509_cmp_time compares `s` against `*t`. On success, it returns a negative |
| // number if `s` <= `*t` and a positive number if `s` > `*t`. On error, it |
| // returns zero. If `t` is NULL, it uses the current time instead of `*t`. |
| // |
| // WARNING: Unlike most comparison functions, this function returns zero on |
| // error, not equality. |
| OPENSSL_EXPORT int X509_cmp_time(const ASN1_TIME *s, const time_t *t); |
| |
| // X509_cmp_time_posix compares `s` against `t`. On success, it returns a |
| // negative number if `s` <= `t` and a positive number if `s` > `t`. On error, |
| // it returns zero. |
| // |
| // WARNING: Unlike most comparison functions, this function returns zero on |
| // error, not equality. |
| OPENSSL_EXPORT int X509_cmp_time_posix(const ASN1_TIME *s, int64_t t); |
| |
| // X509_cmp_current_time behaves like `X509_cmp_time` but compares `s` against |
| // the current time. |
| OPENSSL_EXPORT int X509_cmp_current_time(const ASN1_TIME *s); |
| |
| // X509_time_adj calls `X509_time_adj_ex` with `offset_day` equal to zero. |
| OPENSSL_EXPORT ASN1_TIME *X509_time_adj(ASN1_TIME *s, long offset_sec, |
| const time_t *t); |
| |
| // X509_time_adj_ex behaves like `ASN1_TIME_adj`, but adds an offset to `*t`. If |
| // `t` is NULL, it uses the current time instead of `*t`. |
| OPENSSL_EXPORT ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s, int offset_day, |
| long offset_sec, const time_t *t); |
| |
| // X509_gmtime_adj behaves like `X509_time_adj_ex` but adds `offset_sec` to the |
| // current time. |
| OPENSSL_EXPORT ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long offset_sec); |
| |
| // X509_issuer_name_cmp behaves like `X509_NAME_cmp`, but compares `a` and `b`'s |
| // issuer names. |
| OPENSSL_EXPORT int X509_issuer_name_cmp(const X509 *a, const X509 *b); |
| |
| // X509_subject_name_cmp behaves like `X509_NAME_cmp`, but compares `a` and |
| // `b`'s subject names. |
| OPENSSL_EXPORT int X509_subject_name_cmp(const X509 *a, const X509 *b); |
| |
| // X509_CRL_cmp behaves like `X509_NAME_cmp`, but compares `a` and `b`'s |
| // issuer names. |
| // |
| // WARNING: This function is misnamed. It does not compare other parts of the |
| // CRL, only the issuer fields using `X509_NAME_cmp`. |
| OPENSSL_EXPORT int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b); |
| |
| // X509_issuer_name_hash returns the hash of `x509`'s issuer name with |
| // `X509_NAME_hash`. |
| // |
| // This hash is specific to the `X509_LOOKUP_add_dir` filesystem format and is |
| // not suitable for general-purpose X.509 name processing. It is very short, so |
| // there will be hash collisions. It also depends on an OpenSSL-specific |
| // canonicalization process. |
| OPENSSL_EXPORT uint32_t X509_issuer_name_hash(const X509 *x509); |
| |
| // X509_subject_name_hash returns the hash of `x509`'s subject name with |
| // `X509_NAME_hash`. |
| // |
| // This hash is specific to the `X509_LOOKUP_add_dir` filesystem format and is |
| // not suitable for general-purpose X.509 name processing. It is very short, so |
| // there will be hash collisions. It also depends on an OpenSSL-specific |
| // canonicalization process. |
| OPENSSL_EXPORT uint32_t X509_subject_name_hash(const X509 *x509); |
| |
| // X509_issuer_name_hash_old returns the hash of `x509`'s issuer name with |
| // `X509_NAME_hash_old`. |
| // |
| // This hash is specific to the `X509_LOOKUP_add_dir` filesystem format and is |
| // not suitable for general-purpose X.509 name processing. It is very short, so |
| // there will be hash collisions. |
| OPENSSL_EXPORT uint32_t X509_issuer_name_hash_old(const X509 *x509); |
| |
| // X509_subject_name_hash_old returns the hash of `x509`'s usjbect name with |
| // `X509_NAME_hash_old`. |
| // |
| // This hash is specific to the `X509_LOOKUP_add_dir` filesystem format and is |
| // not suitable for general-purpose X.509 name processing. It is very short, so |
| // there will be hash collisions. |
| OPENSSL_EXPORT uint32_t X509_subject_name_hash_old(const X509 *x509); |
| |
| |
| // ex_data functions. |
| // |
| // See `ex_data.h` for details. |
| |
| OPENSSL_EXPORT int X509_get_ex_new_index(long argl, void *argp, |
| CRYPTO_EX_unused *unused, |
| CRYPTO_EX_dup *dup_unused, |
| CRYPTO_EX_free *free_func); |
| OPENSSL_EXPORT int X509_set_ex_data(X509 *r, int idx, void *arg); |
| OPENSSL_EXPORT void *X509_get_ex_data(X509 *r, int idx); |
| |
| OPENSSL_EXPORT int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, |
| CRYPTO_EX_unused *unused, |
| CRYPTO_EX_dup *dup_unused, |
| CRYPTO_EX_free *free_func); |
| OPENSSL_EXPORT int X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx, int idx, |
| void *data); |
| OPENSSL_EXPORT void *X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx, int idx); |
| |
| #define X509_STORE_CTX_set_app_data(ctx, data) \ |
| X509_STORE_CTX_set_ex_data(ctx, 0, data) |
| #define X509_STORE_CTX_get_app_data(ctx) X509_STORE_CTX_get_ex_data(ctx, 0) |
| |
| |
| // Hashing and signing ASN.1 structures. |
| |
| // ASN1_digest serializes `data` with `i2d` and then hashes the result with |
| // `type`. On success, it returns one, writes the digest to `md`, and sets |
| // `*len` to the digest length if non-NULL. On error, it returns zero. |
| // |
| // `EVP_MD_CTX_size` bytes are written, which is at most `EVP_MAX_MD_SIZE`. The |
| // buffer must have sufficient space for this output. |
| OPENSSL_EXPORT int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, |
| unsigned char *md, unsigned int *len); |
| |
| // ASN1_item_digest serializes `data` with `it` and then hashes the result with |
| // `type`. On success, it returns one, writes the digest to `md`, and sets |
| // `*len` to the digest length if non-NULL. On error, it returns zero. |
| // |
| // `EVP_MD_CTX_size` bytes are written, which is at most `EVP_MAX_MD_SIZE`. The |
| // buffer must have sufficient space for this output. |
| // |
| // WARNING: `data` must be a pointer with the same type as `it`'s corresponding |
| // C type. Using the wrong type is a potentially exploitable memory error. |
| OPENSSL_EXPORT int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, |
| void *data, unsigned char *md, |
| unsigned int *len); |
| |
| // ASN1_item_verify serializes `data` with `it` and then verifies `signature` is |
| // a valid signature for the result with `algor1` and `pkey`. It returns one on |
| // success and zero on error. The signature and algorithm are interpreted as in |
| // X.509. |
| // |
| // WARNING: `data` must be a pointer with the same type as `it`'s corresponding |
| // C type. Using the wrong type is a potentially exploitable memory error. |
| OPENSSL_EXPORT int ASN1_item_verify(const ASN1_ITEM *it, |
| const X509_ALGOR *algor1, |
| const ASN1_BIT_STRING *signature, |
| void *data, EVP_PKEY *pkey); |
| |
| // ASN1_item_sign serializes `data` with `it` and then signs the result with |
| // the private key `pkey`. It returns the length of the signature on success and |
| // zero on error. On success, it writes the signature to `signature` and the |
| // signature algorithm to each of `algor1` and `algor2`. Either of `algor1` or |
| // `algor2` may be NULL to ignore them. This function uses digest algorithm |
| // `md`, or `pkey`'s default if NULL. Other signing parameters use `pkey`'s |
| // defaults. To customize them, use `ASN1_item_sign_ctx`. |
| // |
| // `algor1` and `algor2` may point into part of `asn` and will be updated before |
| // `asn` is serialized. |
| // |
| // WARNING: `data` must be a pointer with the same type as `it`'s corresponding |
| // C type. Using the wrong type is a potentially exploitable memory error. |
| OPENSSL_EXPORT int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, |
| X509_ALGOR *algor2, |
| ASN1_BIT_STRING *signature, void *data, |
| EVP_PKEY *pkey, const EVP_MD *type); |
| |
| // ASN1_item_sign_ctx behaves like `ASN1_item_sign` except the signature is |
| // signed with `ctx`, `ctx`, which must have been initialized with |
| // `EVP_DigestSignInit`. The caller should configure the corresponding |
| // `EVP_PKEY_CTX` with any additional parameters before calling this function. |
| // |
| // On success or failure, this function mutates `ctx` and resets it to the empty |
| // state. Caller should not rely on its contents after the function returns. |
| // |
| // `algor1` and `algor2` may point into part of `asn` and will be updated before |
| // `asn` is serialized. |
| // |
| // WARNING: `data` must be a pointer with the same type as `it`'s corresponding |
| // C type. Using the wrong type is a potentially exploitable memory error. |
| OPENSSL_EXPORT int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1, |
| X509_ALGOR *algor2, |
| ASN1_BIT_STRING *signature, void *asn, |
| EVP_MD_CTX *ctx); |
| |
| |
| // Verification internals. |
| // |
| // The following functions expose portions of certificate validation. They are |
| // exported for compatibility with existing callers, or to support some obscure |
| // use cases. Most callers, however, will not need these functions and should |
| // instead use `X509_STORE_CTX` APIs. |
| |
| // X509_supported_extension returns one if `ex` is a critical X.509 certificate |
| // extension, supported by `X509_verify_cert`, and zero otherwise. |
| // |
| // Note this function only reports certificate extensions (as opposed to CRL or |
| // CRL extensions), and only extensions that are expected to be marked critical. |
| // Additionally, `X509_verify_cert` checks for unsupported critical extensions |
| // internally, so most callers will not need to call this function separately. |
| OPENSSL_EXPORT int X509_supported_extension(const X509_EXTENSION *ex); |
| |
| // X509_check_ca returns one if `x509` may be considered a CA certificate, |
| // according to basic constraints and key usage extensions. Otherwise, it |
| // returns zero. If `x509` is an X509v1 certificate, and thus has no extensions, |
| // it is considered eligible. |
| // |
| // This function returning one does not indicate that `x509` is trusted, only |
| // that it is eligible to be a CA. |
| OPENSSL_EXPORT int X509_check_ca(const X509 *x509); |
| |
| // X509_check_issued checks if `issuer` and `subject`'s name, authority key |
| // identifier, and key usage fields allow `issuer` to have issued `subject`. It |
| // returns `X509_V_OK` on success and an `X509_V_ERR_*` value otherwise. |
| // |
| // This function does not check the signature on `subject`. Rather, it is |
| // intended to prune the set of possible issuer certificates during |
| // path-building. |
| OPENSSL_EXPORT int X509_check_issued(const X509 *issuer, const X509 *subject); |
| |
| // NAME_CONSTRAINTS_check checks if `x509` satisfies name constraints in `nc`. |
| // It returns `X509_V_OK` on success and some `X509_V_ERR_*` constant on error. |
| OPENSSL_EXPORT int NAME_CONSTRAINTS_check(const X509 *x509, |
| const NAME_CONSTRAINTS *nc); |
| |
| // X509_check_host checks if `x509` matches the DNS name `chk`. It returns one |
| // on match, zero on mismatch, or a negative number on error. `flags` should be |
| // some combination of `X509_CHECK_FLAG_*` and modifies the behavior. On match, |
| // if `out_peername` is non-NULL, it additionally sets `*out_peername` to a |
| // newly-allocated, NUL-terminated string containing the DNS name or wildcard in |
| // the certificate which matched. The caller must then free `*out_peername` with |
| // `OPENSSL_free` when done. |
| // |
| // By default, both subject alternative names and the subject's common name |
| // attribute are checked. The latter has long been deprecated, so callers should |
| // include `X509_CHECK_FLAG_NEVER_CHECK_SUBJECT` in `flags` to use the standard |
| // behavior. https://crbug.com/boringssl/464 tracks fixing the default. |
| // |
| // This function does not check if `x509` is a trusted certificate, only if, |
| // were it trusted, it would match `chk`. |
| // |
| // WARNING: This function differs from the usual calling convention and may |
| // return either 0 or a negative number on error. |
| // |
| // TODO(davidben): Make the error case also return zero. |
| OPENSSL_EXPORT int X509_check_host(const X509 *x509, const char *chk, |
| size_t chklen, unsigned int flags, |
| char **out_peername); |
| |
| // X509_check_email checks if `x509` matches the email address `chk`. It returns |
| // one on match, zero on mismatch, or a negative number on error. `flags` should |
| // be some combination of `X509_CHECK_FLAG_*` and modifies the behavior. |
| // |
| // By default, both subject alternative names and the subject's email address |
| // attribute are checked. The `X509_CHECK_FLAG_NEVER_CHECK_SUBJECT` flag may be |
| // used to change this behavior. |
| // |
| // This function does not check if `x509` is a trusted certificate, only if, |
| // were it trusted, it would match `chk`. |
| // |
| // WARNING: This function differs from the usual calling convention and may |
| // return either 0 or a negative number on error. |
| // |
| // TODO(davidben): Make the error case also return zero. |
| OPENSSL_EXPORT int X509_check_email(const X509 *x509, const char *chk, |
| size_t chklen, unsigned int flags); |
| |
| // X509_check_ip checks if `x509` matches the IP address `chk`. The IP address |
| // is represented in byte form and should be 4 bytes for an IPv4 address and 16 |
| // bytes for an IPv6 address. It returns one on match, zero on mismatch, or a |
| // negative number on error. `flags` should be some combination of |
| // `X509_CHECK_FLAG_*` and modifies the behavior. |
| // |
| // This function does not check if `x509` is a trusted certificate, only if, |
| // were it trusted, it would match `chk`. |
| // |
| // WARNING: This function differs from the usual calling convention and may |
| // return either 0 or a negative number on error. |
| // |
| // TODO(davidben): Make the error case also return zero. |
| OPENSSL_EXPORT int X509_check_ip(const X509 *x509, const uint8_t *chk, |
| size_t chklen, unsigned int flags); |
| |
| // X509_check_ip_asc behaves like `X509_check_ip` except the IP address is |
| // specified in textual form in `ipasc`. |
| // |
| // WARNING: This function differs from the usual calling convention and may |
| // return either 0 or a negative number on error. |
| // |
| // TODO(davidben): Make the error case also return zero. |
| OPENSSL_EXPORT int X509_check_ip_asc(const X509 *x509, const char *ipasc, |
| unsigned int flags); |
| |
| // X509_STORE_CTX_get1_issuer looks up a candidate trusted issuer for `x509` out |
| // of `ctx`'s `X509_STORE`, based on the criteria in `X509_check_issued`. If one |
| // was found, it returns one and sets `*out_issuer` to the issuer. The caller |
| // must release `*out_issuer` with `X509_free` when done. If none was found, it |
| // returns zero and leaves `*out_issuer` unchanged. |
| // |
| // This function only searches for trusted issuers. It does not consider |
| // untrusted intermediates passed in to `X509_STORE_CTX_init`. |
| OPENSSL_EXPORT int X509_STORE_CTX_get1_issuer(X509 **out_issuer, |
| X509_STORE_CTX *ctx, |
| const X509 *x509); |
| |
| // X509_check_purpose performs checks if `x509`'s basic constraints, key usage, |
| // and extended key usage extensions for the specified purpose. `purpose` should |
| // be one of `X509_PURPOSE_*` constants. See `X509_VERIFY_PARAM_set_purpose` for |
| // details. It returns one if `x509`'s extensions are consistent with `purpose` |
| // and zero otherwise. If `ca` is non-zero, `x509` is checked as a CA |
| // certificate. Otherwise, it is checked as an end-entity certificate. |
| // |
| // If `purpose` is -1, this function performs no purpose checks, but it parses |
| // some extensions in `x509` and may return zero on syntax error. Historically, |
| // callers primarily used this function to trigger this parsing, but this is no |
| // longer necessary. Functions acting on `X509` will internally parse as needed. |
| OPENSSL_EXPORT int X509_check_purpose(X509 *x509, int purpose, int ca); |
| |
| #define X509_TRUST_TRUSTED 1 |
| #define X509_TRUST_REJECTED 2 |
| #define X509_TRUST_UNTRUSTED 3 |
| |
| // X509_check_trust checks if `x509` is a valid trust anchor for trust type |
| // `id`. See `X509_VERIFY_PARAM_set_trust` for details. It returns |
| // `X509_TRUST_TRUSTED` if `x509` is a trust anchor, `X509_TRUST_REJECTED` if it |
| // was distrusted, and `X509_TRUST_UNTRUSTED` otherwise. `id` should be one of |
| // the `X509_TRUST_*` constants, or zero to indicate the default behavior. |
| // `flags` should be zero and is ignored. |
| OPENSSL_EXPORT int X509_check_trust(X509 *x509, int id, int flags); |
| |
| // X509_STORE_CTX_get1_certs returns a newly-allocated stack containing all |
| // trusted certificates in `ctx`'s `X509_STORE` whose subject matches `name`, or |
| // NULL on error. The caller must release the result with `sk_X509_pop_free` and |
| // `X509_free` when done. |
| OPENSSL_EXPORT STACK_OF(X509) *X509_STORE_CTX_get1_certs(X509_STORE_CTX *ctx, |
| const X509_NAME *name); |
| |
| // X509_STORE_CTX_get1_crls returns a newly-allocated stack containing all |
| // CRLs in `ctx`'s `X509_STORE` whose subject matches `name`, or NULL on error. |
| // The caller must release the result with `sk_X509_CRL_pop_free` and |
| // `X509_CRL_free` when done. |
| OPENSSL_EXPORT STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls( |
| X509_STORE_CTX *ctx, const X509_NAME *name); |
| |
| // X509_STORE_CTX_get_by_subject looks up an object of type `type` in `ctx`'s |
| // `X509_STORE` that matches `name`. `type` should be one of the `X509_LU_*` |
| // constants to indicate the type of object. If a match was found, it stores the |
| // result in `ret` and returns one. Otherwise, it returns zero. If multiple |
| // objects match, this function outputs an arbitrary one. |
| // |
| // WARNING: `ret` must be in the empty state, as returned by `X509_OBJECT_new`. |
| // Otherwise, the object currently in `ret` will be leaked when overwritten. |
| // https://crbug.com/boringssl/685 tracks fixing this. |
| // |
| // WARNING: Multiple trusted certificates or CRLs may share a name. In this |
| // case, this function returns an arbitrary match. Use |
| // `X509_STORE_CTX_get1_certs` or `X509_STORE_CTX_get1_crls` instead. |
| OPENSSL_EXPORT int X509_STORE_CTX_get_by_subject(X509_STORE_CTX *ctx, int type, |
| const X509_NAME *name, |
| X509_OBJECT *ret); |
| |
| |
| // X.509 information. |
| // |
| // `X509_INFO` is the return type for `PEM_X509_INFO_read_bio`, defined in |
| // <openssl/pem.h>. It is used to store a certificate, CRL, or private key. This |
| // type is defined in this header for OpenSSL compatibility. |
| |
| struct private_key_st { |
| EVP_PKEY *dec_pkey; |
| } /* X509_PKEY */; |
| |
| struct X509_info_st { |
| X509 *x509; |
| X509_CRL *crl; |
| X509_PKEY *x_pkey; |
| |
| EVP_CIPHER_INFO enc_cipher; |
| int enc_len; |
| char *enc_data; |
| } /* X509_INFO */; |
| |
| DEFINE_STACK_OF(X509_INFO) |
| |
| // X509_INFO_free releases memory associated with `info`. |
| OPENSSL_EXPORT void X509_INFO_free(X509_INFO *info); |
| |
| |
| // Deprecated custom extension registration. |
| // |
| // The following functions allow callers to register custom extensions for use |
| // with `X509V3_EXT_d2i` and related functions. This mechanism is deprecated and |
| // will be removed in the future. As discussed in `X509V3_EXT_add`, it is not |
| // possible to safely register a custom extension without risking race |
| // conditions and memory errors when linked with other users of BoringSSL. |
| // |
| // Moreover, it is not necessary to register a custom extension to process |
| // extensions unknown to BoringSSL. Registration does not impact certificate |
| // verification. Caller should instead use functions such as |
| // `ASN1_OBJECT_create`, `X509_get_ext_by_OBJ`, `X509_EXTENSION_get_data`, and |
| // `X509_EXTENSION_create_by_OBJ` to inspect or create extensions directly. |
| |
| // The following function pointer types are used in `X509V3_EXT_METHOD`. |
| typedef void *(*X509V3_EXT_NEW)(void); |
| typedef void (*X509V3_EXT_FREE)(void *ext); |
| typedef void *(*X509V3_EXT_D2I)(void *ext, const uint8_t **inp, long len); |
| typedef int (*X509V3_EXT_I2D)(void *ext, uint8_t **outp); |
| typedef STACK_OF(CONF_VALUE) *(*X509V3_EXT_I2V)(const X509V3_EXT_METHOD *method, |
| void *ext, |
| STACK_OF(CONF_VALUE) *extlist); |
| typedef void *(*X509V3_EXT_V2I)(const X509V3_EXT_METHOD *method, |
| const X509V3_CTX *ctx, |
| const STACK_OF(CONF_VALUE) *values); |
| typedef char *(*X509V3_EXT_I2S)(const X509V3_EXT_METHOD *method, void *ext); |
| typedef void *(*X509V3_EXT_S2I)(const X509V3_EXT_METHOD *method, |
| const X509V3_CTX *ctx, const char *str); |
| typedef int (*X509V3_EXT_I2R)(const X509V3_EXT_METHOD *method, void *ext, |
| BIO *out, int indent); |
| typedef void *(*X509V3_EXT_R2I)(const X509V3_EXT_METHOD *method, |
| const X509V3_CTX *ctx, const char *str); |
| |
| // A v3_ext_method, aka `X509V3_EXT_METHOD`, is a deprecated type which defines |
| // a custom extension. |
| struct v3_ext_method { |
| // ext_nid is the NID of the extension. |
| int ext_nid; |
| |
| // ext_flags is a combination of `X509V3_EXT_*` constants. |
| int ext_flags; |
| |
| // it determines how values of this extension are allocated, released, parsed, |
| // and marshalled. This must be non-NULL. |
| ASN1_ITEM_EXP *it; |
| |
| // The following functions are ignored in favor of `it`. They are retained in |
| // the struct only for source compatibility with existing struct definitions. |
| X509V3_EXT_NEW ext_new; |
| X509V3_EXT_FREE ext_free; |
| X509V3_EXT_D2I d2i; |
| X509V3_EXT_I2D i2d; |
| |
| // The following functions are used for string extensions. |
| X509V3_EXT_I2S i2s; |
| X509V3_EXT_S2I s2i; |
| |
| // The following functions are used for multi-valued extensions. |
| X509V3_EXT_I2V i2v; |
| X509V3_EXT_V2I v2i; |
| |
| // The following functions are used for "raw" extensions, which implement |
| // custom printing behavior. |
| X509V3_EXT_I2R i2r; |
| X509V3_EXT_R2I r2i; |
| |
| void *usr_data; // Any extension specific data |
| } /* X509V3_EXT_METHOD */; |
| |
| // X509V3_EXT_MULTILINE causes the result of an `X509V3_EXT_METHOD`'s `i2v` |
| // function to be printed on separate lines, rather than separated by commas. |
| #define X509V3_EXT_MULTILINE 0x4 |
| |
| // X509V3_EXT_get returns the `X509V3_EXT_METHOD` corresponding to `ext`'s |
| // extension type, or NULL if none was registered. |
| OPENSSL_EXPORT const X509V3_EXT_METHOD *X509V3_EXT_get( |
| const X509_EXTENSION *ext); |
| |
| // X509V3_EXT_get_nid returns the `X509V3_EXT_METHOD` corresponding to `nid`, or |
| // NULL if none was registered. |
| OPENSSL_EXPORT const X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid); |
| |
| // X509V3_EXT_add registers `ext` as a custom extension for the extension type |
| // `ext->ext_nid`. `ext` must be valid for the remainder of the address space's |
| // lifetime. It returns one on success and zero on error. |
| // |
| // WARNING: This function modifies global state. If other code in the same |
| // address space also registers an extension with type `ext->ext_nid`, the two |
| // registrations will conflict. Which registration takes effect is undefined. If |
| // the two registrations use incompatible in-memory representations, code |
| // expecting the other registration will then cast a type to the wrong type, |
| // resulting in a potentially exploitable memory error. This conflict can also |
| // occur if BoringSSL later adds support for `ext->ext_nid`, with a different |
| // in-memory representation than the one expected by `ext`. |
| // |
| // This function, additionally, is not thread-safe and cannot be called |
| // concurrently with any other BoringSSL function. |
| // |
| // As a result, it is impossible to safely use this function. Registering a |
| // custom extension has no impact on certificate verification so, instead, |
| // callers should simply handle the custom extension with the byte-based |
| // `X509_EXTENSION` APIs directly. Registering `ext` with the library has little |
| // practical value. |
| OPENSSL_EXPORT OPENSSL_DEPRECATED int X509V3_EXT_add(X509V3_EXT_METHOD *ext); |
| |
| // X509V3_EXT_add_alias registers a custom extension with NID `nid_to`. The |
| // corresponding ASN.1 type is copied from `nid_from`. It returns one on success |
| // and zero on error. |
| // |
| // WARNING: Do not use this function. See `X509V3_EXT_add`. |
| OPENSSL_EXPORT OPENSSL_DEPRECATED int X509V3_EXT_add_alias(int nid_to, |
| int nid_from); |
| |
| |
| // Deprecated config-based extension creation. |
| // |
| // The following functions allow specifying X.509 extensions using OpenSSL's |
| // config file syntax, from the OpenSSL command-line tool. They are retained, |
| // for now, for compatibility with legacy software but may be removed in the |
| // future. Construct the extensions using the typed C APIs instead. |
| // |
| // Callers should especially avoid these functions if passing in non-constant |
| // values. They use ad-hoc, string-based formats which are prone to injection |
| // vulnerabilities. For a CA, this means using them risks misissuance. |
| // |
| // These functions are not safe to use with untrusted inputs. The string formats |
| // may implicitly reference context information and, in OpenSSL (though not |
| // BoringSSL), one even allows reading arbitrary files. Many formats can also |
| // produce far larger outputs than their inputs, so untrusted inputs may lead to |
| // denial-of-service attacks. Finally, the parsers see much less testing and |
| // review than most of the library and may have bugs including memory leaks or |
| // crashes. |
| |
| // v3_ext_ctx, aka `X509V3_CTX`, contains additional context information for |
| // constructing extensions. Some string formats reference additional values in |
| // these objects. It must be initialized with `X509V3_set_ctx` or |
| // `X509V3_set_ctx_test` before use. |
| struct v3_ext_ctx { |
| int flags; |
| const X509 *issuer_cert; |
| const X509 *subject_cert; |
| const X509_REQ *subject_req; |
| const X509_CRL *crl; |
| const CONF *db; |
| }; |
| |
| #define X509V3_CTX_TEST 0x1 |
| |
| // X509V3_set_ctx initializes `ctx` with the specified objects. Some string |
| // formats will reference fields in these objects. Each object may be NULL to |
| // omit it, in which case those formats cannot be used. `flags` should be zero, |
| // unless called via `X509V3_set_ctx_test`. |
| // |
| // `issuer`, `subject`, `req`, and `crl`, if non-NULL, must outlive `ctx`. |
| OPENSSL_EXPORT void X509V3_set_ctx(X509V3_CTX *ctx, const X509 *issuer, |
| const X509 *subject, const X509_REQ *req, |
| const X509_CRL *crl, int flags); |
| |
| // X509V3_set_ctx_test calls `X509V3_set_ctx` without any reference objects and |
| // mocks out some features that use them. The resulting extensions may be |
| // incomplete and should be discarded. This can be used to partially validate |
| // syntax. |
| // |
| // TODO(davidben): Can we remove this? |
| #define X509V3_set_ctx_test(ctx) \ |
| X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, X509V3_CTX_TEST) |
| |
| // X509V3_set_nconf sets `ctx` to use `conf` as the config database. `ctx` must |
| // have previously been initialized by `X509V3_set_ctx` or |
| // `X509V3_set_ctx_test`. Some string formats will reference sections in `conf`. |
| // `conf` may be NULL, in which case these formats cannot be used. If non-NULL, |
| // `conf` must outlive `ctx`. |
| OPENSSL_EXPORT void X509V3_set_nconf(X509V3_CTX *ctx, const CONF *conf); |
| |
| // X509V3_set_ctx_nodb calls `X509V3_set_nconf` with no config database. |
| #define X509V3_set_ctx_nodb(ctx) X509V3_set_nconf(ctx, NULL) |
| |
| // X509V3_EXT_nconf constructs an extension of type specified by `name`, and |
| // value specified by `value`. It returns a newly-allocated `X509_EXTENSION` |
| // object on success, or NULL on error. `conf` and `ctx` specify additional |
| // information referenced by some formats. Either `conf` or `ctx` may be NULL, |
| // in which case features which use it will be disabled. |
| // |
| // If non-NULL, `ctx` must be initialized with `X509V3_set_ctx` or |
| // `X509V3_set_ctx_test`. |
| // |
| // Both `conf` and `ctx` provide a `CONF` object. When `ctx` is non-NULL, most |
| // features use the `ctx` copy, configured with `X509V3_set_ctx`, but some use |
| // `conf`. Callers should ensure the two match to avoid surprisingly behavior. |
| OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf(const CONF *conf, |
| const X509V3_CTX *ctx, |
| const char *name, |
| const char *value); |
| |
| // X509V3_EXT_nconf_nid behaves like `X509V3_EXT_nconf`, except the extension |
| // type is specified as a NID. |
| OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_nconf_nid(const CONF *conf, |
| const X509V3_CTX *ctx, |
| int ext_nid, |
| const char *value); |
| |
| // X509V3_EXT_conf_nid calls `X509V3_EXT_nconf_nid`. `conf` must be NULL. |
| OPENSSL_EXPORT X509_EXTENSION *X509V3_EXT_conf_nid(CRYPTO_MUST_BE_NULL *conf, |
| const X509V3_CTX *ctx, |
| int ext_nid, |
| const char *value); |
| |
| // X509V3_EXT_add_nconf_sk looks up the section named `section` in `conf`. For |
| // each `CONF_VALUE` in the section, it constructs an extension as in |
| // `X509V3_EXT_nconf`, taking `name` and `value` from the `CONF_VALUE`. Each new |
| // extension is appended to `*sk`. If `*sk` is non-NULL, and at least one |
| // extension is added, it sets `*sk` to a newly-allocated |
| // `STACK_OF(X509_EXTENSION)`. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509V3_EXT_add_nconf_sk(const CONF *conf, |
| const X509V3_CTX *ctx, |
| const char *section, |
| STACK_OF(X509_EXTENSION) **sk); |
| |
| // X509V3_EXT_add_nconf adds extensions to `cert` as in |
| // `X509V3_EXT_add_nconf_sk`. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509V3_EXT_add_nconf(const CONF *conf, const X509V3_CTX *ctx, |
| const char *section, X509 *cert); |
| |
| // X509V3_EXT_REQ_add_nconf adds extensions to `req` as in |
| // `X509V3_EXT_add_nconf_sk`. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509V3_EXT_REQ_add_nconf(const CONF *conf, |
| const X509V3_CTX *ctx, |
| const char *section, X509_REQ *req); |
| |
| // X509V3_EXT_CRL_add_nconf adds extensions to `crl` as in |
| // `X509V3_EXT_add_nconf_sk`. It returns one on success and zero on error. |
| OPENSSL_EXPORT int X509V3_EXT_CRL_add_nconf(const CONF *conf, |
| const X509V3_CTX *ctx, |
| const char *section, X509_CRL *crl); |
| |
| // i2s_ASN1_OCTET_STRING returns a human-readable representation of `oct` as a |
| // newly-allocated, NUL-terminated string, or NULL on error. `method` is |
| // ignored. The caller must release the result with `OPENSSL_free` when done. |
| OPENSSL_EXPORT char *i2s_ASN1_OCTET_STRING(const X509V3_EXT_METHOD *method, |
| const ASN1_OCTET_STRING *oct); |
| |
| // s2i_ASN1_OCTET_STRING decodes `str` as a hexadecimal byte string, with |
| // optional colon separators between bytes. It returns a newly-allocated |
| // `ASN1_OCTET_STRING` with the result on success, or NULL on error. `method` |
| // and `ctx` are ignored. |
| OPENSSL_EXPORT ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING( |
| const X509V3_EXT_METHOD *method, const X509V3_CTX *ctx, const char *str); |
| |
| // i2s_ASN1_INTEGER returns a human-readable representation of `aint` as a |
| // newly-allocated, NUL-terminated string, or NULL on error. `method` is |
| // ignored. The caller must release the result with `OPENSSL_free` when done. |
| OPENSSL_EXPORT char *i2s_ASN1_INTEGER(const X509V3_EXT_METHOD *method, |
| const ASN1_INTEGER *aint); |
| |
| // s2i_ASN1_INTEGER decodes `value` as the ASCII representation of an integer, |
| // and returns a newly-allocated `ASN1_INTEGER` containing the result, or NULL |
| // on error. `method` is ignored. If `value` begins with "0x" or "0X", the input |
| // is decoded in hexadecimal, otherwise decimal. |
| OPENSSL_EXPORT ASN1_INTEGER *s2i_ASN1_INTEGER(const X509V3_EXT_METHOD *method, |
| const char *value); |
| |
| // i2s_ASN1_ENUMERATED returns a human-readable representation of `aint` as a |
| // newly-allocated, NUL-terminated string, or NULL on error. `method` is |
| // ignored. The caller must release the result with `OPENSSL_free` when done. |
| OPENSSL_EXPORT char *i2s_ASN1_ENUMERATED(const X509V3_EXT_METHOD *method, |
| const ASN1_ENUMERATED *aint); |
| |
| // X509V3_conf_free releases memory associated with `CONF_VALUE`. |
| OPENSSL_EXPORT void X509V3_conf_free(CONF_VALUE *val); |
| |
| // i2v_GENERAL_NAME serializes `gen` as a `CONF_VALUE`. If `ret` is non-NULL, it |
| // appends the value to `ret` and returns `ret` on success or NULL on error. If |
| // it returns NULL, the caller is still responsible for freeing `ret`. If `ret` |
| // is NULL, it returns a newly-allocated `STACK_OF(CONF_VALUE)` containing the |
| // result. `method` is ignored. When done, the caller should release the result |
| // with `sk_CONF_VALUE_pop_free` and `X509V3_conf_free`. |
| // |
| // Do not use this function. This is an internal implementation detail of the |
| // human-readable print functions. If extracting a SAN list from a certificate, |
| // look at `gen` directly. |
| OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME( |
| const X509V3_EXT_METHOD *method, const GENERAL_NAME *gen, |
| STACK_OF(CONF_VALUE) *ret); |
| |
| // i2v_GENERAL_NAMES serializes `gen` as a list of `CONF_VALUE`s. If `ret` is |
| // non-NULL, it appends the values to `ret` and returns `ret` on success or NULL |
| // on error. If it returns NULL, the caller is still responsible for freeing |
| // `ret`. If `ret` is NULL, it returns a newly-allocated `STACK_OF(CONF_VALUE)` |
| // containing the results. `method` is ignored. |
| // |
| // Do not use this function. This is an internal implementation detail of the |
| // human-readable print functions. If extracting a SAN list from a certificate, |
| // look at `gen` directly. |
| OPENSSL_EXPORT STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES( |
| const X509V3_EXT_METHOD *method, const GENERAL_NAMES *gen, |
| STACK_OF(CONF_VALUE) *extlist); |
| |
| // a2i_IPADDRESS decodes `ipasc` as the textual representation of an IPv4 or |
| // IPv6 address. On success, it returns a newly-allocated `ASN1_OCTET_STRING` |
| // containing the decoded IP address. IPv4 addresses are represented as 4-byte |
| // strings and IPv6 addresses as 16-byte strings. On failure, it returns NULL. |
| OPENSSL_EXPORT ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc); |
| |
| // a2i_IPADDRESS_NC decodes `ipasc` as the textual representation of an IPv4 or |
| // IPv6 address range. On success, it returns a newly-allocated |
| // `ASN1_OCTET_STRING` containing the decoded IP address, followed by the |
| // decoded mask. IPv4 ranges are represented as 8-byte strings and IPv6 ranges |
| // as 32-byte strings. On failure, it returns NULL. |
| // |
| // The text format decoded by this function is not the standard CIDR notiation. |
| // Instead, the mask after the "/" is represented as another IP address. For |
| // example, "192.168.0.0/16" would be written "192.168.0.0/255.255.0.0". |
| OPENSSL_EXPORT ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc); |
| |
| |
| // Deprecated functions. |
| |
| // X509_get_notBefore returns `x509`'s notBefore time. Note this function is not |
| // const-correct for legacy reasons. Use `X509_get0_notBefore` or |
| // `X509_getm_notBefore` instead. |
| OPENSSL_EXPORT ASN1_TIME *X509_get_notBefore(const X509 *x509); |
| |
| // X509_get_notAfter returns `x509`'s notAfter time. Note this function is not |
| // const-correct for legacy reasons. Use `X509_get0_notAfter` or |
| // `X509_getm_notAfter` instead. |
| OPENSSL_EXPORT ASN1_TIME *X509_get_notAfter(const X509 *x509); |
| |
| // X509_set_notBefore calls `X509_set1_notBefore`. Use `X509_set1_notBefore` |
| // instead. |
| OPENSSL_EXPORT int X509_set_notBefore(X509 *x509, const ASN1_TIME *tm); |
| |
| // X509_set_notAfter calls `X509_set1_notAfter`. Use `X509_set1_notAfter` |
| // instead. |
| OPENSSL_EXPORT int X509_set_notAfter(X509 *x509, const ASN1_TIME *tm); |
| |
| // X509_CRL_get_lastUpdate returns a mutable pointer to `crl`'s thisUpdate time. |
| // The OpenSSL API refers to this field as lastUpdate. |
| // |
| // Use `X509_CRL_get0_lastUpdate` or `X509_CRL_set1_lastUpdate` instead. |
| OPENSSL_EXPORT ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl); |
| |
| // X509_CRL_get_nextUpdate returns a mutable pointer to `crl`'s nextUpdate time, |
| // or NULL if `crl` has none. Use `X509_CRL_get0_nextUpdate` or |
| // `X509_CRL_set1_nextUpdate` instead. |
| OPENSSL_EXPORT ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl); |
| |
| // X509_extract_key is a legacy alias to `X509_get_pubkey`. Use |
| // `X509_get_pubkey` instead. |
| #define X509_extract_key(x) X509_get_pubkey(x) |
| |
| // X509_REQ_extract_key is a legacy alias for `X509_REQ_get_pubkey`. |
| #define X509_REQ_extract_key(a) X509_REQ_get_pubkey(a) |
| |
| // X509_name_cmp is a legacy alias for `X509_NAME_cmp`. |
| #define X509_name_cmp(a, b) X509_NAME_cmp((a), (b)) |
| |
| // The following symbols are deprecated aliases to `X509_CRL_set1_*`. |
| #define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate |
| #define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate |
| |
| // X509_get_serialNumber returns a mutable pointer to `x509`'s serial number. |
| // Prefer `X509_get0_serialNumber`. |
| OPENSSL_EXPORT ASN1_INTEGER *X509_get_serialNumber(X509 *x509); |
| |
| // X509_NAME_get_text_by_OBJ finds the first attribute with type `obj` in |
| // `name`. If found, it writes the value's UTF-8 representation to `buf`. |
| // followed by a NUL byte, and returns the number of bytes in the output, |
| // excluding the NUL byte. This is unlike OpenSSL which returns the raw |
| // ASN1_STRING data. The UTF-8 encoding of the `ASN1_STRING` may not contain a 0 |
| // codepoint. |
| // |
| // This function writes at most `len` bytes, including the NUL byte. If `buf` |
| // is NULL, it writes nothing and returns the number of bytes in the |
| // output, excluding the NUL byte that would be required for the full UTF-8 |
| // output. |
| // |
| // This function may return -1 if an error occurs for any reason, including the |
| // value not being a recognized string type, `len` being of insufficient size to |
| // hold the full UTF-8 encoding and NUL byte, memory allocation failures, an |
| // object with type `obj` not existing in `name`, or if the UTF-8 encoding of |
| // the string contains a zero byte. |
| OPENSSL_EXPORT int X509_NAME_get_text_by_OBJ(const X509_NAME *name, |
| const ASN1_OBJECT *obj, char *buf, |
| int len); |
| |
| // X509_NAME_get_text_by_NID behaves like `X509_NAME_get_text_by_OBJ` except it |
| // finds an attribute of type `nid`, which should be one of the `NID_*` |
| // constants. |
| OPENSSL_EXPORT int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid, |
| char *buf, int len); |
| |
| // X509_STORE_CTX_get0_parent_ctx returns NULL. |
| OPENSSL_EXPORT X509_STORE_CTX *X509_STORE_CTX_get0_parent_ctx( |
| const X509_STORE_CTX *ctx); |
| |
| // X509_OBJECT_free_contents sets `obj` to the empty object, freeing any values |
| // that were previously there. |
| // |
| // TODO(davidben): Unexport this function after rust-openssl is fixed to no |
| // longer call it. |
| OPENSSL_EXPORT void X509_OBJECT_free_contents(X509_OBJECT *obj); |
| |
| // X509_LOOKUP_free releases memory associated with `ctx`. This function should |
| // never be used outside the library. No function in the public API hands |
| // ownership of an `X509_LOOKUP` to the caller. |
| // |
| // TODO(davidben): Unexport this function after rust-openssl is fixed to no |
| // longer call it. |
| OPENSSL_EXPORT void X509_LOOKUP_free(X509_LOOKUP *ctx); |
| |
| // X509_STORE_CTX_cleanup resets `ctx` to the empty state. |
| // |
| // This function is a remnant of when `X509_STORE_CTX` was stack-allocated and |
| // should not be used. If releasing `ctx`, call `X509_STORE_CTX_free`. If |
| // reusing `ctx` for a new verification, release the old one and create a new |
| // one. |
| OPENSSL_EXPORT void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx); |
| |
| // X509V3_add_standard_extensions returns one. |
| OPENSSL_EXPORT int X509V3_add_standard_extensions(void); |
| |
| // The following symbols are legacy aliases for `X509_STORE_CTX` functions. |
| #define X509_STORE_get_by_subject X509_STORE_CTX_get_by_subject |
| #define X509_STORE_get1_certs X509_STORE_CTX_get1_certs |
| #define X509_STORE_get1_crls X509_STORE_CTX_get1_crls |
| |
| // X509_STORE_CTX_get_chain is a legacy alias for `X509_STORE_CTX_get0_chain`. |
| OPENSSL_EXPORT STACK_OF(X509) *X509_STORE_CTX_get_chain( |
| const X509_STORE_CTX *ctx); |
| |
| // X509_STORE_CTX_trusted_stack is a deprecated alias for |
| // `X509_STORE_CTX_set0_trusted_stack`. |
| OPENSSL_EXPORT void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, |
| STACK_OF(X509) *sk); |
| |
| typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *); |
| |
| // X509_STORE_CTX_set_verify_cb configures a callback function for `ctx` that is |
| // called multiple times during `X509_verify_cert`. The callback returns zero to |
| // fail verification and one to proceed. Typically, it will return `ok`, which |
| // preserves the default behavior. Returning one when `ok` is zero will proceed |
| // past some error. The callback may inspect `ctx` and the error queue to |
| // attempt to determine the current stage of certificate verification, but this |
| // is often unreliable. When synthesizing an error, callbacks should use |
| // `X509_STORE_CTX_set_error` to set a corresponding error. |
| // |
| // WARNING: Do not use this function. It is extremely fragile and unpredictable. |
| // This callback exposes implementation details of certificate verification, |
| // which change as the library evolves. Attempting to use it for security checks |
| // can introduce vulnerabilities if making incorrect assumptions about when the |
| // callback is called. Some errors, when suppressed, may implicitly suppress |
| // other errors due to internal implementation details. Additionally, overriding |
| // `ok` may leave `ctx` in an inconsistent state and break invariants. |
| // |
| // Instead, customize certificate verification by configuring options on the |
| // `X509_STORE_CTX` before verification, or applying additional checks after |
| // `X509_verify_cert` completes successfully. |
| OPENSSL_EXPORT void X509_STORE_CTX_set_verify_cb( |
| X509_STORE_CTX *ctx, int (*verify_cb)(int ok, X509_STORE_CTX *ctx)); |
| |
| // X509_STORE_set_verify_cb acts like `X509_STORE_CTX_set_verify_cb` but sets |
| // the verify callback for any `X509_STORE_CTX` created from this `X509_STORE` |
| // |
| // Do not use this function. See `X509_STORE_CTX_set_verify_cb` for details. |
| OPENSSL_EXPORT void X509_STORE_set_verify_cb( |
| X509_STORE *store, X509_STORE_CTX_verify_cb verify_cb); |
| |
| // X509_STORE_set_verify_cb_func is a deprecated alias for |
| // `X509_STORE_set_verify_cb`. |
| #define X509_STORE_set_verify_cb_func(store, func) \ |
| X509_STORE_set_verify_cb((store), (func)) |
| |
| // X509_STORE_CTX_set_chain configures `ctx` to use `sk` for untrusted |
| // intermediate certificates to use in verification. This function is redundant |
| // with the `chain` parameter of `X509_STORE_CTX_init`. Use the parameter |
| // instead. |
| // |
| // WARNING: Despite the similar name, this function is unrelated to |
| // `X509_STORE_CTX_get0_chain`. |
| // |
| // WARNING: This function saves a pointer to `sk` without copying or |
| // incrementing reference counts. `sk` must outlive `ctx` and may not be mutated |
| // for the duration of the certificate verification. |
| OPENSSL_EXPORT void X509_STORE_CTX_set_chain(X509_STORE_CTX *ctx, |
| STACK_OF(X509) *sk); |
| |
| // The following flags do nothing. The corresponding non-standard options have |
| // been removed. |
| #define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT 0 |
| #define X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS 0 |
| #define X509_CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS 0 |
| |
| // X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS does nothing, but is necessary in |
| // OpenSSL to enable standard wildcard matching. In BoringSSL, this behavior is |
| // always enabled. |
| #define X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS 0 |
| |
| // X509_STORE_get0_objects returns a non-owning pointer of `store`'s internal |
| // object list. Although this function is not const, callers must not modify |
| // the result of this function. |
| // |
| // WARNING: This function is not thread-safe. If `store` is shared across |
| // multiple threads, callers cannot safely inspect the result of this function, |
| // because another thread may have concurrently added to it. In particular, |
| // `X509_LOOKUP_add_dir` treats this list as a cache and may add to it in the |
| // course of certificate verification. This API additionally prevents fixing |
| // some quadratic worst-case behavior in `X509_STORE` and may be removed in the |
| // future. Use `X509_STORE_get1_objects` instead. |
| OPENSSL_EXPORT STACK_OF(X509_OBJECT) *X509_STORE_get0_objects( |
| X509_STORE *store); |
| |
| // X509_PURPOSE_get_by_sname returns the `X509_PURPOSE_*` constant corresponding |
| // a short name `sname`, or -1 if `sname` was not recognized. |
| // |
| // Use `X509_PURPOSE_*` constants directly instead. The short names used by this |
| // function look like "sslserver" or "smimeencrypt", so they do not make |
| // especially good APIs. |
| // |
| // This function differs from OpenSSL, which returns an "index" to be passed to |
| // `X509_PURPOSE_get0`, followed by `X509_PURPOSE_get_id`, to finally obtain an |
| // `X509_PURPOSE_*` value suitable for use with `X509_VERIFY_PARAM_set_purpose`. |
| OPENSSL_EXPORT int X509_PURPOSE_get_by_sname(const char *sname); |
| |
| // X509_PURPOSE_get0 returns the `X509_PURPOSE` object corresponding to `id`, |
| // which should be one of the `X509_PURPOSE_*` constants, or NULL if none |
| // exists. |
| // |
| // This function differs from OpenSSL, which takes an "index", returned from |
| // `X509_PURPOSE_get_by_sname`. In BoringSSL, indices and `X509_PURPOSE_*` IDs |
| // are the same. |
| OPENSSL_EXPORT const X509_PURPOSE *X509_PURPOSE_get0(int id); |
| |
| // X509_PURPOSE_get_id returns `purpose`'s ID. This will be one of the |
| // `X509_PURPOSE_*` constants. |
| OPENSSL_EXPORT int X509_PURPOSE_get_id(const X509_PURPOSE *purpose); |
| |
| // The following constants are values for the legacy Netscape certificate type |
| // X.509 extension, a precursor to extended key usage. These values correspond |
| // to the DER encoding of the first byte of the BIT STRING. That is, 0x80 is |
| // bit zero and 0x01 is bit seven. |
| // |
| // TODO(davidben): These constants are only used by OpenVPN, which deprecated |
| // the feature in 2017. The documentation says it was removed, but they did not |
| // actually remove it. See if OpenVPN will accept a patch to finish this. |
| #define NS_SSL_CLIENT 0x80 |
| #define NS_SSL_SERVER 0x40 |
| #define NS_SMIME 0x20 |
| #define NS_OBJSIGN 0x10 |
| #define NS_SSL_CA 0x04 |
| #define NS_SMIME_CA 0x02 |
| #define NS_OBJSIGN_CA 0x01 |
| #define NS_ANY_CA (NS_SSL_CA | NS_SMIME_CA | NS_OBJSIGN_CA) |
| |
| |
| // Private structures. |
| |
| struct X509_algor_st { |
| ASN1_OBJECT *algorithm; |
| ASN1_TYPE *parameter; |
| } /* X509_ALGOR */; |
| |
| |
| #if defined(__cplusplus) |
| } // extern C |
| #endif |
| |
| #if !defined(BORINGSSL_NO_CXX) |
| extern "C++" { |
| |
| BSSL_NAMESPACE_BEGIN |
| |
| BORINGSSL_MAKE_DELETER(ACCESS_DESCRIPTION, ACCESS_DESCRIPTION_free) |
| BORINGSSL_MAKE_DELETER(AUTHORITY_KEYID, AUTHORITY_KEYID_free) |
| BORINGSSL_MAKE_DELETER(BASIC_CONSTRAINTS, BASIC_CONSTRAINTS_free) |
| // TODO(davidben): Move this to conf.h and rename to CONF_VALUE_free. |
| BORINGSSL_MAKE_DELETER(CONF_VALUE, X509V3_conf_free) |
| BORINGSSL_MAKE_DELETER(DIST_POINT, DIST_POINT_free) |
| BORINGSSL_MAKE_DELETER(GENERAL_NAME, GENERAL_NAME_free) |
| BORINGSSL_MAKE_DELETER(GENERAL_SUBTREE, GENERAL_SUBTREE_free) |
| BORINGSSL_MAKE_DELETER(NAME_CONSTRAINTS, NAME_CONSTRAINTS_free) |
| BORINGSSL_MAKE_DELETER(NETSCAPE_SPKI, NETSCAPE_SPKI_free) |
| BORINGSSL_MAKE_DELETER(POLICY_CONSTRAINTS, POLICY_CONSTRAINTS_free) |
| BORINGSSL_MAKE_DELETER(POLICY_MAPPING, POLICY_MAPPING_free) |
| BORINGSSL_MAKE_DELETER(POLICYINFO, POLICYINFO_free) |
| BORINGSSL_MAKE_DELETER(RSA_PSS_PARAMS, RSA_PSS_PARAMS_free) |
| BORINGSSL_MAKE_DELETER(X509, X509_free) |
| BORINGSSL_MAKE_UP_REF(X509, X509_up_ref) |
| BORINGSSL_MAKE_DELETER(X509_ALGOR, X509_ALGOR_free) |
| BORINGSSL_MAKE_DELETER(X509_ATTRIBUTE, X509_ATTRIBUTE_free) |
| BORINGSSL_MAKE_DELETER(X509_CRL, X509_CRL_free) |
| BORINGSSL_MAKE_UP_REF(X509_CRL, X509_CRL_up_ref) |
| BORINGSSL_MAKE_DELETER(X509_EXTENSION, X509_EXTENSION_free) |
| BORINGSSL_MAKE_DELETER(X509_INFO, X509_INFO_free) |
| BORINGSSL_MAKE_DELETER(X509_LOOKUP, X509_LOOKUP_free) |
| BORINGSSL_MAKE_DELETER(X509_NAME, X509_NAME_free) |
| BORINGSSL_MAKE_DELETER(X509_NAME_ENTRY, X509_NAME_ENTRY_free) |
| BORINGSSL_MAKE_DELETER(X509_OBJECT, X509_OBJECT_free) |
| BORINGSSL_MAKE_DELETER(X509_PUBKEY, X509_PUBKEY_free) |
| BORINGSSL_MAKE_DELETER(X509_REQ, X509_REQ_free) |
| BORINGSSL_MAKE_DELETER(X509_REVOKED, X509_REVOKED_free) |
| BORINGSSL_MAKE_DELETER(X509_SIG, X509_SIG_free) |
| BORINGSSL_MAKE_DELETER(X509_STORE, X509_STORE_free) |
| BORINGSSL_MAKE_UP_REF(X509_STORE, X509_STORE_up_ref) |
| BORINGSSL_MAKE_DELETER(X509_STORE_CTX, X509_STORE_CTX_free) |
| BORINGSSL_MAKE_DELETER(X509_VERIFY_PARAM, X509_VERIFY_PARAM_free) |
| |
| BSSL_NAMESPACE_END |
| |
| } // extern C++ |
| #endif // !BORINGSSL_NO_CXX |
| |
| #define X509_R_AKID_MISMATCH 100 |
| #define X509_R_BAD_PKCS7_VERSION 101 |
| #define X509_R_BAD_X509_FILETYPE 102 |
| #define X509_R_BASE64_DECODE_ERROR 103 |
| #define X509_R_CANT_CHECK_DH_KEY 104 |
| #define X509_R_CERT_ALREADY_IN_HASH_TABLE 105 |
| #define X509_R_CRL_ALREADY_DELTA 106 |
| #define X509_R_CRL_VERIFY_FAILURE 107 |
| #define X509_R_IDP_MISMATCH 108 |
| #define X509_R_INVALID_BIT_STRING_BITS_LEFT 109 |
| #define X509_R_INVALID_DIRECTORY 110 |
| #define X509_R_INVALID_FIELD_NAME 111 |
| #define X509_R_INVALID_PSS_PARAMETERS 112 |
| #define X509_R_INVALID_TRUST 113 |
| #define X509_R_ISSUER_MISMATCH 114 |
| #define X509_R_KEY_TYPE_MISMATCH 115 |
| #define X509_R_KEY_VALUES_MISMATCH 116 |
| #define X509_R_LOADING_CERT_DIR 117 |
| #define X509_R_LOADING_DEFAULTS 118 |
| #define X509_R_NEWER_CRL_NOT_NEWER 119 |
| #define X509_R_NOT_PKCS7_SIGNED_DATA 120 |
| #define X509_R_NO_CERTIFICATES_INCLUDED 121 |
| #define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY 122 |
| #define X509_R_NO_CRLS_INCLUDED 123 |
| #define X509_R_NO_CRL_NUMBER 124 |
| #define X509_R_PUBLIC_KEY_DECODE_ERROR 125 |
| #define X509_R_PUBLIC_KEY_ENCODE_ERROR 126 |
| #define X509_R_SHOULD_RETRY 127 |
| #define X509_R_UNKNOWN_KEY_TYPE 128 |
| #define X509_R_UNKNOWN_NID 129 |
| #define X509_R_UNKNOWN_PURPOSE_ID 130 |
| #define X509_R_UNKNOWN_TRUST_ID 131 |
| #define X509_R_UNSUPPORTED_ALGORITHM 132 |
| #define X509_R_WRONG_LOOKUP_TYPE 133 |
| #define X509_R_WRONG_TYPE 134 |
| #define X509_R_NAME_TOO_LONG 135 |
| #define X509_R_INVALID_PARAMETER 136 |
| #define X509_R_SIGNATURE_ALGORITHM_MISMATCH 137 |
| #define X509_R_DELTA_CRL_WITHOUT_CRL_NUMBER 138 |
| #define X509_R_INVALID_FIELD_FOR_VERSION 139 |
| #define X509_R_INVALID_VERSION 140 |
| #define X509_R_NO_CERTIFICATE_FOUND 141 |
| #define X509_R_NO_CERTIFICATE_OR_CRL_FOUND 142 |
| #define X509_R_NO_CRL_FOUND 143 |
| #define X509_R_INVALID_POLICY_EXTENSION 144 |
| |
| #endif // OPENSSL_HEADER_X509_H |