Update pre10
This commit is contained in:
+2
-1
@@ -947,7 +947,8 @@ static int ssl_security_default_callback(const SSL *s, const SSL_CTX *ctx,
|
||||
if (level >= 2 && c->algorithm_enc == SSL_RC4)
|
||||
return 0;
|
||||
/* Level 3: forward secure ciphersuites only */
|
||||
if (level >= 3 && !(c->algorithm_mkey & (SSL_kEDH | SSL_kEECDH)))
|
||||
if (level >= 3 && (c->min_tls != TLS1_3_VERSION ||
|
||||
!(c->algorithm_mkey & (SSL_kEDH | SSL_kEECDH))))
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
|
||||
+8
-2
@@ -702,6 +702,7 @@ SSL *SSL_new(SSL_CTX *ctx)
|
||||
s->max_early_data = ctx->max_early_data;
|
||||
s->recv_max_early_data = ctx->recv_max_early_data;
|
||||
s->num_tickets = ctx->num_tickets;
|
||||
s->pha_enabled = ctx->pha_enabled;
|
||||
|
||||
/* Shallow copy of the ciphersuites stack */
|
||||
s->tls13_ciphersuites = sk_SSL_CIPHER_dup(ctx->tls13_ciphersuites);
|
||||
@@ -5523,9 +5524,14 @@ int SSL_stateless(SSL *s)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void SSL_force_post_handshake_auth(SSL *ssl)
|
||||
void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val)
|
||||
{
|
||||
ssl->pha_forced = 1;
|
||||
ctx->pha_enabled = val;
|
||||
}
|
||||
|
||||
void SSL_set_post_handshake_auth(SSL *ssl, int val)
|
||||
{
|
||||
ssl->pha_enabled = val;
|
||||
}
|
||||
|
||||
int SSL_verify_client_post_handshake(SSL *ssl)
|
||||
|
||||
+5
-2
@@ -1100,6 +1100,9 @@ struct ssl_ctx_st {
|
||||
/* Callback to determine if early_data is acceptable or not */
|
||||
SSL_allow_early_data_cb_fn allow_early_data_cb;
|
||||
void *allow_early_data_cb_data;
|
||||
|
||||
/* Do we advertise Post-handshake auth support? */
|
||||
int pha_enabled;
|
||||
};
|
||||
|
||||
struct ssl_st {
|
||||
@@ -1430,7 +1433,7 @@ struct ssl_st {
|
||||
int key_update;
|
||||
/* Post-handshake authentication state */
|
||||
SSL_PHA_STATE post_handshake_auth;
|
||||
int pha_forced;
|
||||
int pha_enabled;
|
||||
uint8_t* pha_context;
|
||||
size_t pha_context_len;
|
||||
int certreqs_sent;
|
||||
@@ -2427,7 +2430,7 @@ __owur int ssl_choose_server_version(SSL *s, CLIENTHELLO_MSG *hello,
|
||||
__owur int ssl_choose_client_version(SSL *s, int version,
|
||||
RAW_EXTENSION *extensions);
|
||||
__owur int ssl_get_min_max_version(const SSL *s, int *min_version,
|
||||
int *max_version);
|
||||
int *max_version, int *real_max);
|
||||
|
||||
__owur long tls1_default_timeout(void);
|
||||
__owur int dtls1_do_write(SSL *s, int type);
|
||||
|
||||
@@ -810,7 +810,7 @@ int tls_construct_extensions(SSL *s, WPACKET *pkt, unsigned int context,
|
||||
}
|
||||
|
||||
if ((context & SSL_EXT_CLIENT_HELLO) != 0) {
|
||||
reason = ssl_get_min_max_version(s, &min_version, &max_version);
|
||||
reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
|
||||
if (reason != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_EXTENSIONS,
|
||||
reason);
|
||||
|
||||
@@ -507,7 +507,7 @@ EXT_RETURN tls_construct_ctos_supported_versions(SSL *s, WPACKET *pkt,
|
||||
{
|
||||
int currv, min_version, max_version, reason;
|
||||
|
||||
reason = ssl_get_min_max_version(s, &min_version, &max_version);
|
||||
reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL);
|
||||
if (reason != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
|
||||
SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS, reason);
|
||||
@@ -1210,23 +1210,8 @@ EXT_RETURN tls_construct_ctos_post_handshake_auth(SSL *s, WPACKET *pkt,
|
||||
X509 *x, size_t chainidx)
|
||||
{
|
||||
#ifndef OPENSSL_NO_TLS1_3
|
||||
if (!s->pha_forced) {
|
||||
int i, n = 0;
|
||||
|
||||
/* check for cert, if present, we can do post-handshake auth */
|
||||
if (s->cert == NULL)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
|
||||
for (i = 0; i < SSL_PKEY_NUM; i++) {
|
||||
if (s->cert->pkeys[i].x509 != NULL
|
||||
&& s->cert->pkeys[i].privatekey != NULL)
|
||||
n++;
|
||||
}
|
||||
|
||||
/* no identity certificates, so no extension */
|
||||
if (n == 0)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
}
|
||||
if (!s->pha_enabled)
|
||||
return EXT_RETURN_NOT_SENT;
|
||||
|
||||
/* construct extension - 0 length, no contents */
|
||||
if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_post_handshake_auth)
|
||||
|
||||
+88
-65
@@ -105,7 +105,7 @@ int tls_setup_handshake(SSL *s)
|
||||
* enabled. For clients we do this check during construction of the
|
||||
* ClientHello.
|
||||
*/
|
||||
if (ssl_get_min_max_version(s, &ver_min, &ver_max) != 0) {
|
||||
if (ssl_get_min_max_version(s, &ver_min, &ver_max, NULL) != 0) {
|
||||
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_SETUP_HANDSHAKE,
|
||||
ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
@@ -1665,9 +1665,16 @@ static void check_for_downgrade(SSL *s, int vers, DOWNGRADE *dgrd)
|
||||
if (vers == TLS1_2_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, NULL)
|
||||
|| ssl_version_supported(s, TLS1_3_VERSION, NULL))) {
|
||||
} else if (!SSL_IS_DTLS(s)
|
||||
&& vers < TLS1_2_VERSION
|
||||
/*
|
||||
* We need to ensure that a server that disables TLSv1.2
|
||||
* (creating a hole between TLSv1.3 and TLSv1.1) can still
|
||||
* complete handshakes with clients that support TLSv1.2 and
|
||||
* below. Therefore we do not enable the sentinel if TLSv1.3 is
|
||||
* enabled and TLSv1.2 is not.
|
||||
*/
|
||||
&& ssl_version_supported(s, TLS1_2_VERSION, NULL)) {
|
||||
*dgrd = DOWNGRADE_TO_1_1;
|
||||
} else {
|
||||
*dgrd = DOWNGRADE_NONE;
|
||||
@@ -1857,8 +1864,7 @@ int ssl_choose_client_version(SSL *s, int version, RAW_EXTENSION *extensions)
|
||||
{
|
||||
const version_info *vent;
|
||||
const version_info *table;
|
||||
int highver = 0;
|
||||
int origv;
|
||||
int ret, ver_min, ver_max, real_max, origv;
|
||||
|
||||
origv = s->version;
|
||||
s->version = version;
|
||||
@@ -1905,65 +1911,62 @@ int ssl_choose_client_version(SSL *s, int version, RAW_EXTENSION *extensions)
|
||||
break;
|
||||
}
|
||||
|
||||
ret = ssl_get_min_max_version(s, &ver_min, &ver_max, &real_max);
|
||||
if (ret != 0) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION, ret);
|
||||
return 0;
|
||||
}
|
||||
if (SSL_IS_DTLS(s) ? DTLS_VERSION_LT(s->version, ver_min)
|
||||
: s->version < ver_min) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION, SSL_R_UNSUPPORTED_PROTOCOL);
|
||||
return 0;
|
||||
} else if (SSL_IS_DTLS(s) ? DTLS_VERSION_GT(s->version, ver_max)
|
||||
: s->version > ver_max) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION, SSL_R_UNSUPPORTED_PROTOCOL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((s->mode & SSL_MODE_SEND_FALLBACK_SCSV) == 0)
|
||||
real_max = ver_max;
|
||||
|
||||
/* Check for downgrades */
|
||||
if (s->version == TLS1_2_VERSION && real_max > s->version) {
|
||||
if (memcmp(tls12downgrade,
|
||||
s->s3->server_random + SSL3_RANDOM_SIZE
|
||||
- sizeof(tls12downgrade),
|
||||
sizeof(tls12downgrade)) == 0) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION,
|
||||
SSL_R_INAPPROPRIATE_FALLBACK);
|
||||
return 0;
|
||||
}
|
||||
} else if (!SSL_IS_DTLS(s)
|
||||
&& s->version < TLS1_2_VERSION
|
||||
&& real_max > s->version) {
|
||||
if (memcmp(tls11downgrade,
|
||||
s->s3->server_random + SSL3_RANDOM_SIZE
|
||||
- sizeof(tls11downgrade),
|
||||
sizeof(tls11downgrade)) == 0) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION,
|
||||
SSL_R_INAPPROPRIATE_FALLBACK);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (vent = table; vent->version != 0; ++vent) {
|
||||
const SSL_METHOD *method;
|
||||
int err;
|
||||
|
||||
if (vent->cmeth == NULL)
|
||||
if (vent->cmeth == NULL || s->version != vent->version)
|
||||
continue;
|
||||
|
||||
if (highver != 0 && s->version != vent->version)
|
||||
continue;
|
||||
|
||||
if (highver == 0 && (s->mode & SSL_MODE_SEND_FALLBACK_SCSV) != 0)
|
||||
highver = vent->version;
|
||||
|
||||
method = vent->cmeth();
|
||||
err = ssl_method_error(s, method);
|
||||
if (err != 0) {
|
||||
if (s->version == vent->version) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_PROTOCOL_VERSION,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION, err);
|
||||
return 0;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
if (highver == 0)
|
||||
highver = vent->version;
|
||||
|
||||
if (s->version != vent->version)
|
||||
continue;
|
||||
|
||||
/* Check for downgrades */
|
||||
if (s->version == TLS1_2_VERSION && highver > s->version) {
|
||||
if (memcmp(tls12downgrade,
|
||||
s->s3->server_random + SSL3_RANDOM_SIZE
|
||||
- sizeof(tls12downgrade),
|
||||
sizeof(tls12downgrade)) == 0) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION,
|
||||
SSL_R_INAPPROPRIATE_FALLBACK);
|
||||
return 0;
|
||||
}
|
||||
} else if (!SSL_IS_DTLS(s)
|
||||
&& s->version < TLS1_2_VERSION
|
||||
&& highver > s->version) {
|
||||
if (memcmp(tls11downgrade,
|
||||
s->s3->server_random + SSL3_RANDOM_SIZE
|
||||
- sizeof(tls11downgrade),
|
||||
sizeof(tls11downgrade)) == 0) {
|
||||
s->version = origv;
|
||||
SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER,
|
||||
SSL_F_SSL_CHOOSE_CLIENT_VERSION,
|
||||
SSL_R_INAPPROPRIATE_FALLBACK);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
s->method = method;
|
||||
s->method = vent->cmeth();
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1978,6 +1981,9 @@ int ssl_choose_client_version(SSL *s, int version, RAW_EXTENSION *extensions)
|
||||
* @s: The SSL connection
|
||||
* @min_version: The minimum supported version
|
||||
* @max_version: The maximum supported version
|
||||
* @real_max: The highest version below the lowest compile time version hole
|
||||
* where that hole lies above at least one run-time enabled
|
||||
* protocol.
|
||||
*
|
||||
* Work out what version we should be using for the initial ClientHello if the
|
||||
* version is initially (D)TLS_ANY_VERSION. We apply any explicit SSL_OP_NO_xxx
|
||||
@@ -1992,9 +1998,10 @@ int ssl_choose_client_version(SSL *s, int version, RAW_EXTENSION *extensions)
|
||||
* Returns 0 on success or an SSL error reason number on failure. On failure
|
||||
* min_version and max_version will also be set to 0.
|
||||
*/
|
||||
int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version)
|
||||
int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version,
|
||||
int *real_max)
|
||||
{
|
||||
int version;
|
||||
int version, tmp_real_max;
|
||||
int hole;
|
||||
const SSL_METHOD *single = NULL;
|
||||
const SSL_METHOD *method;
|
||||
@@ -2011,6 +2018,12 @@ int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version)
|
||||
* ssl_method_error(s, s->method)
|
||||
*/
|
||||
*min_version = *max_version = s->version;
|
||||
/*
|
||||
* Providing a real_max only makes sense where we're using a version
|
||||
* flexible method.
|
||||
*/
|
||||
if (!ossl_assert(real_max == NULL))
|
||||
return ERR_R_INTERNAL_ERROR;
|
||||
return 0;
|
||||
case TLS_ANY_VERSION:
|
||||
table = tls_version_table;
|
||||
@@ -2043,6 +2056,9 @@ int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version)
|
||||
*/
|
||||
*min_version = version = 0;
|
||||
hole = 1;
|
||||
if (real_max != NULL)
|
||||
*real_max = 0;
|
||||
tmp_real_max = 0;
|
||||
for (vent = table; vent->version != 0; ++vent) {
|
||||
/*
|
||||
* A table entry with a NULL client method is still a hole in the
|
||||
@@ -2050,15 +2066,22 @@ int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version)
|
||||
*/
|
||||
if (vent->cmeth == NULL) {
|
||||
hole = 1;
|
||||
tmp_real_max = 0;
|
||||
continue;
|
||||
}
|
||||
method = vent->cmeth();
|
||||
|
||||
if (hole == 1 && tmp_real_max == 0)
|
||||
tmp_real_max = vent->version;
|
||||
|
||||
if (ssl_method_error(s, method) != 0) {
|
||||
hole = 1;
|
||||
} else if (!hole) {
|
||||
single = NULL;
|
||||
*min_version = method->version;
|
||||
} else {
|
||||
if (real_max != NULL && tmp_real_max != 0)
|
||||
*real_max = tmp_real_max;
|
||||
version = (single = method)->version;
|
||||
*min_version = version;
|
||||
hole = 0;
|
||||
@@ -2093,7 +2116,7 @@ int ssl_set_client_hello_version(SSL *s)
|
||||
if (!SSL_IS_FIRST_HANDSHAKE(s))
|
||||
return 0;
|
||||
|
||||
ret = ssl_get_min_max_version(s, &ver_min, &ver_max);
|
||||
ret = ssl_get_min_max_version(s, &ver_min, &ver_max, NULL);
|
||||
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
+1
-1
@@ -1103,7 +1103,7 @@ int ssl_set_client_disabled(SSL *s)
|
||||
s->s3->tmp.mask_k = 0;
|
||||
ssl_set_sig_mask(&s->s3->tmp.mask_a, s, SSL_SECOP_SIGALG_MASK);
|
||||
if (ssl_get_min_max_version(s, &s->s3->tmp.min_ver,
|
||||
&s->s3->tmp.max_ver) != 0)
|
||||
&s->s3->tmp.max_ver, NULL) != 0)
|
||||
return 0;
|
||||
#ifndef OPENSSL_NO_PSK
|
||||
/* with PSK there must be client callback set */
|
||||
|
||||
Reference in New Issue
Block a user