X509_build_chain() builds a certificate chain starting from target using the optional list of
intermediate CA certificates certs. If store is NULL it builds the chain as far down as possible,
ignoring errors. Else the chain must reach a trust anchor contained in store. It internally uses a
X509_STORE_CTX structure associated with the library context libctx and property query string propq, both
of which may be NULL. In case there is more than one possibility for the chain, only one is taken.
On success it returns a pointer to a new stack of (up_ref'ed) certificates starting with target and
followed by all available intermediate certificates. A self-signed trust anchor is included only if
target is the trust anchor of with_self_signed is 1. If a non-NULL stack is returned the caller is
responsible for freeing it.
The X509_verify_cert() function attempts to discover and validate a certificate chain based on parameters
in ctx. The verification context, of type X509_STORE_CTX, can be constructed using X509_STORE_CTX_new(3)
and X509_STORE_CTX_init(3). It usually includes a target certificate to be verified, a set of
certificates serving as trust anchors, a list of non-trusted certificates that may be helpful for chain
construction, flags such as X509_V_FLAG_X509_STRICT, and various other optional components such as a
callback function that allows customizing the verification outcome. A complete description of the
certificate verification process is contained in the openssl-verification-options(1) manual page.
Applications rarely call this function directly but it is used by OpenSSL internally for certificate
validation, in both the S/MIME and SSL/TLS code.
A negative return value from X509_verify_cert() can occur if it is invoked incorrectly, such as with no
certificate set in ctx, or when it is called twice in succession without reinitialising ctx for the
second call. A negative return value can also happen due to internal resource problems or because an
internal inconsistency has been detected. Applications must interpret any return value <= 0 as an error.
The X509_STORE_CTX_verify() behaves like X509_verify_cert() except that its target certificate is the
first element of the list of untrusted certificates in ctx unless a target certificate is set explicitly.
When the verification target is a raw public key, rather than a certificate, both functions validate the
target raw public key. In that case the number of possible checks is significantly reduced. The raw
public key can be authenticated only via DANE TLSA records, either locally synthesised or obtained by the
application from DNS. Raw public key DANE TLSA records may be added via SSL_add_expected_rpk(3) or
SSL_dane_tlsa_add(3).