*/
int
_gnutls_negotiate_version(gnutls_session_t session,
- uint8_t major, uint8_t minor)
+ uint8_t major, uint8_t minor, unsigned allow_tls13)
{
const version_entry_st *vers;
const version_entry_st *aversion = nversion_to_entry(major, minor);
} else {
session->security_parameters.pversion = aversion;
+ /* we do not allow TLS1.3 negotiation using this mechanism */
+ if (aversion->tls13_sem && !allow_tls13) {
+ vers = _gnutls_legacy_version_max(session);
+ session->security_parameters.pversion = vers;
+ }
+
return 0;
}
}
* earlier, as TLS1.3 uses a different set of ciphersuites, and
* thus we cannot fallback.
*/
- ret = _gnutls_negotiate_version(session, major, minor);
+ ret = _gnutls_negotiate_version(session, major, minor, 0);
if (ret < 0) {
gnutls_assert();
return ret;
set_adv_version(session, major, minor);
- ret = _gnutls_negotiate_version(session, major, minor);
+ ret = _gnutls_negotiate_version(session, major, minor, 0);
if (ret < 0)
return gnutls_assert_val(ret);
- neg_version = get_num_version(session);
+ vers = get_version(session);
+ if (vers == NULL)
+ return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
+
+ neg_version = vers->id;
pos += 2;
unsigned int datalen, unsigned int scsv_only);
int _gnutls_negotiate_version(gnutls_session_t session,
- uint8_t major, uint8_t minor);
+ uint8_t major, uint8_t minor,
+ unsigned allow_tls13);
int _gnutls_user_hello_func(gnutls_session_t session,
uint8_t major, uint8_t minor);
uint8_t rnd[GNUTLS_RANDOM_SIZE], major, minor;
int len = datalen;
int neg_version;
+ const version_entry_st *vers;
uint16_t challenge;
uint8_t session_id[GNUTLS_MAX_SESSION_ID_SIZE];
minor = data[pos + 1];
set_adv_version(session, major, minor);
- ret = _gnutls_negotiate_version(session, major, minor);
+ ret = _gnutls_negotiate_version(session, major, minor, 0);
if (ret < 0) {
gnutls_assert();
return ret;
}
- neg_version = ret;
+
+ vers = get_version(session);
+ if (vers == NULL)
+ return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_VERSION_PACKET);
+
+ neg_version = vers->id;
pos += 2;