Unsplit SSL and SSL_CTX.

This doesn't give them a destructor yet, just shifts things around. In
doing so, it reveals that we inconsistently allowed internal code, but
not external code, to call functions like bssl::SSL_CTX_set_handoff_mode
without a namespace because of ADL. External code doesn't get to do
this because it doesn't see that ssl_ctx_st has a base class in
namespace bssl.

Change-Id: I2ab3b00fff2d6369e850606eed63017e4f8cf8c4
Reviewed-on: https://boringssl-review.googlesource.com/29588
Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
David Benjamin
2018-07-06 18:56:03 +00:00
committed by Adam Langley
parent e7b2b13fd4
commit 4979803755
2 changed files with 374 additions and 384 deletions
+371 -381
View File
@@ -2059,294 +2059,6 @@ DEFINE_STACK_OF(CertCompressionAlg);
namespace bssl {
// SSLContext backs the public |SSL_CTX| type. Due to compatibility constraints,
// it is a base class for |ssl_ctx_st|.
struct SSLContext {
const SSL_PROTOCOL_METHOD *method;
const SSL_X509_METHOD *x509_method;
// lock is used to protect various operations on this object.
CRYPTO_MUTEX lock;
// conf_max_version is the maximum acceptable protocol version configured by
// |SSL_CTX_set_max_proto_version|. Note this version is normalized in DTLS
// and is further constrainted by |SSL_OP_NO_*|.
uint16_t conf_max_version;
// conf_min_version is the minimum acceptable protocol version configured by
// |SSL_CTX_set_min_proto_version|. Note this version is normalized in DTLS
// and is further constrainted by |SSL_OP_NO_*|.
uint16_t conf_min_version;
// tls13_variant is the variant of TLS 1.3 we are using for this
// configuration.
enum tls13_variant_t tls13_variant;
SSLCipherPreferenceList *cipher_list;
X509_STORE *cert_store;
LHASH_OF(SSL_SESSION) *sessions;
// Most session-ids that will be cached, default is
// SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited.
unsigned long session_cache_size;
SSL_SESSION *session_cache_head;
SSL_SESSION *session_cache_tail;
// handshakes_since_cache_flush is the number of successful handshakes since
// the last cache flush.
int handshakes_since_cache_flush;
// This can have one of 2 values, ored together,
// SSL_SESS_CACHE_CLIENT,
// SSL_SESS_CACHE_SERVER,
// Default is SSL_SESSION_CACHE_SERVER, which means only
// SSL_accept which cache SSL_SESSIONS.
int session_cache_mode;
// session_timeout is the default lifetime for new sessions in TLS 1.2 and
// earlier, in seconds.
uint32_t session_timeout;
// session_psk_dhe_timeout is the default lifetime for new sessions in TLS
// 1.3, in seconds.
uint32_t session_psk_dhe_timeout;
// If this callback is not null, it will be called each time a session id is
// added to the cache. If this function returns 1, it means that the
// callback will do a SSL_SESSION_free() when it has finished using it.
// Otherwise, on 0, it means the callback has finished with it. If
// remove_session_cb is not null, it will be called when a session-id is
// removed from the cache. After the call, OpenSSL will SSL_SESSION_free()
// it.
int (*new_session_cb)(SSL *ssl, SSL_SESSION *sess);
void (*remove_session_cb)(SSL_CTX *ctx, SSL_SESSION *sess);
SSL_SESSION *(*get_session_cb)(SSL *ssl, const uint8_t *data, int len,
int *copy);
CRYPTO_refcount_t references;
// if defined, these override the X509_verify_cert() calls
int (*app_verify_callback)(X509_STORE_CTX *store_ctx, void *arg);
void *app_verify_arg;
enum ssl_verify_result_t (*custom_verify_callback)(SSL *ssl,
uint8_t *out_alert);
// Default password callback.
pem_password_cb *default_passwd_callback;
// Default password callback user data.
void *default_passwd_callback_userdata;
// get client cert callback
int (*client_cert_cb)(SSL *ssl, X509 **out_x509, EVP_PKEY **out_pkey);
// get channel id callback
void (*channel_id_cb)(SSL *ssl, EVP_PKEY **out_pkey);
CRYPTO_EX_DATA ex_data;
// custom_*_extensions stores any callback sets for custom extensions. Note
// that these pointers will be NULL if the stack would otherwise be empty.
STACK_OF(SSL_CUSTOM_EXTENSION) *client_custom_extensions;
STACK_OF(SSL_CUSTOM_EXTENSION) *server_custom_extensions;
// Default values used when no per-SSL value is defined follow
void (*info_callback)(const SSL *ssl, int type, int value);
// what we put in client cert requests
STACK_OF(CRYPTO_BUFFER) *client_CA;
// cached_x509_client_CA is a cache of parsed versions of the elements of
// |client_CA|.
STACK_OF(X509_NAME) *cached_x509_client_CA;
// Default values to use in SSL structures follow (these are copied by
// SSL_new)
uint32_t options;
uint32_t mode;
uint32_t max_cert_list;
CERT *cert;
// callback that allows applications to peek at protocol messages
void (*msg_callback)(int write_p, int version, int content_type,
const void *buf, size_t len, SSL *ssl, void *arg);
void *msg_callback_arg;
int verify_mode;
int (*default_verify_callback)(
int ok, X509_STORE_CTX *ctx); // called 'verify_callback' in the SSL
X509_VERIFY_PARAM *param;
// select_certificate_cb is called before most ClientHello processing and
// before the decision whether to resume a session is made. See
// |ssl_select_cert_result_t| for details of the return values.
enum ssl_select_cert_result_t (*select_certificate_cb)(
const SSL_CLIENT_HELLO *);
// dos_protection_cb is called once the resumption decision for a ClientHello
// has been made. It returns one to continue the handshake or zero to
// abort.
int (*dos_protection_cb) (const SSL_CLIENT_HELLO *);
// Maximum amount of data to send in one fragment. actual record size can be
// more than this due to padding and MAC overheads.
uint16_t max_send_fragment;
// TLS extensions servername callback
int (*tlsext_servername_callback)(SSL *, int *, void *);
void *tlsext_servername_arg;
// RFC 4507 session ticket keys. |tlsext_ticket_key_current| may be NULL
// before the first handshake and |tlsext_ticket_key_prev| may be NULL at any
// time. Automatically generated ticket keys are rotated as needed at
// handshake time. Hence, all access must be synchronized through |lock|.
struct tlsext_ticket_key *tlsext_ticket_key_current;
struct tlsext_ticket_key *tlsext_ticket_key_prev;
// Callback to support customisation of ticket key setting
int (*tlsext_ticket_key_cb)(SSL *ssl, uint8_t *name, uint8_t *iv,
EVP_CIPHER_CTX *ectx, HMAC_CTX *hctx, int enc);
// Server-only: psk_identity_hint is the default identity hint to send in
// PSK-based key exchanges.
char *psk_identity_hint;
unsigned int (*psk_client_callback)(SSL *ssl, const char *hint,
char *identity,
unsigned int max_identity_len,
uint8_t *psk, unsigned int max_psk_len);
unsigned int (*psk_server_callback)(SSL *ssl, const char *identity,
uint8_t *psk, unsigned int max_psk_len);
// Next protocol negotiation information
// (for experimental NPN extension).
// For a server, this contains a callback function by which the set of
// advertised protocols can be provided.
int (*next_protos_advertised_cb)(SSL *ssl, const uint8_t **out,
unsigned *out_len, void *arg);
void *next_protos_advertised_cb_arg;
// For a client, this contains a callback function that selects the
// next protocol from the list provided by the server.
int (*next_proto_select_cb)(SSL *ssl, uint8_t **out, uint8_t *out_len,
const uint8_t *in, unsigned in_len, void *arg);
void *next_proto_select_cb_arg;
// ALPN information
// (we are in the process of transitioning from NPN to ALPN.)
// For a server, this contains a callback function that allows the
// server to select the protocol for the connection.
// out: on successful return, this must point to the raw protocol
// name (without the length prefix).
// outlen: on successful return, this contains the length of |*out|.
// in: points to the client's list of supported protocols in
// wire-format.
// inlen: the length of |in|.
int (*alpn_select_cb)(SSL *ssl, const uint8_t **out, uint8_t *out_len,
const uint8_t *in, unsigned in_len, void *arg);
void *alpn_select_cb_arg;
// For a client, this contains the list of supported protocols in wire
// format.
uint8_t *alpn_client_proto_list;
unsigned alpn_client_proto_list_len;
// SRTP profiles we are willing to do from RFC 5764
STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles;
// Defined compression algorithms for certificates.
STACK_OF(CertCompressionAlg) *cert_compression_algs;
// Supported group values inherited by SSL structure
size_t supported_group_list_len;
uint16_t *supported_group_list;
// The client's Channel ID private key.
EVP_PKEY *tlsext_channel_id_private;
// keylog_callback, if not NULL, is the key logging callback. See
// |SSL_CTX_set_keylog_callback|.
void (*keylog_callback)(const SSL *ssl, const char *line);
// current_time_cb, if not NULL, is the function to use to get the current
// time. It sets |*out_clock| to the current time. The |ssl| argument is
// always NULL. See |SSL_CTX_set_current_time_cb|.
void (*current_time_cb)(const SSL *ssl, struct timeval *out_clock);
// pool is used for all |CRYPTO_BUFFER|s in case we wish to share certificate
// memory.
CRYPTO_BUFFER_POOL *pool;
// ticket_aead_method contains function pointers for opening and sealing
// session tickets.
const SSL_TICKET_AEAD_METHOD *ticket_aead_method;
// legacy_ocsp_callback implements an OCSP-related callback for OpenSSL
// compatibility.
int (*legacy_ocsp_callback)(SSL *ssl, void *arg);
void *legacy_ocsp_callback_arg;
// verify_sigalgs, if not empty, is the set of signature algorithms
// accepted from the peer in decreasing order of preference.
uint16_t *verify_sigalgs;
size_t num_verify_sigalgs;
// retain_only_sha256_of_client_certs is true if we should compute the SHA256
// hash of the peer's certificate and then discard it to save memory and
// session space. Only effective on the server side.
bool retain_only_sha256_of_client_certs:1;
// quiet_shutdown is true if the connection should not send a close_notify on
// shutdown.
bool quiet_shutdown:1;
// ocsp_stapling_enabled is only used by client connections and indicates
// whether OCSP stapling will be requested.
bool ocsp_stapling_enabled:1;
// If true, a client will request certificate timestamps.
bool signed_cert_timestamps_enabled:1;
// tlsext_channel_id_enabled is whether Channel ID is enabled. For a server,
// means that we'll accept Channel IDs from clients. For a client, means that
// we'll advertise support.
bool tlsext_channel_id_enabled:1;
// grease_enabled is whether draft-davidben-tls-grease-01 is enabled.
bool grease_enabled:1;
// allow_unknown_alpn_protos is whether the client allows unsolicited ALPN
// protocols from the peer.
bool allow_unknown_alpn_protos:1;
// ed25519_enabled is whether Ed25519 is advertised in the handshake.
bool ed25519_enabled:1;
// rsa_pss_rsae_certs_enabled is whether rsa_pss_rsae_* are supported by the
// certificate verifier.
bool rsa_pss_rsae_certs_enabled:1;
// false_start_allowed_without_alpn is whether False Start (if
// |SSL_MODE_ENABLE_FALSE_START| is enabled) is allowed without ALPN.
bool false_start_allowed_without_alpn:1;
// handoff indicates that a server should stop after receiving the
// ClientHello and pause the handshake in such a way that |SSL_get_error|
// returns |SSL_HANDOFF|.
bool handoff:1;
// If enable_early_data is true, early data can be sent and accepted.
bool enable_early_data : 1;
};
// An ssl_shutdown_t describes the shutdown state of one end of the connection,
// whether it is alive or has been shutdown via close_notify or fatal alert.
enum ssl_shutdown_t {
@@ -2790,94 +2502,6 @@ struct SSL_CONFIG {
bool shed_handshake_config : 1;
};
// SSLConnection backs the public |SSL| type. Due to compatibility constraints,
// it is a base class for |ssl_st|.
struct SSLConnection {
// method is the method table corresponding to the current protocol (DTLS or
// TLS).
const SSL_PROTOCOL_METHOD *method;
// config is a container for handshake configuration. Accesses to this field
// should check for nullptr, since configuration may be shed after the
// handshake completes. (If you have the |SSL_HANDSHAKE| object at hand, use
// that instead, and skip the null check.)
SSL_CONFIG *config;
// version is the protocol version.
uint16_t version;
uint16_t max_send_fragment;
// There are 2 BIO's even though they are normally both the same. This is so
// data can be read and written to different handlers
BIO *rbio; // used by SSL_read
BIO *wbio; // used by SSL_write
// do_handshake runs the handshake. On completion, it returns |ssl_hs_ok|.
// Otherwise, it returns a value corresponding to what operation is needed to
// progress.
enum ssl_hs_wait_t (*do_handshake)(SSL_HANDSHAKE *hs);
SSL3_STATE *s3; // SSLv3 variables
DTLS1_STATE *d1; // DTLSv1 variables
// callback that allows applications to peek at protocol messages
void (*msg_callback)(int write_p, int version, int content_type,
const void *buf, size_t len, SSL *ssl, void *arg);
void *msg_callback_arg;
// session info
// initial_timeout_duration_ms is the default DTLS timeout duration in
// milliseconds. It's used to initialize the timer any time it's restarted.
unsigned initial_timeout_duration_ms;
// tls13_variant is the variant of TLS 1.3 we are using for this
// configuration.
enum tls13_variant_t tls13_variant;
// session is the configured session to be offered by the client. This session
// is immutable.
SSL_SESSION *session;
void (*info_callback)(const SSL *ssl, int type, int value);
SSL_CTX *ctx;
// session_ctx is the |SSL_CTX| used for the session cache and related
// settings.
SSL_CTX *session_ctx;
// extra application data
CRYPTO_EX_DATA ex_data;
uint32_t options; // protocol behaviour
uint32_t mode; // API behaviour
uint32_t max_cert_list;
char *tlsext_hostname;
// renegotiate_mode controls how peer renegotiation attempts are handled.
enum ssl_renegotiate_mode_t renegotiate_mode;
// server is true iff the this SSL* is the server half. Note: before the SSL*
// is initialized by either SSL_set_accept_state or SSL_set_connect_state,
// the side is not determined. In this state, server is always false.
bool server : 1;
// quiet_shutdown is true if the connection should not send a close_notify on
// shutdown.
bool quiet_shutdown : 1;
// did_dummy_pq_padding is only valid for a client. In that context, it is
// true iff the client observed the server echoing a dummy PQ padding
// extension.
bool did_dummy_pq_padding:1;
// If enable_early_data is true, early data can be sent and accepted.
bool enable_early_data : 1;
};
// From draft-ietf-tls-tls13-18, used in determining PSK modes.
#define SSL_PSK_DHE_KE 0x1
@@ -3189,11 +2813,377 @@ struct ssl_method_st {
const bssl::SSL_X509_METHOD *x509_method;
};
// The following types back public C-exposed types which must live in the global
// namespace. We use subclassing so the implementations may be C++ types with
// methods and destructor without polluting the global namespace.
struct ssl_ctx_st : public bssl::SSLContext {};
struct ssl_st : public bssl::SSLConnection {};
struct ssl_ctx_st {
const bssl::SSL_PROTOCOL_METHOD *method;
const bssl::SSL_X509_METHOD *x509_method;
// lock is used to protect various operations on this object.
CRYPTO_MUTEX lock;
// conf_max_version is the maximum acceptable protocol version configured by
// |SSL_CTX_set_max_proto_version|. Note this version is normalized in DTLS
// and is further constrainted by |SSL_OP_NO_*|.
uint16_t conf_max_version;
// conf_min_version is the minimum acceptable protocol version configured by
// |SSL_CTX_set_min_proto_version|. Note this version is normalized in DTLS
// and is further constrainted by |SSL_OP_NO_*|.
uint16_t conf_min_version;
// tls13_variant is the variant of TLS 1.3 we are using for this
// configuration.
enum tls13_variant_t tls13_variant;
bssl::SSLCipherPreferenceList *cipher_list;
X509_STORE *cert_store;
LHASH_OF(SSL_SESSION) *sessions;
// Most session-ids that will be cached, default is
// SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited.
unsigned long session_cache_size;
SSL_SESSION *session_cache_head;
SSL_SESSION *session_cache_tail;
// handshakes_since_cache_flush is the number of successful handshakes since
// the last cache flush.
int handshakes_since_cache_flush;
// This can have one of 2 values, ored together,
// SSL_SESS_CACHE_CLIENT,
// SSL_SESS_CACHE_SERVER,
// Default is SSL_SESSION_CACHE_SERVER, which means only
// SSL_accept which cache SSL_SESSIONS.
int session_cache_mode;
// session_timeout is the default lifetime for new sessions in TLS 1.2 and
// earlier, in seconds.
uint32_t session_timeout;
// session_psk_dhe_timeout is the default lifetime for new sessions in TLS
// 1.3, in seconds.
uint32_t session_psk_dhe_timeout;
// If this callback is not null, it will be called each time a session id is
// added to the cache. If this function returns 1, it means that the
// callback will do a SSL_SESSION_free() when it has finished using it.
// Otherwise, on 0, it means the callback has finished with it. If
// remove_session_cb is not null, it will be called when a session-id is
// removed from the cache. After the call, OpenSSL will SSL_SESSION_free()
// it.
int (*new_session_cb)(SSL *ssl, SSL_SESSION *sess);
void (*remove_session_cb)(SSL_CTX *ctx, SSL_SESSION *sess);
SSL_SESSION *(*get_session_cb)(SSL *ssl, const uint8_t *data, int len,
int *copy);
CRYPTO_refcount_t references;
// if defined, these override the X509_verify_cert() calls
int (*app_verify_callback)(X509_STORE_CTX *store_ctx, void *arg);
void *app_verify_arg;
enum ssl_verify_result_t (*custom_verify_callback)(SSL *ssl,
uint8_t *out_alert);
// Default password callback.
pem_password_cb *default_passwd_callback;
// Default password callback user data.
void *default_passwd_callback_userdata;
// get client cert callback
int (*client_cert_cb)(SSL *ssl, X509 **out_x509, EVP_PKEY **out_pkey);
// get channel id callback
void (*channel_id_cb)(SSL *ssl, EVP_PKEY **out_pkey);
CRYPTO_EX_DATA ex_data;
// custom_*_extensions stores any callback sets for custom extensions. Note
// that these pointers will be NULL if the stack would otherwise be empty.
STACK_OF(SSL_CUSTOM_EXTENSION) *client_custom_extensions;
STACK_OF(SSL_CUSTOM_EXTENSION) *server_custom_extensions;
// Default values used when no per-SSL value is defined follow
void (*info_callback)(const SSL *ssl, int type, int value);
// what we put in client cert requests
STACK_OF(CRYPTO_BUFFER) *client_CA;
// cached_x509_client_CA is a cache of parsed versions of the elements of
// |client_CA|.
STACK_OF(X509_NAME) *cached_x509_client_CA;
// Default values to use in SSL structures follow (these are copied by
// SSL_new)
uint32_t options;
uint32_t mode;
uint32_t max_cert_list;
bssl::CERT *cert;
// callback that allows applications to peek at protocol messages
void (*msg_callback)(int write_p, int version, int content_type,
const void *buf, size_t len, SSL *ssl, void *arg);
void *msg_callback_arg;
int verify_mode;
int (*default_verify_callback)(
int ok, X509_STORE_CTX *ctx); // called 'verify_callback' in the SSL
X509_VERIFY_PARAM *param;
// select_certificate_cb is called before most ClientHello processing and
// before the decision whether to resume a session is made. See
// |ssl_select_cert_result_t| for details of the return values.
enum ssl_select_cert_result_t (*select_certificate_cb)(
const SSL_CLIENT_HELLO *);
// dos_protection_cb is called once the resumption decision for a ClientHello
// has been made. It returns one to continue the handshake or zero to
// abort.
int (*dos_protection_cb) (const SSL_CLIENT_HELLO *);
// Maximum amount of data to send in one fragment. actual record size can be
// more than this due to padding and MAC overheads.
uint16_t max_send_fragment;
// TLS extensions servername callback
int (*tlsext_servername_callback)(SSL *, int *, void *);
void *tlsext_servername_arg;
// RFC 4507 session ticket keys. |tlsext_ticket_key_current| may be NULL
// before the first handshake and |tlsext_ticket_key_prev| may be NULL at any
// time. Automatically generated ticket keys are rotated as needed at
// handshake time. Hence, all access must be synchronized through |lock|.
bssl::tlsext_ticket_key *tlsext_ticket_key_current;
bssl::tlsext_ticket_key *tlsext_ticket_key_prev;
// Callback to support customisation of ticket key setting
int (*tlsext_ticket_key_cb)(SSL *ssl, uint8_t *name, uint8_t *iv,
EVP_CIPHER_CTX *ectx, HMAC_CTX *hctx, int enc);
// Server-only: psk_identity_hint is the default identity hint to send in
// PSK-based key exchanges.
char *psk_identity_hint;
unsigned int (*psk_client_callback)(SSL *ssl, const char *hint,
char *identity,
unsigned int max_identity_len,
uint8_t *psk, unsigned int max_psk_len);
unsigned int (*psk_server_callback)(SSL *ssl, const char *identity,
uint8_t *psk, unsigned int max_psk_len);
// Next protocol negotiation information
// (for experimental NPN extension).
// For a server, this contains a callback function by which the set of
// advertised protocols can be provided.
int (*next_protos_advertised_cb)(SSL *ssl, const uint8_t **out,
unsigned *out_len, void *arg);
void *next_protos_advertised_cb_arg;
// For a client, this contains a callback function that selects the
// next protocol from the list provided by the server.
int (*next_proto_select_cb)(SSL *ssl, uint8_t **out, uint8_t *out_len,
const uint8_t *in, unsigned in_len, void *arg);
void *next_proto_select_cb_arg;
// ALPN information
// (we are in the process of transitioning from NPN to ALPN.)
// For a server, this contains a callback function that allows the
// server to select the protocol for the connection.
// out: on successful return, this must point to the raw protocol
// name (without the length prefix).
// outlen: on successful return, this contains the length of |*out|.
// in: points to the client's list of supported protocols in
// wire-format.
// inlen: the length of |in|.
int (*alpn_select_cb)(SSL *ssl, const uint8_t **out, uint8_t *out_len,
const uint8_t *in, unsigned in_len, void *arg);
void *alpn_select_cb_arg;
// For a client, this contains the list of supported protocols in wire
// format.
uint8_t *alpn_client_proto_list;
unsigned alpn_client_proto_list_len;
// SRTP profiles we are willing to do from RFC 5764
STACK_OF(SRTP_PROTECTION_PROFILE) *srtp_profiles;
// Defined compression algorithms for certificates.
STACK_OF(CertCompressionAlg) *cert_compression_algs;
// Supported group values inherited by SSL structure
size_t supported_group_list_len;
uint16_t *supported_group_list;
// The client's Channel ID private key.
EVP_PKEY *tlsext_channel_id_private;
// keylog_callback, if not NULL, is the key logging callback. See
// |SSL_CTX_set_keylog_callback|.
void (*keylog_callback)(const SSL *ssl, const char *line);
// current_time_cb, if not NULL, is the function to use to get the current
// time. It sets |*out_clock| to the current time. The |ssl| argument is
// always NULL. See |SSL_CTX_set_current_time_cb|.
void (*current_time_cb)(const SSL *ssl, struct timeval *out_clock);
// pool is used for all |CRYPTO_BUFFER|s in case we wish to share certificate
// memory.
CRYPTO_BUFFER_POOL *pool;
// ticket_aead_method contains function pointers for opening and sealing
// session tickets.
const SSL_TICKET_AEAD_METHOD *ticket_aead_method;
// legacy_ocsp_callback implements an OCSP-related callback for OpenSSL
// compatibility.
int (*legacy_ocsp_callback)(SSL *ssl, void *arg);
void *legacy_ocsp_callback_arg;
// verify_sigalgs, if not empty, is the set of signature algorithms
// accepted from the peer in decreasing order of preference.
uint16_t *verify_sigalgs;
size_t num_verify_sigalgs;
// retain_only_sha256_of_client_certs is true if we should compute the SHA256
// hash of the peer's certificate and then discard it to save memory and
// session space. Only effective on the server side.
bool retain_only_sha256_of_client_certs:1;
// quiet_shutdown is true if the connection should not send a close_notify on
// shutdown.
bool quiet_shutdown:1;
// ocsp_stapling_enabled is only used by client connections and indicates
// whether OCSP stapling will be requested.
bool ocsp_stapling_enabled:1;
// If true, a client will request certificate timestamps.
bool signed_cert_timestamps_enabled:1;
// tlsext_channel_id_enabled is whether Channel ID is enabled. For a server,
// means that we'll accept Channel IDs from clients. For a client, means that
// we'll advertise support.
bool tlsext_channel_id_enabled:1;
// grease_enabled is whether draft-davidben-tls-grease-01 is enabled.
bool grease_enabled:1;
// allow_unknown_alpn_protos is whether the client allows unsolicited ALPN
// protocols from the peer.
bool allow_unknown_alpn_protos:1;
// ed25519_enabled is whether Ed25519 is advertised in the handshake.
bool ed25519_enabled:1;
// rsa_pss_rsae_certs_enabled is whether rsa_pss_rsae_* are supported by the
// certificate verifier.
bool rsa_pss_rsae_certs_enabled:1;
// false_start_allowed_without_alpn is whether False Start (if
// |SSL_MODE_ENABLE_FALSE_START| is enabled) is allowed without ALPN.
bool false_start_allowed_without_alpn:1;
// handoff indicates that a server should stop after receiving the
// ClientHello and pause the handshake in such a way that |SSL_get_error|
// returns |SSL_HANDOFF|.
bool handoff:1;
// If enable_early_data is true, early data can be sent and accepted.
bool enable_early_data : 1;
};
struct ssl_st {
// method is the method table corresponding to the current protocol (DTLS or
// TLS).
const bssl::SSL_PROTOCOL_METHOD *method;
// config is a container for handshake configuration. Accesses to this field
// should check for nullptr, since configuration may be shed after the
// handshake completes. (If you have the |SSL_HANDSHAKE| object at hand, use
// that instead, and skip the null check.)
bssl::SSL_CONFIG *config;
// version is the protocol version.
uint16_t version;
uint16_t max_send_fragment;
// There are 2 BIO's even though they are normally both the same. This is so
// data can be read and written to different handlers
BIO *rbio; // used by SSL_read
BIO *wbio; // used by SSL_write
// do_handshake runs the handshake. On completion, it returns |ssl_hs_ok|.
// Otherwise, it returns a value corresponding to what operation is needed to
// progress.
bssl::ssl_hs_wait_t (*do_handshake)(bssl::SSL_HANDSHAKE *hs);
bssl::SSL3_STATE *s3; // SSLv3 variables
bssl::DTLS1_STATE *d1; // DTLSv1 variables
// callback that allows applications to peek at protocol messages
void (*msg_callback)(int write_p, int version, int content_type,
const void *buf, size_t len, SSL *ssl, void *arg);
void *msg_callback_arg;
// session info
// initial_timeout_duration_ms is the default DTLS timeout duration in
// milliseconds. It's used to initialize the timer any time it's restarted.
unsigned initial_timeout_duration_ms;
// tls13_variant is the variant of TLS 1.3 we are using for this
// configuration.
enum tls13_variant_t tls13_variant;
// session is the configured session to be offered by the client. This session
// is immutable.
SSL_SESSION *session;
void (*info_callback)(const SSL *ssl, int type, int value);
SSL_CTX *ctx;
// session_ctx is the |SSL_CTX| used for the session cache and related
// settings.
SSL_CTX *session_ctx;
// extra application data
CRYPTO_EX_DATA ex_data;
uint32_t options; // protocol behaviour
uint32_t mode; // API behaviour
uint32_t max_cert_list;
char *tlsext_hostname;
// renegotiate_mode controls how peer renegotiation attempts are handled.
enum ssl_renegotiate_mode_t renegotiate_mode;
// server is true iff the this SSL* is the server half. Note: before the SSL*
// is initialized by either SSL_set_accept_state or SSL_set_connect_state,
// the side is not determined. In this state, server is always false.
bool server : 1;
// quiet_shutdown is true if the connection should not send a close_notify on
// shutdown.
bool quiet_shutdown : 1;
// did_dummy_pq_padding is only valid for a client. In that context, it is
// true iff the client observed the server echoing a dummy PQ padding
// extension.
bool did_dummy_pq_padding:1;
// If enable_early_data is true, early data can be sent and accepted.
bool enable_early_data : 1;
};
struct ssl_session_st {
explicit ssl_session_st(const bssl::SSL_X509_METHOD *method);
+3 -3
View File
@@ -781,7 +781,7 @@ static bool DoExchange(bssl::UniquePtr<SSL_SESSION> *out_session,
if (!ctx_handoff) {
return false;
}
SSL_CTX_set_handoff_mode(ctx_handoff.get(), 1);
bssl::SSL_CTX_set_handoff_mode(ctx_handoff.get(), 1);
bssl::UniquePtr<SSL> ssl_handoff =
config->NewSSL(ctx_handoff.get(), nullptr, false, nullptr);
@@ -812,7 +812,7 @@ static bool DoExchange(bssl::UniquePtr<SSL_SESSION> *out_session,
bssl::ScopedCBB cbb;
bssl::Array<uint8_t> handoff;
if (!CBB_init(cbb.get(), 512) ||
!SSL_serialize_handoff(ssl_handoff.get(), cbb.get()) ||
!bssl::SSL_serialize_handoff(ssl_handoff.get(), cbb.get()) ||
!CBBFinishArray(cbb.get(), &handoff) ||
!writer->WriteHandoff(handoff)) {
fprintf(stderr, "Handoff serialisation failed.\n");
@@ -846,7 +846,7 @@ static bool DoExchange(bssl::UniquePtr<SSL_SESSION> *out_session,
bssl::ScopedCBB cbb;
bssl::Array<uint8_t> handback;
if (!CBB_init(cbb.get(), 512) ||
!SSL_serialize_handback(ssl, cbb.get()) ||
!bssl::SSL_serialize_handback(ssl, cbb.get()) ||
!CBBFinishArray(cbb.get(), &handback) ||
!writer->WriteHandback(handback)) {
fprintf(stderr, "Handback serialisation failed.\n");