Update key share extension number for draft23.
Change-Id: I7561fc7e04d726ea9e26f645da10e45b62a20627
Reviewed-on: https://boringssl-review.googlesource.com/24704
Commit-Queue: Steven Valdez <svaldez@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h
index 6ab1682..92a502d 100644
--- a/include/openssl/ssl.h
+++ b/include/openssl/ssl.h
@@ -592,6 +592,7 @@
#define DTLS1_2_VERSION 0xfefd
#define TLS1_3_DRAFT22_VERSION 0x7f16
+#define TLS1_3_DRAFT23_VERSION 0x7f17
#define TLS1_3_EXPERIMENT2_VERSION 0x7e02
// SSL_CTX_set_min_proto_version sets the minimum protocol version for |ctx| to
@@ -3228,6 +3229,7 @@
enum tls13_variant_t {
tls13_default = 0,
tls13_experiment2 = 1,
+ tls13_draft22 = 2,
};
// SSL_CTX_set_tls13_variant sets which variant of TLS 1.3 we negotiate. On the
diff --git a/include/openssl/tls1.h b/include/openssl/tls1.h
index f62ee1f..2238043 100644
--- a/include/openssl/tls1.h
+++ b/include/openssl/tls1.h
@@ -207,7 +207,7 @@
// ExtensionType values from draft-ietf-tls-tls13-18
#define TLSEXT_TYPE_supported_groups 10
-#define TLSEXT_TYPE_key_share 40
+#define TLSEXT_TYPE_old_key_share 40
#define TLSEXT_TYPE_pre_shared_key 41
#define TLSEXT_TYPE_early_data 42
#define TLSEXT_TYPE_supported_versions 43
@@ -215,6 +215,7 @@
#define TLSEXT_TYPE_psk_key_exchange_modes 45
#define TLSEXT_TYPE_ticket_early_data_info 46
#define TLSEXT_TYPE_certificate_authorities 47
+#define TLSEXT_TYPE_new_key_share 51
// ExtensionType value from RFC5746
#define TLSEXT_TYPE_renegotiate 0xff01
diff --git a/ssl/internal.h b/ssl/internal.h
index d59ecc4..bbefd48 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -392,32 +392,17 @@
// call this function before the version is determined.
uint16_t ssl_protocol_version(const SSL *ssl);
-// ssl_is_draft21 returns whether the version corresponds to a draft21 TLS 1.3
-// variant.
-bool ssl_is_draft21(uint16_t version);
-
// ssl_is_draft22 returns whether the version corresponds to a draft22 TLS 1.3
// variant.
bool ssl_is_draft22(uint16_t version);
-// ssl_is_resumption_experiment returns whether the version corresponds to a
-// TLS 1.3 resumption experiment.
-bool ssl_is_resumption_experiment(uint16_t version);
+// ssl_is_draft23 returns whether the version corresponds to a draft23 TLS 1.3
+// variant.
+bool ssl_is_draft23(uint16_t version);
-// ssl_is_resumption_variant returns whether the variant corresponds to a
-// TLS 1.3 resumption experiment.
-bool ssl_is_resumption_variant(uint16_t max_version,
- enum tls13_variant_t variant);
-
-// ssl_is_resumption_client_ccs_experiment returns whether the version
-// corresponds to a TLS 1.3 resumption experiment that sends a client CCS.
-bool ssl_is_resumption_client_ccs_experiment(uint16_t version);
-
-// ssl_is_resumption_record_version_experiment returns whether the version
-// corresponds to a TLS 1.3 resumption experiment that modifies the record
-// version.
-bool ssl_is_resumption_record_version_experiment(uint16_t version);
-
+// ssl_is_draft23_variant returns whether the variant corresponds to a
+// draft23 TLS 1.3 variant.
+ bool ssl_is_draft23_variant(enum tls13_variant_t variant);
// Cipher suites.
diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc
index 5d37448..a2a53f6 100644
--- a/ssl/ssl_test.cc
+++ b/ssl/ssl_test.cc
@@ -3861,7 +3861,7 @@
!TestPaddingExtension(TLS1_3_VERSION, TLS1_2_VERSION) ||
// Test the padding extension at TLS 1.3 with a TLS 1.3 session, so there
// will be a PSK binder after the padding extension.
- !TestPaddingExtension(TLS1_3_VERSION, TLS1_3_DRAFT22_VERSION)) {
+ !TestPaddingExtension(TLS1_3_VERSION, TLS1_3_DRAFT23_VERSION)) {
ADD_FAILURE() << "Tests failed";
}
}
diff --git a/ssl/ssl_versions.cc b/ssl/ssl_versions.cc
index 4ef54da..15012dc 100644
--- a/ssl/ssl_versions.cc
+++ b/ssl/ssl_versions.cc
@@ -35,6 +35,7 @@
return true;
case TLS1_3_DRAFT22_VERSION:
+ case TLS1_3_DRAFT23_VERSION:
case TLS1_3_EXPERIMENT2_VERSION:
*out = TLS1_3_VERSION;
return true;
@@ -57,6 +58,7 @@
// decreasing preference.
static const uint16_t kTLSVersions[] = {
+ TLS1_3_DRAFT23_VERSION,
TLS1_3_DRAFT22_VERSION,
TLS1_3_EXPERIMENT2_VERSION,
TLS1_2_VERSION,
@@ -102,6 +104,7 @@
static const char *ssl_version_to_string(uint16_t version) {
switch (version) {
case TLS1_3_DRAFT22_VERSION:
+ case TLS1_3_DRAFT23_VERSION:
case TLS1_3_EXPERIMENT2_VERSION:
return "TLSv1.3";
@@ -132,6 +135,7 @@
switch (version) {
// Report TLS 1.3 draft versions as TLS 1.3 in the public API.
case TLS1_3_DRAFT22_VERSION:
+ case TLS1_3_DRAFT23_VERSION:
case TLS1_3_EXPERIMENT2_VERSION:
return TLS1_3_VERSION;
default:
@@ -144,6 +148,7 @@
// used in context where that does not matter.
static bool api_version_to_wire(uint16_t *out, uint16_t version) {
if (version == TLS1_3_DRAFT22_VERSION ||
+ version == TLS1_3_DRAFT23_VERSION ||
version == TLS1_3_EXPERIMENT2_VERSION) {
return false;
}
@@ -303,8 +308,10 @@
if (protocol_version != TLS1_3_VERSION ||
(ssl->tls13_variant == tls13_experiment2 &&
version == TLS1_3_EXPERIMENT2_VERSION) ||
+ (ssl->tls13_variant == tls13_draft22 &&
+ version == TLS1_3_DRAFT22_VERSION) ||
(ssl->tls13_variant == tls13_default &&
- version == TLS1_3_DRAFT22_VERSION)) {
+ version == TLS1_3_DRAFT23_VERSION)) {
return true;
}
@@ -362,7 +369,15 @@
}
bool ssl_is_draft22(uint16_t version) {
- return version == TLS1_3_DRAFT22_VERSION;
+ return version == TLS1_3_DRAFT22_VERSION || version == TLS1_3_DRAFT23_VERSION;
+}
+
+bool ssl_is_draft23(uint16_t version) {
+ return version == TLS1_3_DRAFT23_VERSION;
+}
+
+bool ssl_is_draft23_variant(tls13_variant_t variant) {
+ return variant == tls13_default;
}
} // namespace bssl
diff --git a/ssl/t1_lib.cc b/ssl/t1_lib.cc
index 814cce1..4b3de43 100644
--- a/ssl/t1_lib.cc
+++ b/ssl/t1_lib.cc
@@ -549,6 +549,10 @@
return true;
}
+static bool dont_add_clienthello(SSL_HANDSHAKE *hs, CBB *out) {
+ return true;
+}
+
static bool ignore_parse_clienthello(SSL_HANDSHAKE *hs, uint8_t *out_alert,
CBS *contents) {
// This extension from the client is handled elsewhere.
@@ -2080,7 +2084,9 @@
}
CBB contents, kse_bytes;
- if (!CBB_add_u16(out, TLSEXT_TYPE_key_share) ||
+ if (!CBB_add_u16(out, ssl_is_draft23_variant(ssl->tls13_variant)
+ ? TLSEXT_TYPE_new_key_share
+ : TLSEXT_TYPE_old_key_share) ||
!CBB_add_u16_length_prefixed(out, &contents) ||
!CBB_add_u16_length_prefixed(&contents, &kse_bytes)) {
return false;
@@ -2237,7 +2243,9 @@
uint16_t group_id;
CBB kse_bytes, public_key;
if (!tls1_get_shared_group(hs, &group_id) ||
- !CBB_add_u16(out, TLSEXT_TYPE_key_share) ||
+ !CBB_add_u16(out, ssl_is_draft23(hs->ssl->version)
+ ? TLSEXT_TYPE_new_key_share
+ : TLSEXT_TYPE_old_key_share) ||
!CBB_add_u16_length_prefixed(out, &kse_bytes) ||
!CBB_add_u16(&kse_bytes, group_id) ||
!CBB_add_u16_length_prefixed(&kse_bytes, &public_key) ||
@@ -2491,7 +2499,16 @@
ext_ec_point_add_serverhello,
},
{
- TLSEXT_TYPE_key_share,
+ TLSEXT_TYPE_old_key_share,
+ // This is added by TLSEXT_TYPE_new_key_share's callback.
+ NULL,
+ dont_add_clienthello,
+ forbid_parse_serverhello,
+ ignore_parse_clienthello,
+ dont_add_serverhello,
+ },
+ {
+ TLSEXT_TYPE_new_key_share,
NULL,
ext_key_share_add_clienthello,
forbid_parse_serverhello,
diff --git a/ssl/test/runner/common.go b/ssl/test/runner/common.go
index 51effed..cd04acf 100644
--- a/ssl/test/runner/common.go
+++ b/ssl/test/runner/common.go
@@ -35,14 +35,17 @@
const (
tls13Experiment2Version = 0x7e02
tls13Draft22Version = 0x7f16
+ tls13Draft23Version = 0x7f17
)
const (
- TLS13Draft22 = 0
+ TLS13Draft23 = 0
TLS13Experiment2 = 1
+ TLS13Draft22 = 2
)
var allTLSWireVersions = []uint16{
+ tls13Draft23Version,
tls13Draft22Version,
tls13Experiment2Version,
VersionTLS12,
@@ -120,7 +123,7 @@
extensionPadding uint16 = 21
extensionExtendedMasterSecret uint16 = 23
extensionSessionTicket uint16 = 35
- extensionKeyShare uint16 = 40 // draft-ietf-tls-tls13-16
+ extensionOldKeyShare uint16 = 40 // draft-ietf-tls-tls13-16
extensionPreSharedKey uint16 = 41 // draft-ietf-tls-tls13-16
extensionEarlyData uint16 = 42 // draft-ietf-tls-tls13-16
extensionSupportedVersions uint16 = 43 // draft-ietf-tls-tls13-16
@@ -128,6 +131,7 @@
extensionPSKKeyExchangeModes uint16 = 45 // draft-ietf-tls-tls13-18
extensionTicketEarlyDataInfo uint16 = 46 // draft-ietf-tls-tls13-18
extensionCertificateAuthorities uint16 = 47 // draft-ietf-tls-tls13-21
+ extensionNewKeyShare uint16 = 51 // draft-ietf-tls-tls13-23
extensionCustom uint16 = 1234 // not IANA assigned
extensionNextProtoNeg uint16 = 13172 // not IANA assigned
extensionRenegotiationInfo uint16 = 0xff01
@@ -1633,7 +1637,7 @@
switch vers {
case VersionSSL30, VersionTLS10, VersionTLS11, VersionTLS12:
return vers, true
- case tls13Draft22Version, tls13Experiment2Version:
+ case tls13Draft23Version, tls13Draft22Version, tls13Experiment2Version:
return VersionTLS13, true
}
}
@@ -1642,7 +1646,11 @@
}
func isDraft22(vers uint16) bool {
- return vers == tls13Draft22Version
+ return vers == tls13Draft22Version || vers == tls13Draft23Version
+}
+
+func isDraft23(vers uint16) bool {
+ return vers == tls13Draft23Version
}
// isSupportedVersion checks if the specified wire version is acceptable. If so,
@@ -1650,6 +1658,7 @@
// false.
func (c *Config) isSupportedVersion(wireVers uint16, isDTLS bool) (uint16, bool) {
if (c.TLS13Variant != TLS13Experiment2 && wireVers == tls13Experiment2Version) ||
+ (c.TLS13Variant != TLS13Draft23 && wireVers == tls13Draft23Version) ||
(c.TLS13Variant != TLS13Draft22 && wireVers == tls13Draft22Version) {
return 0, false
}
diff --git a/ssl/test/runner/handshake_client.go b/ssl/test/runner/handshake_client.go
index 0f4a714..e477edf 100644
--- a/ssl/test/runner/handshake_client.go
+++ b/ssl/test/runner/handshake_client.go
@@ -159,6 +159,11 @@
if maxVersion >= VersionTLS13 {
keyShares = make(map[CurveID]ecdhCurve)
hello.hasKeyShares = true
+ if c.config.TLS13Variant == TLS13Draft23 {
+ hello.keyShareExtension = extensionNewKeyShare
+ } else {
+ hello.keyShareExtension = extensionOldKeyShare
+ }
hello.trailingKeyShareData = c.config.Bugs.TrailingKeyShareData
curvesToSend := c.config.defaultCurves()
for _, curveID := range hello.supportedCurves {
diff --git a/ssl/test/runner/handshake_messages.go b/ssl/test/runner/handshake_messages.go
index c4a6e16..b650393 100644
--- a/ssl/test/runner/handshake_messages.go
+++ b/ssl/test/runner/handshake_messages.go
@@ -265,6 +265,7 @@
supportedCurves []CurveID
supportedPoints []uint8
hasKeyShares bool
+ keyShareExtension uint16
keyShares []keyShareEntry
trailingKeyShareData bool
pskIdentities []pskIdentity
@@ -444,7 +445,7 @@
supportedPoints.addBytes(m.supportedPoints)
}
if m.hasKeyShares {
- extensions.addU16(extensionKeyShare)
+ extensions.addU16(m.keyShareExtension)
keyShareList := extensions.addU16LengthPrefixed()
keyShares := keyShareList.addU16LengthPrefixed()
@@ -719,7 +720,12 @@
// http://tools.ietf.org/html/rfc5077#section-3.2
m.ticketSupported = true
m.sessionTicket = []byte(body)
- case extensionKeyShare:
+ case extensionOldKeyShare, extensionNewKeyShare:
+ // We assume the client only supports one of draft-22 or draft-23.
+ if m.keyShareExtension != 0 {
+ return false
+ }
+ m.keyShareExtension = extension
// draft-ietf-tls-tls13 section 6.3.2.3
var keyShares byteReader
if !body.readU16LengthPrefixed(&keyShares) || len(body) != 0 {
@@ -912,7 +918,11 @@
if vers >= VersionTLS13 {
if m.hasKeyShare {
- extensions.addU16(extensionKeyShare)
+ if isDraft23(m.vers) {
+ extensions.addU16(extensionNewKeyShare)
+ } else {
+ extensions.addU16(extensionOldKeyShare)
+ }
keyShare := extensions.addU16LengthPrefixed()
keyShare.addU16(uint16(m.keyShare.group))
keyExchange := keyShare.addU16LengthPrefixed()
@@ -1015,6 +1025,10 @@
}
if vers >= VersionTLS13 {
+ extensionKeyShare := extensionOldKeyShare
+ if isDraft23(m.vers) {
+ extensionKeyShare = extensionNewKeyShare
+ }
for len(extensions) > 0 {
var extension uint16
var body byteReader
@@ -1195,7 +1209,7 @@
}
}
if m.hasKeyShare {
- extensions.addU16(extensionKeyShare)
+ extensions.addU16(extensionOldKeyShare)
keyShare := extensions.addU16LengthPrefixed()
keyShare.addU16(uint16(m.keyShare.group))
keyExchange := keyShare.addU16LengthPrefixed()
@@ -1388,7 +1402,11 @@
extensions.addU16(m.vers)
}
if m.hasSelectedGroup {
- extensions.addU16(extensionKeyShare)
+ if isDraft23(m.vers) {
+ extensions.addU16(extensionNewKeyShare)
+ } else {
+ extensions.addU16(extensionOldKeyShare)
+ }
extensions.addU16(2) // length
extensions.addU16(uint16(m.selectedGroup))
}
@@ -1431,11 +1449,12 @@
if !reader.readU16LengthPrefixed(&extensions) || len(reader) != 0 {
return false
}
- for len(extensions) > 0 {
+ extensionsCopy := extensions
+ for len(extensionsCopy) > 0 {
var extension uint16
var body byteReader
- if !extensions.readU16(&extension) ||
- !extensions.readU16LengthPrefixed(&body) {
+ if !extensionsCopy.readU16(&extension) ||
+ !extensionsCopy.readU16LengthPrefixed(&body) {
return false
}
switch extension {
@@ -1445,6 +1464,23 @@
len(body) != 0 {
return false
}
+ default:
+ }
+ }
+ extensionKeyShare := extensionOldKeyShare
+ if isDraft23(m.vers) {
+ extensionKeyShare = extensionNewKeyShare
+ }
+ for len(extensions) > 0 {
+ var extension uint16
+ var body byteReader
+ if !extensions.readU16(&extension) ||
+ !extensions.readU16LengthPrefixed(&body) {
+ return false
+ }
+ switch extension {
+ case extensionSupportedVersions:
+ // Parsed above.
case extensionKeyShare:
var v uint16
if !body.readU16(&v) || len(body) != 0 {
diff --git a/ssl/test/runner/handshake_server.go b/ssl/test/runner/handshake_server.go
index 6b7daee..abfab91 100644
--- a/ssl/test/runner/handshake_server.go
+++ b/ssl/test/runner/handshake_server.go
@@ -280,6 +280,14 @@
}
}
+ // Check that we received the expected version of the key_share extension.
+ if c.vers >= VersionTLS13 {
+ if (isDraft23(c.wireVersion) && hs.clientHello.keyShareExtension != extensionNewKeyShare) ||
+ (!isDraft23(c.wireVersion) && hs.clientHello.keyShareExtension != extensionOldKeyShare) {
+ return fmt.Errorf("tls: client offered wrong key_share extension")
+ }
+ }
+
if config.Bugs.ExpectNoTLS12Session {
if len(hs.clientHello.sessionId) > 0 && c.vers >= VersionTLS13 {
return fmt.Errorf("tls: client offered an unexpected session ID")
diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go
index 7506280..74e060c 100644
--- a/ssl/test/runner/runner.go
+++ b/ssl/test/runner/runner.go
@@ -5306,7 +5306,7 @@
expectedClientVersion := expectedVersion
if expectedVersion == VersionTLS13 && runnerVers.tls13Variant != shimVers.tls13Variant {
expectedClientVersion = VersionTLS12
- if shimVers.tls13Variant == TLS13Draft22 {
+ if shimVers.tls13Variant == TLS13Draft23 {
expectedServerVersion = VersionTLS12
}
}
@@ -5516,7 +5516,7 @@
name: "IgnoreClientVersionOrder",
config: Config{
Bugs: ProtocolBugs{
- SendSupportedVersions: []uint16{VersionTLS12, tls13Draft22Version},
+ SendSupportedVersions: []uint16{VersionTLS12, tls13Draft23Version},
},
},
expectedVersion: VersionTLS13,
diff --git a/ssl/tls13_client.cc b/ssl/tls13_client.cc
index 8d46d9f..f437519 100644
--- a/ssl/tls13_client.cc
+++ b/ssl/tls13_client.cc
@@ -136,8 +136,10 @@
bool have_cookie, have_key_share, have_supported_versions;
CBS cookie, key_share, supported_versions;
- const SSL_EXTENSION_TYPE ext_types[] = {
- {TLSEXT_TYPE_key_share, &have_key_share, &key_share},
+ SSL_EXTENSION_TYPE ext_types[] = {
+ {ssl_is_draft23(ssl->version) ? (uint16_t)TLSEXT_TYPE_new_key_share
+ : (uint16_t)TLSEXT_TYPE_old_key_share,
+ &have_key_share, &key_share},
{TLSEXT_TYPE_cookie, &have_cookie, &cookie},
{TLSEXT_TYPE_supported_versions, &have_supported_versions,
&supported_versions},
@@ -305,8 +307,10 @@
bool have_key_share = false, have_pre_shared_key = false,
have_supported_versions = false;
CBS key_share, pre_shared_key, supported_versions;
- const SSL_EXTENSION_TYPE ext_types[] = {
- {TLSEXT_TYPE_key_share, &have_key_share, &key_share},
+ SSL_EXTENSION_TYPE ext_types[] = {
+ {ssl_is_draft23(ssl->version) ? (uint16_t)TLSEXT_TYPE_new_key_share
+ : (uint16_t)TLSEXT_TYPE_old_key_share,
+ &have_key_share, &key_share},
{TLSEXT_TYPE_pre_shared_key, &have_pre_shared_key, &pre_shared_key},
{TLSEXT_TYPE_supported_versions, &have_supported_versions,
&supported_versions},
diff --git a/ssl/tls13_server.cc b/ssl/tls13_server.cc
index 4651459..72273da 100644
--- a/ssl/tls13_server.cc
+++ b/ssl/tls13_server.cc
@@ -63,10 +63,15 @@
SSL *const ssl = hs->ssl;
*out_need_retry = false;
+ uint16_t key_share_ext = TLSEXT_TYPE_old_key_share;
+ if (ssl_is_draft23(ssl->version)) {
+ key_share_ext = TLSEXT_TYPE_new_key_share;
+ }
+
// We only support connections that include an ECDHE key exchange.
CBS key_share;
if (!ssl_client_hello_get_extension(client_hello, &key_share,
- TLSEXT_TYPE_key_share)) {
+ key_share_ext)) {
OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_KEY_SHARE);
ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_MISSING_EXTENSION);
return 0;
@@ -508,7 +513,9 @@
!CBB_add_u16(&extensions, TLSEXT_TYPE_supported_versions) ||
!CBB_add_u16(&extensions, 2 /* length */) ||
!CBB_add_u16(&extensions, ssl->version) ||
- !CBB_add_u16(&extensions, TLSEXT_TYPE_key_share) ||
+ !CBB_add_u16(&extensions, ssl_is_draft23(ssl->version)
+ ? TLSEXT_TYPE_new_key_share
+ : TLSEXT_TYPE_old_key_share) ||
!CBB_add_u16(&extensions, 2 /* length */) ||
!CBB_add_u16(&extensions, group_id) ||
!ssl_add_message_cbb(ssl, cbb.get())) {
@@ -529,7 +536,7 @@
!CBB_add_u16(&body, ssl_cipher_get_value(hs->new_cipher))) ||
!tls1_get_shared_group(hs, &group_id) ||
!CBB_add_u16_length_prefixed(&body, &extensions) ||
- !CBB_add_u16(&extensions, TLSEXT_TYPE_key_share) ||
+ !CBB_add_u16(&extensions, TLSEXT_TYPE_old_key_share) ||
!CBB_add_u16(&extensions, 2 /* length */) ||
!CBB_add_u16(&extensions, group_id) ||
!ssl_add_message_cbb(ssl, cbb.get())) {