Go to the documentation of this file.
151 #include "../crypto/internal.h"
168 return MakeUnique<SSL_SESSION>(x509_method);
176 if (session_id.
size() <
sizeof(tmp_storage)) {
179 session_id = tmp_storage;
197 new_session->is_server = session->
is_server;
199 new_session->is_quic = session->
is_quic;
206 new_session->cipher = session->
cipher;
210 new_session->psk_identity.reset(
212 if (new_session->psk_identity ==
nullptr) {
216 if (session->
certs !=
nullptr) {
223 if (new_session->certs ==
nullptr) {
228 if (!session->
x509_method->session_dup(new_session.get(), session)) {
235 new_session->signed_cert_timestamp_list =
244 new_session->timeout = session->
timeout;
246 new_session->time = session->
time;
254 new_session->group_id = session->
group_id;
259 new_session->original_handshake_hash_len =
267 if (!new_session->early_alpn.CopyFrom(session->
early_alpn) ||
268 !new_session->quic_early_data_context.CopyFrom(
270 !new_session->local_application_settings.CopyFrom(
272 !new_session->peer_application_settings.CopyFrom(
280 !new_session->ticket.CopyFrom(session->
ticket)) {
286 new_session->not_resumable =
true;
296 if (session->
time >
now.tv_sec) {
307 if (session->
timeout < delta) {
360 if (session == NULL) {
364 session->is_server = ssl->
server;
365 session->ssl_version = ssl->
version;
371 session->time =
now.tv_sec;
377 session->timeout = ssl->
session_ctx->session_psk_dhe_timeout;
382 session->timeout = ssl->
session_ctx->session_timeout;
383 session->auth_timeout = ssl->
session_ctx->session_timeout;
386 if (hs->
config->
cert->sid_ctx_length >
sizeof(session->sid_ctx)) {
392 session->sid_ctx_length = hs->
config->
cert->sid_ctx_length;
395 session->not_resumable =
true;
409 MutexReadLock lock(&
ctx->lock);
410 if (
ctx->ticket_key_current &&
411 (
ctx->ticket_key_current->next_rotation_tv_sec == 0 ||
412 ctx->ticket_key_current->next_rotation_tv_sec >
now.tv_sec) &&
413 (!
ctx->ticket_key_prev ||
414 ctx->ticket_key_prev->next_rotation_tv_sec >
now.tv_sec)) {
419 MutexWriteLock lock(&
ctx->lock);
420 if (!
ctx->ticket_key_current ||
421 (
ctx->ticket_key_current->next_rotation_tv_sec != 0 &&
422 ctx->ticket_key_current->next_rotation_tv_sec <=
now.tv_sec)) {
424 auto new_key = bssl::MakeUnique<TicketKey>();
431 new_key->next_rotation_tv_sec =
433 if (
ctx->ticket_key_current) {
437 ctx->ticket_key_current->next_rotation_tv_sec +=
445 if (
ctx->ticket_key_prev &&
446 ctx->ticket_key_prev->next_rotation_tv_sec <=
now.tv_sec) {
447 ctx->ticket_key_prev.reset();
455 size_t session_len) {
456 ScopedEVP_CIPHER_CTX
ctx;
461 static const size_t kMaxTicketOverhead =
463 if (session_len > 0xffff - kMaxTicketOverhead) {
464 static const char kTicketPlaceholder[] =
"TICKET TOO LARGE";
466 strlen(kTicketPlaceholder));
484 MutexReadLock lock(&tctx->
lock);
503 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
534 size_t session_len) {
537 const size_t max_overhead =
method->max_overhead(ssl);
538 const size_t max_out = session_len + max_overhead;
539 if (max_out < max_overhead) {
550 if (!
method->seal(ssl,
ptr, &out_len, max_out, session_buf,
585 if (session == NULL) {
595 if (session == NULL) {
603 if (
now.tv_sec < session->
time) {
612 const SSL *
const ssl = hs->
ssl;
646 out_session->reset();
652 UniquePtr<SSL_SESSION> session;
662 return key_id == sess_id ? 0 : 1;
666 session = UpRef(lh_SSL_SESSION_retrieve_key(ssl->
session_ctx->sessions,
672 if (!session && ssl->
session_ctx->get_session_cb !=
nullptr) {
711 UniquePtr<SSL_SESSION> *out_session,
712 bool *out_tickets_supported,
713 bool *out_renew_ticket,
717 UniquePtr<SSL_SESSION> session;
718 bool renew_ticket =
false;
722 const bool tickets_supported =
726 if (tickets_supported &&
CBS_len(&ticket) != 0) {
751 *out_tickets_supported = tickets_supported;
752 *out_renew_ticket = renew_ticket;
765 SSL_SESSION *found_session = lh_SSL_SESSION_retrieve(
ctx->sessions, session);
766 bool found = found_session == session;
768 found_session = lh_SSL_SESSION_delete(
ctx->sessions, session);
779 if (
ctx->remove_session_cb !=
nullptr) {
780 ctx->remove_session_cb(
ctx, found_session);
789 if (ssl->
session.get() == session) {
798 if (session->
next == NULL || session->
prev == NULL) {
806 ctx->session_cache_head = NULL;
807 ctx->session_cache_tail = NULL;
809 ctx->session_cache_tail = session->
prev;
815 ctx->session_cache_head = session->
next;
822 session->
prev = session->
next = NULL;
826 if (session->
next != NULL && session->
prev != NULL) {
830 if (
ctx->session_cache_head == NULL) {
831 ctx->session_cache_head = session;
832 ctx->session_cache_tail = session;
836 session->
next =
ctx->session_cache_head;
839 ctx->session_cache_head = session;
846 if (!lh_SSL_SESSION_insert(
ctx->sessions, &old_session, new_session)) {
854 session.reset(old_session);
856 if (old_session !=
nullptr) {
857 if (old_session == new_session) {
876 while (lh_SSL_SESSION_num_items(
ctx->sessions) >
900 UniquePtr<SSL_SESSION>
ref = UpRef(session);
901 bool remove_expired_sessions =
false;
903 MutexWriteLock lock(&
ctx->lock);
908 ctx->handshakes_since_cache_flush++;
909 if (
ctx->handshakes_since_cache_flush >= 255) {
910 remove_expired_sessions =
true;
911 ctx->handshakes_since_cache_flush = 0;
916 if (remove_expired_sessions) {
926 if (
ctx->new_session_cb !=
nullptr) {
927 UniquePtr<SSL_SESSION>
ref = UpRef(session);
928 if (
ctx->new_session_cb(ssl,
ref.get())) {
937 using namespace bssl;
941 extended_master_secret(
false),
942 peer_sha256_valid(
false),
943 not_resumable(
false),
944 ticket_age_add_valid(
false),
947 has_application_settings(
false) {
949 time = ::time(
nullptr);
967 if (session == NULL ||
978 if (out_len != NULL) {
1002 if (session == NULL) {
1006 return session->
time;
1015 return session->
certs.get();
1055 if (session == NULL) {
1059 session->
time = time;
1064 if (session == NULL) {
1074 unsigned *out_len) {
1075 if (out_len != NULL) {
1082 size_t sid_ctx_len) {
1083 if (sid_ctx_len >
sizeof(session->
sid_ctx)) {
1088 static_assert(
sizeof(session->
sid_ctx) < 256,
"sid_ctx_len does not fit");
1105 return !session->
ticket.empty();
1109 const uint8_t **out_ticket,
size_t *out_len) {
1110 if (out_ticket !=
nullptr) {
1111 *out_ticket = session->
ticket.data();
1113 *out_len = session->
ticket.size();
1117 size_t ticket_len) {
1134 const uint8_t **out_ptr,
size_t *out_len) {
1151 return UpRef(session).release();
1154 bssl::UniquePtr<SSL_SESSION>
copy =
1160 copy->ticket_max_early_data = 0;
1164 return copy.release();
1176 return ssl->
s3->established_session.get();
1217 UniquePtr<SSL_SESSION> owned_session = UpRef(session);
1218 MutexWriteLock lock(&
ctx->lock);
1228 if (ssl->
s3->initial_handshake_complete ||
1229 ssl->
s3->hs == NULL ||
1230 ssl->
s3->hs->state != 0) {
1258 return ctx->session_timeout;
1274 if (param->
time == 0 ||
1278 (void) lh_SSL_SESSION_delete(param->cache, session);
1293 tp.cache =
ctx->sessions;
1294 if (tp.cache == NULL) {
1298 MutexWriteLock lock(&
ctx->lock);
1304 ctx->new_session_cb =
cb;
1308 return ctx->new_session_cb;
1313 ctx->remove_session_cb =
cb;
1318 return ctx->remove_session_cb;
1323 int id_len,
int *out_copy)) {
1324 ctx->get_session_cb =
cb;
1331 return ctx->get_session_cb;
1336 ctx->info_callback =
cb;
1341 return ctx->info_callback;
uint16_t peer_signature_algorithm
bssl::Array< uint8_t > peer_application_settings
#define CRYPTO_BUFFER_free
int ssl_encrypt_ticket(SSL_HANDSHAKE *hs, CBB *out, const SSL_SESSION *session)
uint8_t sid_ctx[SSL_MAX_SID_CTX_LENGTH]
static const BSSL_NAMESPACE_BEGIN char g_pending_session_magic
const bssl::SSL_X509_METHOD * x509_method
SSL_SESSION * SSL_SESSION_copy_without_early_data(SSL_SESSION *session)
#define SSL_SESSION_DUP_ALL
static int OPENSSL_memcmp(const void *s1, const void *s2, size_t n)
void ssl_set_session(SSL *ssl, SSL_SESSION *session)
static CRYPTO_EX_DATA_CLASS g_ex_data_class
#define SSL_SESSION_INCLUDE_TICKET
bssl::Array< uint8_t > quic_early_data_context
int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from, void **from_d, int index, long argl, void *argp)
void * SSL_SESSION_get_ex_data(const SSL_SESSION *session, int idx)
uint32_t SSL_SESSION_get_timeout(const SSL_SESSION *session)
bssl::UniquePtr< bssl::TicketKey > ticket_key_current
#define SSL_SESS_CACHE_NO_INTERNAL_STORE
const SSL_CIPHER * new_cipher
int SSL_SESSION_is_resumable(const SSL_SESSION *session)
bool ssl_get_new_session(SSL_HANDSHAKE *hs)
#define OPENSSL_PUT_ERROR(library, reason)
#define SSL_R_SSL_SESSION_ID_TOO_LONG
#define SSL_SESS_CACHE_SERVER
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
size_t SSL_SESSION_get_master_key(const SSL_SESSION *session, uint8_t *out, size_t max_out)
int SSL_CTX_remove_session(SSL_CTX *ctx, SSL_SESSION *session)
const EVP_MD * ssl_session_get_digest(const SSL_SESSION *session)
#define CRYPTO_BUFFER_len
uint32_t SSL_CTX_set_timeout(SSL_CTX *ctx, uint32_t timeout)
uint16_t ssl_session_protocol_version(const SSL_SESSION *session)
#define SSL_SESS_CACHE_NO_AUTO_CLEAR
int(*)(SSL *ssl, SSL_SESSION *session) SSL_CTX_sess_get_new_cb(SSL_CTX *ctx)
SSL_SESSION * SSL_get1_session(SSL *ssl)
uint8_t original_handshake_hash_len
void SSL_CTX_set_session_psk_dhe_timeout(SSL_CTX *ctx, uint32_t timeout)
#define EVP_EncryptUpdate
UniquePtr< SSL_SESSION > early_session
int SSL_SESSION_set1_id(SSL_SESSION *session, const uint8_t *sid, size_t sid_len)
static void SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *session)
static struct test_ctx ctx
static void timeout_doall_arg(SSL_SESSION *session, void *void_param)
int(* ticket_key_cb)(SSL *ssl, uint8_t *name, uint8_t *iv, EVP_CIPHER_CTX *ectx, HMAC_CTX *hctx, int enc)
UniquePtr< SSL_SESSION > new_session
void ssl_get_current_time(const SSL *ssl, struct OPENSSL_timeval *out_clock)
#define CRYPTO_BUFFER_up_ref
#define EVP_CIPHER_CTX_iv_length
static void * OPENSSL_memset(void *dst, int c, size_t n)
bssl::Array< uint8_t > early_alpn
const SSL_QUIC_METHOD * quic_method
void SSL_SESSION_get0_ticket(const SSL_SESSION *session, const uint8_t **out_ticket, size_t *out_len)
int ssl_session_is_time_valid(const SSL *ssl, const SSL_SESSION *session)
bssl::UniquePtr< SSL_SESSION > session
void(*)(const SSL *ssl, int type, int value) SSL_CTX_get_info_callback(SSL_CTX *ctx)
CRYPTO_refcount_t references
void SSL_CTX_flush_sessions(SSL_CTX *ctx, uint64_t time)
SSL_SESSION * SSL_SESSION_new(const SSL_CTX *ctx)
int ssl_session_is_resumable(const SSL_HANDSHAKE *hs, const SSL_SESSION *session)
void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, SSL_SESSION *(*cb)(SSL *ssl, const uint8_t *id, int id_len, int *out_copy))
#define CRYPTO_free_ex_data
void SSL_SESSION_free(SSL_SESSION *session)
uint32_t SSL_SESSION_set_timeout(SSL_SESSION *session, uint32_t timeout)
int SSL_SESSION_early_data_capable(const SSL_SESSION *session)
bool ssl_protocol_version_from_wire(uint16_t *out, uint16_t version)
#define SSL_SESSION_get0_peer_certificates
int SSL_SESSION_set_ticket(SSL_SESSION *session, const uint8_t *ticket, size_t ticket_len)
SSL_SESSION *(*)(SSL *ssl, const uint8_t *id, int id_len, int *out_copy) SSL_CTX_sess_get_get_cb(SSL_CTX *ctx)
unsigned session_id_length
bssl::UniquePtr< char > psk_identity
SSL_SESSION * SSL_get_session(const SSL *ssl)
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
void ssl_ctx_get_current_time(const SSL_CTX *ctx, struct OPENSSL_timeval *out_clock)
void SSL_SESSION_get0_peer_sha256(const SSL_SESSION *session, const uint8_t **out_ptr, size_t *out_len)
static enum ssl_hs_wait_t ssl_lookup_session(SSL_HANDSHAKE *hs, UniquePtr< SSL_SESSION > *out_session, Span< const uint8_t > session_id)
const CBS size_t uint32_t key_id
bool ssl_client_hello_get_extension(const SSL_CLIENT_HELLO *client_hello, CBS *out, uint16_t extension_type)
void ssl_session_renew_timeout(SSL *ssl, SSL_SESSION *session, uint32_t timeout)
unsigned __int64 uint64_t
void SSL_SESSION_get0_signed_cert_timestamp_list(const SSL_SESSION *session, const uint8_t **out, size_t *out_len)
static bool add_session_locked(SSL_CTX *ctx, UniquePtr< SSL_SESSION > session)
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
#define BSSL_NAMESPACE_END
void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, int(*cb)(SSL *ssl, SSL_SESSION *session))
#define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG
int SSL_SESSION_set1_id_context(SSL_SESSION *session, const uint8_t *sid_ctx, size_t sid_ctx_len)
void(*)(SSL_CTX *ctx, SSL_SESSION *session) SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx)
const SSL_CIPHER * SSL_SESSION_get0_cipher(const SSL_SESSION *session)
#define ERR_R_INTERNAL_ERROR
uint16_t ssl_protocol_version(const SSL *ssl)
uint8_t peer_sha256[SHA256_DIGEST_LENGTH]
struct timeout_param_st TIMEOUT_PARAM
#define CRYPTO_new_ex_data
const uint8_t * SSL_SESSION_get0_id_context(const SSL_SESSION *session, unsigned *out_len)
#define SSL_DEFAULT_TICKET_KEY_ROTATION_INTERVAL
const SSL_CIPHER * cipher
uint32_t ticket_max_early_data
uint32_t SSL_SESSION_get_ticket_lifetime_hint(const SSL_SESSION *session)
#define SSL_DEFAULT_SESSION_TIMEOUT
uint32_t SSL_CTX_get_timeout(const SSL_CTX *ctx)
void ssl_session_rebase_time(SSL *ssl, SSL_SESSION *session)
int SSL_SESSION_should_be_single_use(const SSL_SESSION *session)
int SSL_SESSION_has_ticket(const SSL_SESSION *session)
#define SSL_SESS_CACHE_CLIENT
#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP
void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int index, long argl, void *argp)
int SSL_SESSION_set_ex_data(SSL_SESSION *session, int idx, void *arg)
#define X509_V_ERR_INVALID_CALL
#define EVP_EncryptInit_ex
#define SSL_SESSION_to_bytes_for_ticket
bssl::Array< uint8_t > ticket
int SSL_SESSION_up_ref(SSL_SESSION *session)
const uint8_t * session_id
#define SSL_R_SESSION_MAY_NOT_BE_CREATED
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)
#define CRYPTO_EX_DATA_CLASS_INIT_WITH_APP_DATA
#define CRYPTO_get_ex_data
bool has_application_settings
bool retain_only_sha256_of_client_certs
int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *session)
#define SSL_R_TICKET_ENCRYPTION_FAILED
#define sk_CRYPTO_BUFFER_deep_copy
#define CRYPTO_get_ex_new_index
uint32_t ticket_lifetime_hint
bool extended_master_secret
#define EVP_EncryptFinal_ex
SSL_SESSION * SSL_magic_pending_session_ptr(void)
uint64_t SSL_SESSION_get_time(const SSL_SESSION *session)
enum ssl_hs_wait_t ssl_get_prev_session(SSL_HANDSHAKE *hs, UniquePtr< SSL_SESSION > *out_session, bool *out_tickets_supported, bool *out_renew_ticket, const SSL_CLIENT_HELLO *client_hello)
int ssl_ctx_rotate_ticket_encryption_key(SSL_CTX *ctx)
bssl::Array< uint8_t > local_application_settings
int ssl_session_is_context_valid(const SSL_HANDSHAKE *hs, const SSL_SESSION *session)
const STACK_OF(CRYPTO_BUFFER) *SSL_SESSION_get0_peer_certificates(const SSL_SESSION *session)
UniquePtr< SSL_SESSION > ret
#define SHA256_DIGEST_LENGTH
#define SSL_MODE_NO_SESSION_CREATION
int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_unused *unused, CRYPTO_EX_dup *dup_unused, CRYPTO_EX_free *free_func)
bssl::UniquePtr< CRYPTO_BUFFER > signed_cert_timestamp_list
#define CRYPTO_MUTEX_lock_write
#define EVP_MAX_IV_LENGTH
static bool remove_session(SSL_CTX *ctx, SSL_SESSION *session, bool lock)
static void * OPENSSL_memmove(void *dst, const void *src, size_t n)
int SSL_set_session(SSL *ssl, SSL_SESSION *session)
ssl_ticket_aead_ignore_ticket
static int ssl_encrypt_ticket_with_method(SSL_HANDSHAKE *hs, CBB *out, const uint8_t *session_buf, size_t session_len)
#define TLSEXT_TYPE_session_ticket
static int ssl_encrypt_ticket_with_cipher_ctx(SSL_HANDSHAKE *hs, CBB *out, const uint8_t *session_buf, size_t session_len)
#define SSL_MAX_SSL_SESSION_ID_LENGTH
UniquePtr< SSL_SESSION > SSL_SESSION_dup(SSL_SESSION *session, int dup_flags)
bssl::UniquePtr< CRYPTO_BUFFER > ocsp_response
X509 * SSL_SESSION_get0_peer(const SSL_SESSION *session)
static void SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *session)
void ssl_update_cache(SSL *ssl)
uint32_t ssl_hash_session_id(Span< const uint8_t > session_id)
UniquePtr< SSL_SESSION > ssl_session_new(const SSL_X509_METHOD *x509_method)
#define CRYPTO_refcount_inc
#define SSL_CTX_sess_get_cache_size
bssl::UniquePtr< SSL_CTX > session_ctx
#define EVP_MAX_BLOCK_LENGTH
#define SSL_DEFAULT_SESSION_AUTH_TIMEOUT
ssl_session_st(const bssl::SSL_X509_METHOD *method)
#define CRYPTO_set_ex_data
void(* remove_session_cb)(SSL_CTX *ctx, SSL_SESSION *sess)
const OPENSSL_EXPORT EVP_CIPHER * EVP_aes_128_cbc(void)
#define SSL_SESSION_INCLUDE_NONAUTH
const uint8_t * SSL_SESSION_get_id(const SSL_SESSION *session, unsigned *out_len)
uint8_t original_handshake_hash[EVP_MAX_MD_SIZE]
bssl::UniquePtr< STACK_OF(CRYPTO_BUFFER)> certs
int SSL_SESSION_has_peer_sha256(const SSL_SESSION *session)
bssl::UniquePtr< SSL_CTX > ctx
LHASH_OF(SSL_SESSION) *cache
#define CRYPTO_MUTEX_unlock_write
#define sk_CRYPTO_BUFFER_num
uint8_t secret[SSL_MAX_MASTER_KEY_LENGTH]
void SSL_SESSION_get0_ocsp_response(const SSL_SESSION *session, const uint8_t **out, size_t *out_len)
OPENSSL_EXPORT pem_password_cb * cb
#define CRYPTO_BUFFER_data
uint8_t session_id[SSL_MAX_SSL_SESSION_ID_LENGTH]
uint64_t SSL_SESSION_set_time(SSL_SESSION *session, uint64_t time)
void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, void(*cb)(SSL_CTX *ctx, SSL_SESSION *session))
const EVP_MD * ssl_get_handshake_digest(uint16_t version, const SSL_CIPHER *cipher)
#define CRYPTO_refcount_dec_and_test_zero
void SSL_CTX_set_info_callback(SSL_CTX *ctx, void(*cb)(const SSL *ssl, int type, int value))
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:21