=pod

=head1 NAME

X509_STORE,
X509_STORE_add_cert, X509_STORE_add_crl, X509_STORE_set_depth,
X509_STORE_set_flags, X509_STORE_set_purpose, X509_STORE_set_trust,
X509_STORE_add_lookup,
X509_STORE_load_file_ex, X509_STORE_load_file, X509_STORE_load_path,
X509_STORE_load_store_ex, X509_STORE_load_store,
X509_STORE_set_default_paths_ex, X509_STORE_set_default_paths,
X509_STORE_load_locations_ex, X509_STORE_load_locations
- X509_STORE manipulation

=head1 SYNOPSIS

 #include <openssl/x509_vfy.h>

 typedef x509_store_st X509_STORE;

 int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
 int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
 int X509_STORE_set_depth(X509_STORE *store, int depth);
 int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags);
 int X509_STORE_set_purpose(X509_STORE *ctx, int purpose);
 int X509_STORE_set_trust(X509_STORE *ctx, int trust);

 X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *store,
                                    X509_LOOKUP_METHOD *meth);

 int X509_STORE_set_default_paths_ex(X509_STORE *ctx, OSSL_LIB_CTX *libctx,
                                     const char *propq);
 int X509_STORE_set_default_paths(X509_STORE *ctx);
 int X509_STORE_load_file_ex(X509_STORE *ctx, const char *file,
                             OSSL_LIB_CTX *libctx, const char *propq);
 int X509_STORE_load_file(X509_STORE *ctx, const char *file);
 int X509_STORE_load_path(X509_STORE *ctx, const char *dir);
 int X509_STORE_load_store_ex(X509_STORE *ctx, const char *uri,
                              OSSL_LIB_CTX *libctx, const char *propq);
 int X509_STORE_load_store(X509_STORE *ctx, const char *uri);
 int X509_STORE_load_locations_ex(X509_STORE *ctx, const char *file,
                                  const char *dir, OSSL_LIB_CTX *libctx,
                                  const char *propq);
 int X509_STORE_load_locations(X509_STORE *ctx,
                               const char *file, const char *dir);

=head1 DESCRIPTION

The B<X509_STORE> structure is intended to be a consolidated mechanism for
holding information about X.509 certificates and CRLs, and constructing
and validating chains of certificates terminating in trusted roots.
It admits multiple lookup mechanisms and efficient scaling performance
with large numbers of certificates, and a great deal of flexibility in
how validation and policy checks are performed.

Details of the chain building and checking process are described in
L<openssl-verification-options(1)/Certification Path Building> and
L<openssl-verification-options(1)/Certification Path Validation>.

L<X509_STORE_new(3)> creates an empty B<X509_STORE> structure, which contains
no information about trusted certificates or where such certificates
are located on disk, and is generally not usable.  Normally, trusted
certificates will be added to the B<X509_STORE> to prepare it for use,
via mechanisms such as X509_STORE_add_lookup() and X509_LOOKUP_file(), or
PEM_read_bio_X509_AUX() and X509_STORE_add_cert().  CRLs can also be added,
and many behaviors configured as desired.

Once the B<X509_STORE> is suitably configured, X509_STORE_CTX_new() is
used to instantiate a single-use B<X509_STORE_CTX> for each chain-building
and verification operation.  That process includes providing the end-entity
certificate to be verified and an additional set of untrusted certificates
that may be used in chain-building.  As such, it is expected that the
certificates included in the B<X509_STORE> are certificates that represent
trusted entities such as root certificate authorities (CAs).
OpenSSL represents these trusted certificates internally as B<X509> objects
with an associated B<X509_CERT_AUX>, as are produced by
PEM_read_bio_X509_AUX() and similar routines that refer to X509_AUX.
The public interfaces that operate on such trusted certificates still
operate on pointers to B<X509> objects, though.

X509_STORE_add_cert() and X509_STORE_add_crl() add the respective object
to the B<X509_STORE>'s local storage.  Untrusted objects should not be
added in this way.  The added object's reference count is incremented by one,
hence the caller retains ownership of the object and needs to free it when it
is no longer needed.

X509_STORE_set_depth(), X509_STORE_set_flags(), X509_STORE_set_purpose(),
X509_STORE_set_trust(), and X509_STORE_set1_param() set the default values
for the corresponding values used in certificate chain validation.  Their
behavior is documented in the corresponding B<X509_VERIFY_PARAM> manual
pages, e.g., L<X509_VERIFY_PARAM_set_depth(3)>.

X509_STORE_add_lookup() finds or creates a L<X509_LOOKUP(3)> with the
L<X509_LOOKUP_METHOD(3)> I<meth> and adds it to the B<X509_STORE>
I<store>.  This also associates the B<X509_STORE> with the lookup, so
B<X509_LOOKUP> functions can look up objects in that store.

X509_STORE_load_file_ex() loads trusted certificate(s) into an
B<X509_STORE> from a given file. The library context I<libctx> and property
query I<propq> are used when fetching algorithms from providers.

X509_STORE_load_file() is similar to X509_STORE_load_file_ex() but
uses NULL for the library context I<libctx> and property query I<propq>.

X509_STORE_load_path() loads trusted certificate(s) into an
B<X509_STORE> from a given directory path.
The certificates in the directory must be in hashed form, as
documented in L<X509_LOOKUP_hash_dir(3)>.

X509_STORE_load_store_ex() loads trusted certificate(s) into an
B<X509_STORE> from a store at a given URI. The library context I<libctx> and
property query I<propq> are used when fetching algorithms from providers.

X509_STORE_load_store() is similar to X509_STORE_load_store_ex() but
uses NULL for the library context I<libctx> and property query I<propq>.

X509_STORE_load_locations_ex() combines
X509_STORE_load_file_ex() and X509_STORE_load_dir() for a given file
and/or directory path.
It is permitted to specify just a file, just a directory, or both
paths.

X509_STORE_load_locations() is similar to X509_STORE_load_locations_ex()
but uses NULL for the library context I<libctx> and property query I<propq>.

X509_STORE_set_default_paths_ex() is somewhat misnamed, in that it does
not set what default paths should be used for loading certificates.  Instead,
it loads certificates into the B<X509_STORE> from the hardcoded default
paths. The library context I<libctx> and property query I<propq> are used when
fetching algorithms from providers.

X509_STORE_set_default_paths() is similar to
X509_STORE_set_default_paths_ex() but uses NULL for the library
context I<libctx> and property query I<propq>.

=head1 RETURN VALUES

X509_STORE_add_cert(), X509_STORE_add_crl(), X509_STORE_set_depth(),
X509_STORE_set_flags(), X509_STORE_set_purpose(), X509_STORE_set_trust(),
X509_STORE_load_file_ex(), X509_STORE_load_file(),
X509_STORE_load_path(),
X509_STORE_load_store_ex(), X509_STORE_load_store(),
X509_STORE_load_locations_ex(), X509_STORE_load_locations(),
X509_STORE_set_default_paths_ex() and X509_STORE_set_default_paths()
return 1 on success or 0 on failure.

X509_STORE_add_lookup() returns the found or created
L<X509_LOOKUP(3)>, or NULL on error.

=head1 SEE ALSO

L<X509_LOOKUP_hash_dir(3)>.
L<X509_VERIFY_PARAM_set_depth(3)>.
L<X509_STORE_new(3)>,
L<X509_STORE_get0_param(3)>

=head1 HISTORY

The functions X509_STORE_set_default_paths_ex(),
X509_STORE_load_file_ex(), X509_STORE_load_store_ex() and
X509_STORE_load_locations_ex() were added in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
