Implement final TLS 1.3 RFC!!!
The anti-downgrade signal is being implemented in a follow-up change.
Change-Id: I5ea3ff429ed1389a3577026588fef3660d2d0615
Reviewed-on: https://boringssl-review.googlesource.com/30904
Commit-Queue: Steven Valdez <svaldez@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
Reviewed-by: Steven Valdez <svaldez@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h
index d616981..85b244b 100644
--- a/include/openssl/ssl.h
+++ b/include/openssl/ssl.h
@@ -3400,10 +3400,16 @@
// performed by |ssl|. This includes the pending renegotiation, if any.
OPENSSL_EXPORT int SSL_total_renegotiations(const SSL *ssl);
+// tls13_variant_t determines what TLS 1.3 variant to negotiate.
+//
+// TODO(svaldez): Make |tls13_rfc| the default after callers are switched to
+// explicitly enable |tls13_all|.
enum tls13_variant_t {
tls13_default = 0,
tls13_draft23,
tls13_draft28,
+ tls13_rfc,
+ tls13_all = tls13_default,
};
// SSL_CTX_set_tls13_variant sets which variant of TLS 1.3 we negotiate. On the
diff --git a/ssl/ssl_versions.cc b/ssl/ssl_versions.cc
index 6a8143d..6f07b93 100644
--- a/ssl/ssl_versions.cc
+++ b/ssl/ssl_versions.cc
@@ -30,6 +30,7 @@
case TLS1_VERSION:
case TLS1_1_VERSION:
case TLS1_2_VERSION:
+ case TLS1_3_VERSION:
*out = version;
return true;
@@ -56,6 +57,7 @@
// decreasing preference.
static const uint16_t kTLSVersions[] = {
+ TLS1_3_VERSION,
TLS1_3_DRAFT28_VERSION,
TLS1_3_DRAFT23_VERSION,
TLS1_2_VERSION,
@@ -101,6 +103,7 @@
switch (version) {
case TLS1_3_DRAFT23_VERSION:
case TLS1_3_DRAFT28_VERSION:
+ case TLS1_3_VERSION:
return "TLSv1.3";
case TLS1_2_VERSION:
@@ -128,6 +131,7 @@
// Report TLS 1.3 draft versions as TLS 1.3 in the public API.
case TLS1_3_DRAFT23_VERSION:
case TLS1_3_DRAFT28_VERSION:
+ case TLS1_3_VERSION:
return TLS1_3_VERSION;
default:
return version;
@@ -142,9 +146,6 @@
version == TLS1_3_DRAFT28_VERSION) {
return false;
}
- if (version == TLS1_3_VERSION) {
- version = TLS1_3_DRAFT23_VERSION;
- }
// Check it is a real protocol version.
uint16_t unused;
@@ -301,6 +302,8 @@
return version == TLS1_3_DRAFT23_VERSION;
case tls13_draft28:
return version == TLS1_3_DRAFT28_VERSION;
+ case tls13_rfc:
+ return version == TLS1_3_VERSION;
case tls13_default:
return true;
}
@@ -354,7 +357,7 @@
}
bool ssl_is_draft28(uint16_t version) {
- return version == TLS1_3_DRAFT28_VERSION;
+ return version == TLS1_3_DRAFT28_VERSION || version == TLS1_3_VERSION;
}
} // namespace bssl
diff --git a/ssl/test/runner/common.go b/ssl/test/runner/common.go
index aa17350..aeb7ad0 100644
--- a/ssl/test/runner/common.go
+++ b/ssl/test/runner/common.go
@@ -42,9 +42,11 @@
TLS13Default = 0
TLS13Draft23 = 1
TLS13Draft28 = 2
+ TLS13RFC = 3
)
var allTLSWireVersions = []uint16{
+ VersionTLS13,
tls13Draft28Version,
tls13Draft23Version,
VersionTLS12,
@@ -1740,7 +1742,7 @@
}
} else {
switch vers {
- case VersionSSL30, VersionTLS10, VersionTLS11, VersionTLS12:
+ case VersionSSL30, VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13:
return vers, true
case tls13Draft23Version, tls13Draft28Version:
return VersionTLS13, true
@@ -1751,22 +1753,37 @@
}
func isDraft28(vers uint16) bool {
- return vers == tls13Draft28Version
+ return vers == tls13Draft28Version || vers == VersionTLS13
}
// isSupportedVersion checks if the specified wire version is acceptable. If so,
// it returns true and the corresponding protocol version. Otherwise, it returns
// false.
func (c *Config) isSupportedVersion(wireVers uint16, isDTLS bool) (uint16, bool) {
- if (c.TLS13Variant == TLS13Draft23 && wireVers == tls13Draft28Version) ||
- (c.TLS13Variant == TLS13Draft28 && wireVers == tls13Draft23Version) {
- return 0, false
- }
-
vers, ok := wireToVersion(wireVers, isDTLS)
if !ok || c.minVersion(isDTLS) > vers || vers > c.maxVersion(isDTLS) {
return 0, false
}
+ if vers == VersionTLS13 {
+ switch c.TLS13Variant {
+ case TLS13Draft23:
+ if wireVers != tls13Draft23Version {
+ return 0, false
+ }
+ case TLS13Draft28:
+ if wireVers != tls13Draft28Version {
+ return 0, false
+ }
+ case TLS13RFC:
+ if wireVers != VersionTLS13 {
+ return 0, false
+ }
+ case TLS13Default:
+ // Allow all of them.
+ default:
+ panic(c.TLS13Variant)
+ }
+ }
return vers, true
}
diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go
index 47c4513..d95cc28 100644
--- a/ssl/test/runner/runner.go
+++ b/ssl/test/runner/runner.go
@@ -1024,7 +1024,8 @@
panic(fmt.Sprintf("The name of test %q suggests that it's version specific, but min/max version in the Config is %x/%x. One of them should probably be %x", test.name, test.config.MinVersion, test.config.MaxVersion, ver.version))
}
- if ver.tls13Variant != 0 {
+ // Ignore this check against "TLS13", since TLS13 is used in many test names.
+ if ver.tls13Variant != 0 && ver.tls13Variant != TLS13RFC {
var foundFlag bool
for _, flag := range test.flags {
if flag == "-tls13-variant" {
@@ -1376,6 +1377,13 @@
versionDTLS: VersionDTLS12,
},
{
+ name: "TLS13",
+ version: VersionTLS13,
+ excludeFlag: "-no-tls13",
+ versionWire: VersionTLS13,
+ tls13Variant: TLS13RFC,
+ },
+ {
name: "TLS13Draft23",
version: VersionTLS13,
excludeFlag: "-no-tls13",
@@ -1480,7 +1488,7 @@
func convertToSplitHandshakeTests(tests []testCase) (splitHandshakeTests []testCase) {
var stdout bytes.Buffer
shim := exec.Command(*shimPath, "-is-handshaker-supported")
- shim.Stdout = &stdout;
+ shim.Stdout = &stdout
if err := shim.Run(); err != nil {
panic(err)
}
@@ -2831,7 +2839,7 @@
messageCount: 5,
keyUpdateRequest: keyUpdateRequested,
readWithUnfinishedWrite: true,
- flags: []string{"-async"},
+ flags: []string{"-async"},
},
{
name: "SendSNIWarningAlert",
@@ -5748,19 +5756,6 @@
expectedVersion: VersionTLS12,
})
- testCases = append(testCases, testCase{
- testType: serverTest,
- name: "RejectFinalTLS13",
- config: Config{
- Bugs: ProtocolBugs{
- SendSupportedVersions: []uint16{VersionTLS13, VersionTLS12},
- },
- },
- // We currently implement a draft TLS 1.3 version. Ensure that
- // the true TLS 1.3 value is ignored for now.
- expectedVersion: VersionTLS12,
- })
-
// Test that TLS 1.2 isn't negotiated by the supported_versions extension in
// the ServerHello.
testCases = append(testCases, testCase{
diff --git a/tool/client.cc b/tool/client.cc
index 4ab0742..9012993 100644
--- a/tool/client.cc
+++ b/tool/client.cc
@@ -337,6 +337,10 @@
*out = tls13_draft28;
return true;
}
+ if (in == "rfc") {
+ *out = tls13_rfc;
+ return true;
+ }
return false;
}
diff --git a/tool/server.cc b/tool/server.cc
index bc90630..824538a 100644
--- a/tool/server.cc
+++ b/tool/server.cc
@@ -157,6 +157,10 @@
*out = tls13_draft28;
return true;
}
+ if (in == "rfc") {
+ *out = tls13_rfc;
+ return true;
+ }
return false;
}