=pod

=head1 NAME

SSL_CTX_set_cert_verify_callback - set peer certificate verification procedure

=head1 SYNOPSIS

 #include <openssl/ssl.h>

 void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx,
                                       int (*callback)(X509_STORE_CTX *, void *),
                                       void *arg);

=head1 DESCRIPTION

SSL_CTX_set_cert_verify_callback() sets the verification callback function for
I<ctx>. SSL objects that are created from I<ctx> inherit the setting valid at
the time when L<SSL_new(3)> is called.

=head1 NOTES

When a peer certificate has been received during a SSL/TLS handshake,
a verification function is called regardless of the verification mode.
If the application does not explicitly specify a verification callback function,
the built-in verification function is used.
If a verification callback I<callback> is specified via
SSL_CTX_set_cert_verify_callback(), the supplied callback function is called
instead with the arguments callback(X509_STORE_CTX *x509_store_ctx, void *arg).
The argument I<arg> is specified by the application when setting I<callback>.
By setting I<callback> to NULL, the default behaviour is restored.

I<callback> should return 1 to indicate verification success
and 0 to indicate verification failure.
In server mode, a return value of 0 leads to handshake failure.
In client mode, the behaviour is as follows.
All values, including 0, are ignored
if the verification mode is B<SSL_VERIFY_NONE>.
Otherwise, when the return value is 0, the handshake will fail.

In client mode I<callback> may also return -1,
typically on failure verifying the server certificate.
This makes the handshake suspend and return control to the calling application
with B<SSL_ERROR_WANT_RETRY_VERIFY>.
The app can for instance fetch further certificates or cert status information
needed for the verification.
Calling L<SSL_connect(3)> again resumes the connection attempt
by retrying the server certificate verification step.
This process may even be repeated if need be.

In any case a viable verification result value must be reflected
in the B<error> member of I<x509_store_ctx>,
which can be done using L<X509_STORE_CTX_set_error(3)>.
This is particularly important in case
the I<callback> allows the connection to continue (by returning 1).
Note that the verification status in the store context is a possibly durable
indication of the chain's validity!
This gets recorded in the SSL session (and thus also in session tickets)
and the validity of the originally presented chain is then visible
on resumption, even though no chain is presented int that case.
Moreover, the calling application will be informed about the detailed result of
the verification procedure and may elect to base further decisions on it.

Within I<x509_store_ctx>, I<callback> has access to the I<verify_callback>
function set using L<SSL_CTX_set_verify(3)>.

=head1 RETURN VALUES

SSL_CTX_set_cert_verify_callback() does not return a value.

=head1 WARNINGS

Do not mix the verification callback described in this function with the
B<verify_callback> function called during the verification process. The
latter is set using the L<SSL_CTX_set_verify(3)>
family of functions.

Providing a complete verification procedure including certificate purpose
settings etc is a complex task. The built-in procedure is quite powerful
and in most cases it should be sufficient to modify its behaviour using
the B<verify_callback> function.

=head1 BUGS

SSL_CTX_set_cert_verify_callback() does not provide diagnostic information.

=head1 SEE ALSO

L<ssl(7)>, L<SSL_CTX_set_verify(3)>,
L<X509_STORE_CTX_set_error(3)>,
L<SSL_get_verify_result(3)>,
L<SSL_CTX_load_verify_locations(3)>

=head1 COPYRIGHT

Copyright 2001-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
