early-access version 2698
This commit is contained in:
92
externals/libressl/ssl/ssl_sess.c
vendored
92
externals/libressl/ssl/ssl_sess.c
vendored
@@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: ssl_sess.c,v 1.100 2020/09/19 09:56:35 tb Exp $ */
|
||||
/* $OpenBSD: ssl_sess.c,v 1.109 2022/01/11 19:03:15 jsing Exp $ */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
@@ -136,6 +136,7 @@
|
||||
*/
|
||||
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/opensslconf.h>
|
||||
|
||||
#ifndef OPENSSL_NO_ENGINE
|
||||
#include <openssl/engine.h>
|
||||
@@ -185,13 +186,13 @@ SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
|
||||
int
|
||||
SSL_SESSION_set_ex_data(SSL_SESSION *s, int idx, void *arg)
|
||||
{
|
||||
return (CRYPTO_set_ex_data(&s->internal->ex_data, idx, arg));
|
||||
return (CRYPTO_set_ex_data(&s->ex_data, idx, arg));
|
||||
}
|
||||
|
||||
void *
|
||||
SSL_SESSION_get_ex_data(const SSL_SESSION *s, int idx)
|
||||
{
|
||||
return (CRYPTO_get_ex_data(&s->internal->ex_data, idx));
|
||||
return (CRYPTO_get_ex_data(&s->ex_data, idx));
|
||||
}
|
||||
|
||||
uint32_t
|
||||
@@ -220,26 +221,21 @@ SSL_SESSION_new(void)
|
||||
SSLerrorx(ERR_R_MALLOC_FAILURE);
|
||||
return (NULL);
|
||||
}
|
||||
if ((ss->internal = calloc(1, sizeof(*ss->internal))) == NULL) {
|
||||
free(ss);
|
||||
SSLerrorx(ERR_R_MALLOC_FAILURE);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
ss->verify_result = 1; /* avoid 0 (= X509_V_OK) just in case */
|
||||
ss->references = 1;
|
||||
ss->timeout=60*5+4; /* 5 minute timeout by default */
|
||||
ss->time = time(NULL);
|
||||
ss->internal->prev = NULL;
|
||||
ss->internal->next = NULL;
|
||||
ss->prev = NULL;
|
||||
ss->next = NULL;
|
||||
ss->tlsext_hostname = NULL;
|
||||
|
||||
ss->internal->tlsext_ecpointformatlist_length = 0;
|
||||
ss->internal->tlsext_ecpointformatlist = NULL;
|
||||
ss->internal->tlsext_supportedgroups_length = 0;
|
||||
ss->internal->tlsext_supportedgroups = NULL;
|
||||
ss->tlsext_ecpointformatlist_length = 0;
|
||||
ss->tlsext_ecpointformatlist = NULL;
|
||||
ss->tlsext_supportedgroups_length = 0;
|
||||
ss->tlsext_supportedgroups = NULL;
|
||||
|
||||
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->internal->ex_data);
|
||||
CRYPTO_new_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
|
||||
|
||||
return (ss);
|
||||
}
|
||||
@@ -345,6 +341,7 @@ ssl_get_new_session(SSL *s, int session)
|
||||
case TLS1_1_VERSION:
|
||||
case TLS1_2_VERSION:
|
||||
case DTLS1_VERSION:
|
||||
case DTLS1_2_VERSION:
|
||||
ss->ssl_version = s->version;
|
||||
ss->session_id_length = SSL3_SSL_SESSION_ID_LENGTH;
|
||||
break;
|
||||
@@ -736,7 +733,7 @@ remove_session_lock(SSL_CTX *ctx, SSL_SESSION *c, int lck)
|
||||
CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
|
||||
|
||||
if (ret) {
|
||||
r->internal->not_resumable = 1;
|
||||
r->not_resumable = 1;
|
||||
if (ctx->internal->remove_session_cb != NULL)
|
||||
ctx->internal->remove_session_cb(ctx, r);
|
||||
SSL_SESSION_free(r);
|
||||
@@ -758,23 +755,22 @@ SSL_SESSION_free(SSL_SESSION *ss)
|
||||
if (i > 0)
|
||||
return;
|
||||
|
||||
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->internal->ex_data);
|
||||
CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_SESSION, ss, &ss->ex_data);
|
||||
|
||||
explicit_bzero(ss->master_key, sizeof ss->master_key);
|
||||
explicit_bzero(ss->session_id, sizeof ss->session_id);
|
||||
|
||||
ssl_sess_cert_free(ss->internal->sess_cert);
|
||||
sk_X509_pop_free(ss->cert_chain, X509_free);
|
||||
|
||||
X509_free(ss->peer);
|
||||
X509_free(ss->peer_cert);
|
||||
|
||||
sk_SSL_CIPHER_free(ss->ciphers);
|
||||
|
||||
free(ss->tlsext_hostname);
|
||||
free(ss->tlsext_tick);
|
||||
free(ss->internal->tlsext_ecpointformatlist);
|
||||
free(ss->internal->tlsext_supportedgroups);
|
||||
free(ss->tlsext_ecpointformatlist);
|
||||
free(ss->tlsext_supportedgroups);
|
||||
|
||||
freezero(ss->internal, sizeof(*ss->internal));
|
||||
freezero(ss, sizeof(*ss));
|
||||
}
|
||||
|
||||
@@ -797,7 +793,7 @@ SSL_set_session(SSL *s, SSL_SESSION *session)
|
||||
return SSL_set_ssl_method(s, s->ctx->method);
|
||||
}
|
||||
|
||||
if ((method = ssl_get_client_method(session->ssl_version)) == NULL) {
|
||||
if ((method = ssl_get_method(session->ssl_version)) == NULL) {
|
||||
SSLerror(s, SSL_R_UNABLE_TO_FIND_SSL_METHOD);
|
||||
return (0);
|
||||
}
|
||||
@@ -872,10 +868,16 @@ SSL_SESSION_get_protocol_version(const SSL_SESSION *s)
|
||||
return s->ssl_version;
|
||||
}
|
||||
|
||||
const SSL_CIPHER *
|
||||
SSL_SESSION_get0_cipher(const SSL_SESSION *s)
|
||||
{
|
||||
return s->cipher;
|
||||
}
|
||||
|
||||
X509 *
|
||||
SSL_SESSION_get0_peer(SSL_SESSION *s)
|
||||
{
|
||||
return s->peer;
|
||||
return s->peer_cert;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -905,6 +907,12 @@ SSL_SESSION_set1_id_context(SSL_SESSION *s, const unsigned char *sid_ctx,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
SSL_SESSION_is_resumable(const SSL_SESSION *s)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
long
|
||||
SSL_CTX_set_timeout(SSL_CTX *s, long t)
|
||||
{
|
||||
@@ -993,7 +1001,7 @@ timeout_doall_arg(SSL_SESSION *s, TIMEOUT_PARAM *p)
|
||||
* save on locking overhead */
|
||||
(void)lh_SSL_SESSION_delete(p->cache, s);
|
||||
SSL_SESSION_list_remove(p->ctx, s);
|
||||
s->internal->not_resumable = 1;
|
||||
s->not_resumable = 1;
|
||||
if (p->ctx->internal->remove_session_cb != NULL)
|
||||
p->ctx->internal->remove_session_cb(p->ctx, s);
|
||||
SSL_SESSION_free(s);
|
||||
@@ -1045,50 +1053,50 @@ ssl_clear_bad_session(SSL *s)
|
||||
static void
|
||||
SSL_SESSION_list_remove(SSL_CTX *ctx, SSL_SESSION *s)
|
||||
{
|
||||
if ((s->internal->next == NULL) || (s->internal->prev == NULL))
|
||||
if (s->next == NULL || s->prev == NULL)
|
||||
return;
|
||||
|
||||
if (s->internal->next == (SSL_SESSION *)&(ctx->internal->session_cache_tail)) {
|
||||
if (s->next == (SSL_SESSION *)&(ctx->internal->session_cache_tail)) {
|
||||
/* last element in list */
|
||||
if (s->internal->prev == (SSL_SESSION *)&(ctx->internal->session_cache_head)) {
|
||||
if (s->prev == (SSL_SESSION *)&(ctx->internal->session_cache_head)) {
|
||||
/* only one element in list */
|
||||
ctx->internal->session_cache_head = NULL;
|
||||
ctx->internal->session_cache_tail = NULL;
|
||||
} else {
|
||||
ctx->internal->session_cache_tail = s->internal->prev;
|
||||
s->internal->prev->internal->next =
|
||||
ctx->internal->session_cache_tail = s->prev;
|
||||
s->prev->next =
|
||||
(SSL_SESSION *)&(ctx->internal->session_cache_tail);
|
||||
}
|
||||
} else {
|
||||
if (s->internal->prev == (SSL_SESSION *)&(ctx->internal->session_cache_head)) {
|
||||
if (s->prev == (SSL_SESSION *)&(ctx->internal->session_cache_head)) {
|
||||
/* first element in list */
|
||||
ctx->internal->session_cache_head = s->internal->next;
|
||||
s->internal->next->internal->prev =
|
||||
ctx->internal->session_cache_head = s->next;
|
||||
s->next->prev =
|
||||
(SSL_SESSION *)&(ctx->internal->session_cache_head);
|
||||
} else {
|
||||
/* middle of list */
|
||||
s->internal->next->internal->prev = s->internal->prev;
|
||||
s->internal->prev->internal->next = s->internal->next;
|
||||
s->next->prev = s->prev;
|
||||
s->prev->next = s->next;
|
||||
}
|
||||
}
|
||||
s->internal->prev = s->internal->next = NULL;
|
||||
s->prev = s->next = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
SSL_SESSION_list_add(SSL_CTX *ctx, SSL_SESSION *s)
|
||||
{
|
||||
if ((s->internal->next != NULL) && (s->internal->prev != NULL))
|
||||
if (s->next != NULL && s->prev != NULL)
|
||||
SSL_SESSION_list_remove(ctx, s);
|
||||
|
||||
if (ctx->internal->session_cache_head == NULL) {
|
||||
ctx->internal->session_cache_head = s;
|
||||
ctx->internal->session_cache_tail = s;
|
||||
s->internal->prev = (SSL_SESSION *)&(ctx->internal->session_cache_head);
|
||||
s->internal->next = (SSL_SESSION *)&(ctx->internal->session_cache_tail);
|
||||
s->prev = (SSL_SESSION *)&(ctx->internal->session_cache_head);
|
||||
s->next = (SSL_SESSION *)&(ctx->internal->session_cache_tail);
|
||||
} else {
|
||||
s->internal->next = ctx->internal->session_cache_head;
|
||||
s->internal->next->internal->prev = s;
|
||||
s->internal->prev = (SSL_SESSION *)&(ctx->internal->session_cache_head);
|
||||
s->next = ctx->internal->session_cache_head;
|
||||
s->next->prev = s;
|
||||
s->prev = (SSL_SESSION *)&(ctx->internal->session_cache_head);
|
||||
ctx->internal->session_cache_head = s;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user