|  | =pod | 
|  |  | 
|  | =head1 NAME | 
|  |  | 
|  | ssl_ct_validation_cb, | 
|  | SSL_enable_ct, SSL_CTX_enable_ct, SSL_disable_ct, SSL_CTX_disable_ct, | 
|  | SSL_set_ct_validation_callback, SSL_CTX_set_ct_validation_callback, | 
|  | SSL_ct_is_enabled, SSL_CTX_ct_is_enabled - | 
|  | control Certificate Transparency policy | 
|  |  | 
|  | =head1 SYNOPSIS | 
|  |  | 
|  | #include <openssl/ssl.h> | 
|  |  | 
|  | typedef int (*ssl_ct_validation_cb)(const CT_POLICY_EVAL_CTX *ctx, | 
|  | const STACK_OF(SCT) *scts, void *arg); | 
|  |  | 
|  | int SSL_enable_ct(SSL *s, int validation_mode); | 
|  | int SSL_CTX_enable_ct(SSL_CTX *ctx, int validation_mode); | 
|  | int SSL_set_ct_validation_callback(SSL *s, ssl_ct_validation_cb callback, | 
|  | void *arg); | 
|  | int SSL_CTX_set_ct_validation_callback(SSL_CTX *ctx, | 
|  | ssl_ct_validation_cb callback, | 
|  | void *arg); | 
|  | void SSL_disable_ct(SSL *s); | 
|  | void SSL_CTX_disable_ct(SSL_CTX *ctx); | 
|  | int SSL_ct_is_enabled(const SSL *s); | 
|  | int SSL_CTX_ct_is_enabled(const SSL_CTX *ctx); | 
|  |  | 
|  | =head1 DESCRIPTION | 
|  |  | 
|  | SSL_enable_ct() and SSL_CTX_enable_ct() enable the processing of signed | 
|  | certificate timestamps (SCTs) either for a given SSL connection or for all | 
|  | connections that share the given SSL context, respectively. | 
|  | This is accomplished by setting a built-in CT validation callback. | 
|  | The behaviour of the callback is determined by the B<validation_mode> argument, | 
|  | which can be either of B<SSL_CT_VALIDATION_PERMISSIVE> or | 
|  | B<SSL_CT_VALIDATION_STRICT> as described below. | 
|  |  | 
|  | If B<validation_mode> is equal to B<SSL_CT_VALIDATION_STRICT>, then in a full | 
|  | TLS handshake with the verification mode set to B<SSL_VERIFY_PEER>, if the peer | 
|  | presents no valid SCTs the handshake will be aborted. | 
|  | If the verification mode is B<SSL_VERIFY_NONE>, the handshake will continue | 
|  | despite lack of valid SCTs. | 
|  | However, in that case if the verification status before the built-in callback | 
|  | was B<X509_V_OK> it will be set to B<X509_V_ERR_NO_VALID_SCTS> after the | 
|  | callback. | 
|  | Applications can call L<SSL_get_verify_result(3)> to check the status at | 
|  | handshake completion, even after session resumption since the verification | 
|  | status is part of the saved session state. | 
|  | See L<SSL_set_verify(3)>, <SSL_get_verify_result(3)>, L<SSL_session_reused(3)>. | 
|  |  | 
|  | If B<validation_mode> is equal to B<SSL_CT_VALIDATION_PERMISSIVE>, then the | 
|  | handshake continues, and the verification status is not modified, regardless of | 
|  | the validation status of any SCTs. | 
|  | The application can still inspect the validation status of the SCTs at | 
|  | handshake completion. | 
|  | Note that with session resumption there will not be any SCTs presented during | 
|  | the handshake. | 
|  | Therefore, in applications that delay SCT policy enforcement until after | 
|  | handshake completion, such delayed SCT checks should only be performed when the | 
|  | session is not resumed. | 
|  |  | 
|  | SSL_set_ct_validation_callback() and SSL_CTX_set_ct_validation_callback() | 
|  | register a custom callback that may implement a different policy than either of | 
|  | the above. | 
|  | This callback can examine the peer's SCTs and determine whether they are | 
|  | sufficient to allow the connection to continue. | 
|  | The TLS handshake is aborted if the verification mode is not B<SSL_VERIFY_NONE> | 
|  | and the callback returns a non-positive result. | 
|  |  | 
|  | An arbitrary callback data argument, B<arg>, can be passed in when setting | 
|  | the callback. | 
|  | This will be passed to the callback whenever it is invoked. | 
|  | Ownership of this context remains with the caller. | 
|  |  | 
|  | If no callback is set, SCTs will not be requested and Certificate Transparency | 
|  | validation will not occur. | 
|  |  | 
|  | No callback will be invoked when the peer presents no certificate, e.g. by | 
|  | employing an anonymous (aNULL) cipher suite. | 
|  | In that case the handshake continues as it would had no callback been | 
|  | requested. | 
|  | Callbacks are also not invoked when the peer certificate chain is invalid or | 
|  | validated via DANE-TA(2) or DANE-EE(3) TLSA records which use a private X.509 | 
|  | PKI, or no X.509 PKI at all, respectively. | 
|  | Clients that require SCTs are expected to not have enabled any aNULL ciphers | 
|  | nor to have specified server verification via DANE-TA(2) or DANE-EE(3) TLSA | 
|  | records. | 
|  |  | 
|  | SSL_disable_ct() and SSL_CTX_disable_ct() turn off CT processing, whether | 
|  | enabled via the built-in or the custom callbacks, by setting a NULL callback. | 
|  | These may be implemented as macros. | 
|  |  | 
|  | SSL_ct_is_enabled() and SSL_CTX_ct_is_enabled() return 1 if CT processing is | 
|  | enabled via either SSL_enable_ct() or a non-null custom callback, and 0 | 
|  | otherwise. | 
|  |  | 
|  | =head1 NOTES | 
|  |  | 
|  | When SCT processing is enabled, OCSP stapling will be enabled. This is because | 
|  | one possible source of SCTs is the OCSP response from a server. | 
|  |  | 
|  | The time returned by SSL_SESSION_get_time() will be used to evaluate whether any | 
|  | presented SCTs have timestamps that are in the future (and therefore invalid). | 
|  |  | 
|  | =head1 RESTRICTIONS | 
|  |  | 
|  | Certificate Transparency validation cannot be enabled and so a callback cannot | 
|  | be set if a custom client extension handler has been registered to handle SCT | 
|  | extensions (B<TLSEXT_TYPE_signed_certificate_timestamp>). | 
|  |  | 
|  | =head1 RETURN VALUES | 
|  |  | 
|  | SSL_enable_ct(), SSL_CTX_enable_ct(), SSL_CTX_set_ct_validation_callback() and | 
|  | SSL_set_ct_validation_callback() return 1 if the B<callback> is successfully | 
|  | set. | 
|  | They return 0 if an error occurs, e.g. a custom client extension handler has | 
|  | been setup to handle SCTs. | 
|  |  | 
|  | SSL_disable_ct() and SSL_CTX_disable_ct() do not return a result. | 
|  |  | 
|  | SSL_CTX_ct_is_enabled() and SSL_ct_is_enabled() return a 1 if a non-null CT | 
|  | validation callback is set, or 0 if no callback (or equivalently a NULL | 
|  | callback) is set. | 
|  |  | 
|  | =head1 SEE ALSO | 
|  |  | 
|  | L<ssl(7)>, | 
|  | <SSL_get_verify_result(3)>, | 
|  | L<SSL_session_reused(3)>, | 
|  | L<SSL_set_verify(3)>, | 
|  | L<SSL_CTX_set_verify(3)>, | 
|  | L<SSL_SESSION_get_time(3)> | 
|  |  | 
|  | =head1 COPYRIGHT | 
|  |  | 
|  | Copyright 2016-2020 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 |