Go to the documentation of this file.
31 #include "../crypto/internal.h"
54 &alert, client_hello)) {
59 if (!found_key_share) {
80 !key_share->Accept(
public_key.get(), &secret, &alert, peer_key) ||
130 *out_sent_tickets =
false;
136 static const int kNumTickets = 2;
142 for (
int i = 0;
i < kNumTickets;
i++) {
143 UniquePtr<SSL_SESSION> session(
152 session->ticket_age_add_valid =
true;
153 bool enable_early_data =
156 if (enable_early_data) {
159 session->ticket_max_early_data =
163 static_assert(kNumTickets < 256,
"Too many tickets");
168 if (!ssl->
method->init_message(ssl, cbb.get(), &body,
181 if (enable_early_data) {
185 !
CBB_add_u32(&early_data, session->ticket_max_early_data) ||
203 *out_sent_tickets =
true;
260 int32_t *out_ticket_age_skew,
bool *out_offered_ticket,
263 *out_session =
nullptr;
268 if (!*out_offered_ticket) {
285 hs, &ticket, &binders, &client_ticket_age, out_alert, client_hello,
298 UniquePtr<SSL_SESSION> session;
299 enum ssl_ticket_aead_result_t
ret =
313 !session->ticket_age_add_valid) {
318 client_ticket_age -= session->ticket_age_add;
319 client_ticket_age /= 1000;
325 assert(
now.tv_sec >= session->time);
326 uint64_t server_ticket_age =
now.tv_sec - session->time;
334 *out_ticket_age_skew =
static_cast<int32_t>(client_ticket_age) -
335 static_cast<int32_t>(server_ticket_age);
354 config->quic_early_data_context.size() !=
373 UniquePtr<SSL_SESSION> session;
374 bool offered_ticket =
false;
376 &offered_ticket,
msg, &client_hello)) {
395 ssl->
s3->session_reused =
true;
428 bool found_key_share;
439 }
else if (!offered_ticket) {
441 }
else if (!session) {
443 }
else if (session->ticket_max_early_data == 0) {
450 }
else if (
MakeConstSpan(ssl->
s3->alpn_selected) != session->early_alpn) {
453 }
else if (hs->
new_session->has_application_settings !=
454 session->has_application_settings ||
456 session->local_application_settings) {
459 kMaxTicketAgeSkewSeconds < ssl->s3->ticket_age_skew) {
463 }
else if (!found_key_share) {
471 ssl->
s3->early_data_accepted =
true;
477 if (!hs->
new_session->early_alpn.CopyFrom(ssl->
s3->alpn_selected)) {
485 if (ssl->
s3->early_data_accepted &&
487 !hs->
new_session->peer_application_settings.CopyFrom(
488 session->peer_application_settings)) {
495 if (!hs->
new_session->quic_early_data_context.CopyFrom(
502 if (ssl->
ctx->dos_protection_cb != NULL &&
503 ssl->
ctx->dos_protection_cb(&client_hello) == 0) {
515 hs, ssl->
s3->session_reused
523 if (ssl->
s3->early_data_accepted) {
528 ssl->
s3->skip_early_data =
true;
531 if (!found_key_share) {
532 ssl->
method->next_message(ssl);
544 ssl->
method->next_message(ssl);
585 if (!ssl->
method->finish_message(ssl, cbb.get(), &hrr)) {
600 !ssl->
method->add_change_cipher_spec(ssl)) {
604 ssl->
s3->used_hello_retry_request =
true;
612 if (!ssl->
method->get_message(ssl, &
msg)) {
664 &encoded_client_hello_inner, &unused,
674 bssl::Array<uint8_t> client_hello_inner;
676 encoded_client_hello_inner,
698 if (ssl->
s3->session_reused) {
711 hs, &ticket, &binders, &client_ticket_age, &alert, &client_hello,
735 if (ssl->
method->has_unprocessed_handshake_data(ssl)) {
741 ssl->
method->next_message(ssl);
770 sizeof(ssl->
s3->server_random)) ||
779 !ssl->
method->finish_message(ssl, cbb.get(), &server_hello)) {
790 false, server_hello,
offset)) {
806 if (!ssl->
s3->used_hello_retry_request &&
807 !ssl->
method->add_change_cipher_spec(ssl)) {
820 if (!ssl->
method->init_message(ssl, cbb.get(), &body,
827 if (!ssl->
s3->session_reused) {
839 CBB cert_request_extensions, sigalg_contents, sigalgs_cbb;
840 if (!ssl->
method->init_message(ssl, cbb.get(), &body,
871 if (!ssl->
s3->session_reused) {
932 if (ssl->
s3->early_data_accepted) {
947 &finished_len,
false )) {
965 bool unused_sent_tickets;
980 if (ssl->
s3->early_data_accepted) {
1009 SSL *
const ssl = hs->
ssl;
1015 if (hs->
ssl->
s3->early_data_accepted) {
1017 if (!ssl->
method->get_message(ssl, &
msg)) {
1028 ssl->
method->next_message(ssl);
1042 SSL *
const ssl = hs->
ssl;
1046 !ssl->
s3->early_data_accepted) {
1048 if (!ssl->
method->get_message(ssl, &
msg)) {
1071 if (!application_settings.
present) {
1079 if (!hs->
new_session->peer_application_settings.CopyFrom(
1080 application_settings.
data) ||
1086 ssl->
method->next_message(ssl);
1094 SSL *
const ssl = hs->
ssl;
1096 if (!ssl->
s3->session_reused) {
1110 const bool allow_anonymous =
1113 if (!ssl->
method->get_message(ssl, &
msg)) {
1122 ssl->
method->next_message(ssl);
1128 SSL *
const ssl = hs->
ssl;
1136 if (!ssl->
method->get_message(ssl, &
msg)) {
1156 ssl->
method->next_message(ssl);
1162 SSL *
const ssl = hs->
ssl;
1169 if (!ssl->
method->get_message(ssl, &
msg)) {
1178 ssl->
method->next_message(ssl);
1184 SSL *
const ssl = hs->
ssl;
1186 if (!ssl->
method->get_message(ssl, &
msg)) {
1200 if (!ssl->
s3->early_data_accepted) {
1213 ssl->
method->next_message(ssl);
1311 return "TLS 1.3 server select_parameters";
1313 return "TLS 1.3 server select_session";
1315 return "TLS 1.3 server send_hello_retry_request";
1317 return "TLS 1.3 server read_second_client_hello";
1319 return "TLS 1.3 server send_server_hello";
1321 return "TLS 1.3 server send_server_certificate_verify";
1323 return "TLS 1.3 server send_half_rtt_ticket";
1325 return "TLS 1.3 server send_server_finished";
1327 return "TLS 1.3 server read_second_client_flight";
1329 return "TLS 1.3 server process_end_of_early_data";
1331 return "TLS 1.3 server read_client_encrypted_extensions";
1333 return "TLS 1.3 server read_client_certificate";
1335 return "TLS 1.3 server read_client_certificate_verify";
1337 return "TLS 1.3 server read_channel_id";
1339 return "TLS 1.3 server read_client_finished";
1341 return "TLS 1.3 server send_new_session_ticket";
1343 return "TLS 1.3 server done";
1346 return "TLS 1.3 server unknown";
bool tls13_add_finished(SSL_HANDSHAKE *hs)
void ssl_send_alert(SSL *ssl, int level, int desc)
enum ssl_hs_wait_t tls13_server_handshake(SSL_HANDSHAKE *hs)
bool ssl_ext_key_share_add_serverhello(SSL_HANDSHAKE *hs, CBB *out)
const uint8_t * cipher_suites
static enum ssl_hs_wait_t do_send_half_rtt_ticket(SSL_HANDSHAKE *hs)
static enum ssl_hs_wait_t do_select_parameters(SSL_HANDSHAKE *hs)
bool ssl_has_certificate(const SSL_HANDSHAKE *hs)
#define SSL_AD_UNEXPECTED_MESSAGE
@ state13_send_server_hello
bool UpdateForHelloRetryRequest()
@ state13_process_end_of_early_data
ssl_early_data_ticket_age_skew
bool tls13_derive_session_psk(SSL_SESSION *session, Span< const uint8_t > nonce)
bool InitHash(uint16_t version, const SSL_CIPHER *cipher)
UniquePtr< SSL_HANDSHAKE_HINTS > hints
#define SSL3_MT_SERVER_HELLO
@ state13_send_server_finished
bssl::Array< uint8_t > quic_early_data_context
Array< uint8_t > ech_client_hello_buf
#define SSL_R_MISSING_EXTENSION
#define SSL_R_NO_SHARED_GROUP
static enum ssl_hs_wait_t do_send_server_finished(SSL_HANDSHAKE *hs)
static enum ssl_hs_wait_t do_read_channel_id(SSL_HANDSHAKE *hs)
static enum ssl_hs_wait_t do_read_client_certificate(SSL_HANDSHAKE *hs)
const SSL_CIPHER * new_cipher
ssl_early_data_no_session_offered
#define SSL_R_CLIENTHELLO_PARSE_FAILED
#define SSL3_MT_CERTIFICATE_VERIFY
#define OPENSSL_PUT_ERROR(library, reason)
Span< uint8_t > early_traffic_secret()
#define TLSEXT_TYPE_early_data
#define CBB_add_u16_length_prefixed
bssl::UniquePtr< bssl::SSL_CONFIG > config
@ state13_read_second_client_flight
#define SSL_AD_INTERNAL_ERROR
Span< uint8_t > server_handshake_secret()
#define SSL_R_EXCESS_HANDSHAKE_DATA
ssl_early_data_alps_mismatch
#define ECH_CONFIRMATION_SIGNAL_LEN
bool tls13_verify_psk_binder(const SSL_HANDSHAKE *hs, const SSL_SESSION *session, const SSLMessage &msg, CBS *binders)
ssl_early_data_alpn_mismatch
Array< uint8_t > server_random
#define SSL3_MT_CERTIFICATE
#define SSL3_MT_ENCRYPTED_EXTENSIONS
@ state13_send_half_rtt_ticket
bool ssl_ext_key_share_parse_clienthello(SSL_HANDSHAKE *hs, bool *out_found, Span< const uint8_t > *out_peer_key, uint8_t *out_alert, const SSL_CLIENT_HELLO *client_hello)
static const char * cipher_suites
#define SSL_AD_ILLEGAL_PARAMETER
bool ssl_ech_accept_confirmation(const SSL_HANDSHAKE *hs, Span< uint8_t > out, Span< const uint8_t > client_random, const SSLTranscript &transcript, bool is_hrr, Span< const uint8_t > msg, size_t offset)
bool ssl_negotiate_alpn(SSL_HANDSHAKE *hs, uint8_t *out_alert, const SSL_CLIENT_HELLO *client_hello)
UniquePtr< SSL_SESSION > new_session
void ssl_get_current_time(const SSL *ssl, struct OPENSSL_timeval *out_clock)
bool tls13_add_certificate(SSL_HANDSHAKE *hs)
#define SSL3_MT_CLIENT_HELLO
@ state13_read_second_client_hello
#define SSL_CB_ACCEPT_LOOP
bool CopyFrom(Span< const T > in)
const SSL_QUIC_METHOD * quic_method
const SSL_CIPHER * ssl_choose_tls13_cipher(CBS cipher_suites, uint16_t version, uint16_t group_id)
#define EVP_HPKE_CTX_aead
#define SSL_R_CONNECTION_REJECTED
@ state13_read_client_certificate
bool tls13_process_certificate(SSL_HANDSHAKE *hs, const SSLMessage &msg, bool allow_anonymous)
bool tls13_finished_mac(SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, bool is_server)
#define SSL3_MT_CHANNEL_ID
static const SSL_CIPHER * choose_tls13_cipher(const SSL *ssl, const SSL_CLIENT_HELLO *client_hello, uint16_t group_id)
bool tls13_init_key_schedule(SSL_HANDSHAKE *hs, Span< const uint8_t > psk)
ssl_early_data_peer_declined
ScopedEVP_HPKE_CTX ech_hpke_ctx
uint16_t key_share_group_id
#define TLSEXT_TYPE_supported_versions
@ state13_send_server_certificate_verify
bool ssl_decode_client_hello_inner(SSL *ssl, uint8_t *out_alert, Array< uint8_t > *out_client_hello_inner, Span< const uint8_t > encoded_client_hello_inner, const SSL_CLIENT_HELLO *client_hello_outer)
static enum ssl_hs_wait_t do_read_client_finished(SSL_HANDSHAKE *hs)
uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]
const uint8_t kHelloRetryRequest[SSL3_RANDOM_SIZE]
#define SSL_R_DECRYPTION_FAILED
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
bool ssl_hash_message(SSL_HANDSHAKE *hs, const SSLMessage &msg)
@ ssl_hs_read_end_of_early_data
static enum ssl_hs_wait_t do_read_client_certificate_verify(SSL_HANDSHAKE *hs)
ssl_early_data_channel_id
bool channel_id_negotiated
#define CBB_add_u8_length_prefixed
@ ssl_hs_certificate_verify
static enum ssl_hs_wait_t do_send_hello_retry_request(SSL_HANDSHAKE *hs)
ssl_early_data_unsupported_for_session
@ state13_send_hello_retry_request
#define SSL3_MT_NEW_SESSION_TICKET
bool ssl_client_hello_get_extension(const SSL_CLIENT_HELLO *client_hello, CBS *out, uint16_t extension_type)
uint16_t ssl_get_grease_value(const SSL_HANDSHAKE *hs, enum ssl_grease_index_t index)
unsigned __int64 uint64_t
#define TLSEXT_TYPE_signature_algorithms
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
#define BSSL_NAMESPACE_END
#define SSL_SESSION_DUP_AUTH_ONLY
struct absl::base_internal::@2940::AllocList::Header header
Span< uint8_t > client_traffic_secret_0()
static bool resolve_ecdhe_secret(SSL_HANDSHAKE *hs, const SSL_CLIENT_HELLO *client_hello)
bool tls13_derive_early_secret(SSL_HANDSHAKE *hs)
bool ssl_negotiate_alps(SSL_HANDSHAKE *hs, uint8_t *out_alert, const SSL_CLIENT_HELLO *client_hello)
#define SSL_AD_MISSING_EXTENSION
bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs)
#define SSL_R_WRONG_CURVE
#define ERR_R_INTERNAL_ERROR
uint16_t ssl_protocol_version(const SSL *ssl)
#define TLSEXT_TYPE_key_share
static enum ssl_hs_wait_t do_send_new_session_ticket(SSL_HANDSHAKE *hs)
Span< uint8_t > expected_client_finished()
OPENSSL_EXPORT UniquePtr< SSL_SESSION > SSL_SESSION_dup(SSL_SESSION *session, int dup_flags)
static int ssl_ext_supported_versions_add_serverhello(SSL_HANDSHAKE *hs, CBB *out)
@ state13_read_client_certificate_verify
static enum ssl_hs_wait_t do_read_second_client_hello(SSL_HANDSHAKE *hs)
Span< uint8_t > server_traffic_secret_0()
static enum ssl_hs_wait_t do_process_end_of_early_data(SSL_HANDSHAKE *hs)
ssl_early_data_quic_parameter_mismatch
bool can_release_private_key
bool ssl_client_hello_init(const SSL *ssl, SSL_CLIENT_HELLO *out, Span< const uint8_t > body)
#define SSL_R_INCONSISTENT_CLIENT_HELLO
#define TLSEXT_TYPE_psk_key_exchange_modes
const uint8_t * session_id
static const size_t kMaxEarlyDataAccepted
enum ssl_ticket_aead_result_t ssl_process_ticket(SSL_HANDSHAKE *hs, UniquePtr< SSL_SESSION > *out_session, bool *out_renew_ticket, Span< const uint8_t > ticket, Span< const uint8_t > session_id)
Array< uint8_t > key_share_secret
bool tls13_advance_key_schedule(SSL_HANDSHAKE *hs, Span< const uint8_t > in)
bool GetClientHello(SSLMessage *out_msg, SSL_CLIENT_HELLO *out_client_hello)
void ssl_session_renew_timeout(SSL *ssl, SSL_SESSION *session, uint32_t timeout)
bool tls13_process_certificate_verify(SSL_HANDSHAKE *hs, const SSLMessage &msg)
OPENSSL_EXPORT bool CBBFinishArray(CBB *cbb, Array< uint8_t > *out)
static HAS_VIRTUAL_DESTRUCTOR UniquePtr< SSLKeyShare > Create(uint16_t group_id)
bool ssl_get_new_session(SSL_HANDSHAKE *hs)
static enum ssl_hs_wait_t do_read_client_encrypted_extensions(SSL_HANDSHAKE *hs)
#define SSL_R_NO_CERTIFICATE_SET
ssl_encryption_application
#define SSL_R_UNEXPECTED_COMPATIBILITY_MODE
@ ssl_hs_private_key_operation
bool ssl_has_client_CAs(const SSL_CONFIG *cfg)
Array< uint8_t > ecdh_public_key
#define SSL_R_NO_SHARED_CIPHER
#define SSL_AD_DECODE_ERROR
size_t ssl_ech_confirmation_signal_hello_offset(const SSL *ssl)
bool ssl_add_client_CA_list(SSL_HANDSHAKE *hs, CBB *cbb)
UniquePtr< SSL_SESSION > ret
#define CBS_get_u16_length_prefixed
#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT
ssl_early_data_hello_retry_request
bool Update(Span< const uint8_t > in)
bool ssl_check_message_type(SSL *ssl, const SSLMessage &msg, int type)
bool tls13_process_finished(SSL_HANDSHAKE *hs, const SSLMessage &msg, bool use_saved_value)
static bool quic_ticket_compatible(const SSL_SESSION *session, const SSL_CONFIG *config)
Array< uint8_t > key_share_public_key
void ssl_session_rebase_time(SSL *ssl, SSL_SESSION *session)
bool ssl_ext_pre_shared_key_parse_clienthello(SSL_HANDSHAKE *hs, CBS *out_ticket, CBS *out_binders, uint32_t *out_obfuscated_ticket_age, uint8_t *out_alert, const SSL_CLIENT_HELLO *client_hello, CBS *contents)
@ state13_read_channel_id
#define SSL_AD_HANDSHAKE_FAILURE
#define SSL_VERIFY_PEER_IF_NO_OBC
ssl_ticket_aead_ignore_ticket
bool ssl_client_hello_decrypt(EVP_HPKE_CTX *hpke_ctx, Array< uint8_t > *out, bool *out_is_decrypt_error, const SSL_CLIENT_HELLO *client_hello_outer, Span< const uint8_t > payload)
bool ssl_add_message_cbb(SSL *ssl, CBB *cbb)
static enum ssl_hs_wait_t do_select_session(SSL_HANDSHAKE *hs)
@ state13_select_parameters
const bssl::SSL_PROTOCOL_METHOD * method
Span< uint8_t > client_handshake_secret()
int ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out, const SSL_SESSION *session)
#define SSL3_MT_END_OF_EARLY_DATA
bool ssl_parse_extensions(const CBS *cbs, uint8_t *out_alert, std::initializer_list< SSLExtension * > extensions, bool ignore_unknown)
static enum ssl_hs_wait_t do_read_second_client_flight(SSL_HANDSHAKE *hs)
@ state13_read_client_encrypted_extensions
enum ssl_verify_result_t ssl_verify_peer_cert(SSL_HANDSHAKE *hs)
ssl_encryption_early_data
#define TLSEXT_TYPE_application_settings
static enum ssl_hs_wait_t do_send_server_certificate_verify(SSL_HANDSHAKE *hs)
#define TLSEXT_TYPE_encrypted_client_hello
Array< uint8_t > quic_early_data_context
const char * tls13_server_handshake_state(SSL_HANDSHAKE *hs)
static enum ssl_hs_wait_t do_send_server_hello(SSL_HANDSHAKE *hs)
#define SSL_R_DECODE_ERROR
bool tls1_get_shared_group(SSL_HANDSHAKE *hs, uint16_t *out_group_id)
bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs)
int ssl_session_is_resumable(const SSL_HANDSHAKE *hs, const SSL_SESSION *session)
bssl::UniquePtr< SSL_CTX > session_ctx
void ssl_do_info_callback(const SSL *ssl, int type, int value)
bool ssl_add_serverhello_tlsext(SSL_HANDSHAKE *hs, CBB *out)
static const int32_t kMaxTicketAgeSkewSeconds
#define TLSEXT_TYPE_pre_shared_key
static const BSSL_NAMESPACE_BEGIN uint8_t kZeroes[EVP_MAX_MD_SIZE]
bool tls1_verify_channel_id(SSL_HANDSHAKE *hs, const SSLMessage &msg)
bool tls13_set_traffic_key(SSL *ssl, enum ssl_encryption_level_t level, enum evp_aead_direction_t direction, const SSL_SESSION *session, Span< const uint8_t > traffic_secret)
static enum ssl_ticket_aead_result_t select_session(SSL_HANDSHAKE *hs, uint8_t *out_alert, UniquePtr< SSL_SESSION > *out_session, int32_t *out_ticket_age_skew, bool *out_offered_ticket, const SSLMessage &msg, const SSL_CLIENT_HELLO *client_hello)
#define SSL_SESSION_INCLUDE_NONAUTH
#define SSL_CIPHER_get_protocol_id
bssl::UniquePtr< SSL_CTX > ctx
@ state13_read_client_finished
#define SSL_AD_DECRYPT_ERROR
constexpr Span< T > MakeSpan(T *ptr, size_t size) noexcept
ssl_early_data_session_not_resumed
#define sk_CRYPTO_BUFFER_num
@ state13_send_new_session_ticket
bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs)
static bool add_new_session_tickets(SSL_HANDSHAKE *hs, bool *out_sent_tickets)
#define TLSEXT_TYPE_certificate_authorities
bool tls12_add_verify_sigalgs(const SSL_HANDSHAKE *hs, CBB *out)
enum ssl_private_key_result_t tls13_add_certificate_verify(SSL_HANDSHAKE *hs)
bool ssl_ext_pre_shared_key_add_serverhello(SSL_HANDSHAKE *hs, CBB *out)
#define SSL3_MT_CERTIFICATE_REQUEST
const EVP_MD * ssl_get_handshake_digest(uint16_t version, const SSL_CIPHER *cipher)
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
@ ssl_grease_ticket_extension
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:40