Update pre9
This commit is contained in:
@@ -1014,6 +1014,8 @@ static SSL_TICKET_STATUS tls_get_stateful_ticket(SSL *s, PACKET *tick,
|
||||
{
|
||||
SSL_SESSION *tmpsess = NULL;
|
||||
|
||||
s->ext.ticket_expected = 1;
|
||||
|
||||
switch (PACKET_remaining(tick)) {
|
||||
case 0:
|
||||
return SSL_TICKET_EMPTY;
|
||||
@@ -1031,7 +1033,6 @@ static SSL_TICKET_STATUS tls_get_stateful_ticket(SSL *s, PACKET *tick,
|
||||
if (tmpsess == NULL)
|
||||
return SSL_TICKET_NO_DECRYPT;
|
||||
|
||||
s->ext.ticket_expected = 1;
|
||||
*sess = tmpsess;
|
||||
return SSL_TICKET_SUCCESS;
|
||||
}
|
||||
|
||||
+3
-1
@@ -179,7 +179,9 @@ int ossl_statem_skip_early_data(SSL *s)
|
||||
if (s->ext.early_data != SSL_EARLY_DATA_REJECTED)
|
||||
return 0;
|
||||
|
||||
if (!s->server || s->statem.hand_state != TLS_ST_EARLY_DATA)
|
||||
if (!s->server
|
||||
|| s->statem.hand_state != TLS_ST_EARLY_DATA
|
||||
|| s->hello_retry_request == SSL_HRR_COMPLETE)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -1119,7 +1119,7 @@ int tls_construct_client_hello(SSL *s, WPACKET *pkt)
|
||||
}
|
||||
|
||||
if (sess == NULL
|
||||
|| !ssl_version_supported(s, sess->ssl_version)
|
||||
|| !ssl_version_supported(s, sess->ssl_version, NULL)
|
||||
|| !SSL_SESSION_is_resumable(sess)) {
|
||||
if (s->hello_retry_request == SSL_HRR_NONE
|
||||
&& !ssl_get_new_session(s, 0)) {
|
||||
|
||||
+48
-20
@@ -1485,6 +1485,40 @@ static int ssl_method_error(const SSL *s, const SSL_METHOD *method)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only called by servers. Returns 1 if the server has a TLSv1.3 capable
|
||||
* certificate type, or has PSK configured. Otherwise returns 0.
|
||||
*/
|
||||
static int is_tls13_capable(const SSL *s)
|
||||
{
|
||||
int i;
|
||||
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
if (s->psk_server_callback != NULL)
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
if (s->psk_find_session_cb != NULL)
|
||||
return 1;
|
||||
|
||||
for (i = 0; i < SSL_PKEY_NUM; i++) {
|
||||
/* Skip over certs disallowed for TLSv1.3 */
|
||||
switch (i) {
|
||||
case SSL_PKEY_DSA_SIGN:
|
||||
case SSL_PKEY_GOST01:
|
||||
case SSL_PKEY_GOST12_256:
|
||||
case SSL_PKEY_GOST12_512:
|
||||
continue;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (ssl_has_cert(s, i))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* ssl_version_supported - Check that the specified `version` is supported by
|
||||
* `SSL *` instance
|
||||
@@ -1494,7 +1528,7 @@ static int ssl_method_error(const SSL *s, const SSL_METHOD *method)
|
||||
*
|
||||
* Returns 1 when supported, otherwise 0
|
||||
*/
|
||||
int ssl_version_supported(const SSL *s, int version)
|
||||
int ssl_version_supported(const SSL *s, int version, const SSL_METHOD **meth)
|
||||
{
|
||||
const version_info *vent;
|
||||
const version_info *table;
|
||||
@@ -1514,9 +1548,14 @@ int ssl_version_supported(const SSL *s, int version)
|
||||
for (vent = table;
|
||||
vent->version != 0 && version_cmp(s, version, vent->version) <= 0;
|
||||
++vent) {
|
||||
if (vent->cmeth != NULL &&
|
||||
version_cmp(s, version, vent->version) == 0 &&
|
||||
ssl_method_error(s, vent->cmeth()) == 0) {
|
||||
if (vent->cmeth != NULL
|
||||
&& version_cmp(s, version, vent->version) == 0
|
||||
&& ssl_method_error(s, vent->cmeth()) == 0
|
||||
&& (!s->server
|
||||
|| version != TLS1_3_VERSION
|
||||
|| is_tls13_capable(s))) {
|
||||
if (meth != NULL)
|
||||
*meth = vent->cmeth();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -1625,11 +1664,11 @@ int ssl_set_version_bound(int method_version, int version, int *bound)
|
||||
static void check_for_downgrade(SSL *s, int vers, DOWNGRADE *dgrd)
|
||||
{
|
||||
if (vers == TLS1_2_VERSION
|
||||
&& ssl_version_supported(s, TLS1_3_VERSION)) {
|
||||
&& ssl_version_supported(s, TLS1_3_VERSION, NULL)) {
|
||||
*dgrd = DOWNGRADE_TO_1_2;
|
||||
} else if (!SSL_IS_DTLS(s) && vers < TLS1_2_VERSION
|
||||
&& (ssl_version_supported(s, TLS1_2_VERSION)
|
||||
|| ssl_version_supported(s, TLS1_3_VERSION))) {
|
||||
&& (ssl_version_supported(s, TLS1_2_VERSION, NULL)
|
||||
|| ssl_version_supported(s, TLS1_3_VERSION, NULL))) {
|
||||
*dgrd = DOWNGRADE_TO_1_1;
|
||||
} else {
|
||||
*dgrd = DOWNGRADE_NONE;
|
||||
@@ -1735,19 +1774,8 @@ int ssl_choose_server_version(SSL *s, CLIENTHELLO_MSG *hello, DOWNGRADE *dgrd)
|
||||
*/
|
||||
if (version_cmp(s, candidate_vers, best_vers) <= 0)
|
||||
continue;
|
||||
for (vent = table;
|
||||
vent->version != 0 && vent->version != (int)candidate_vers;
|
||||
++vent)
|
||||
continue;
|
||||
if (vent->version != 0 && vent->smeth != NULL) {
|
||||
const SSL_METHOD *method;
|
||||
|
||||
method = vent->smeth();
|
||||
if (ssl_method_error(s, method) == 0) {
|
||||
best_vers = candidate_vers;
|
||||
best_method = method;
|
||||
}
|
||||
}
|
||||
if (ssl_version_supported(s, candidate_vers, &best_method))
|
||||
best_vers = candidate_vers;
|
||||
}
|
||||
if (PACKET_remaining(&versionslist) != 0) {
|
||||
/* Trailing data? */
|
||||
|
||||
@@ -3649,8 +3649,6 @@ MSG_PROCESS_RETURN tls_process_client_certificate(SSL *s, PACKET *pkt)
|
||||
*/
|
||||
|
||||
if (s->post_handshake_auth == SSL_PHA_REQUESTED) {
|
||||
int m = s->session_ctx->session_cache_mode;
|
||||
|
||||
if ((new_sess = ssl_session_dup(s->session, 0)) == 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_PROCESS_CLIENT_CERTIFICATE,
|
||||
@@ -3658,13 +3656,6 @@ MSG_PROCESS_RETURN tls_process_client_certificate(SSL *s, PACKET *pkt)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (m & SSL_SESS_CACHE_SERVER) {
|
||||
/*
|
||||
* Remove the old session from the cache. We carry on if this fails
|
||||
*/
|
||||
SSL_CTX_remove_session(s->session_ctx, s->session);
|
||||
}
|
||||
|
||||
SSL_SESSION_free(s->session);
|
||||
s->session = new_sess;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user