Support and test P-224 certificates.
Previously we only needed to be able to serve P-224 certificates, but
now we anticipate a need to be able to connect and validate them also.
Since this requires advertising support for P-224 in the handshake, we
need to support P-224 ECDHE too.
P-224 support is disabled by default and so clients need to both set the
enabled curves explicitly and set a maximum version of TLS 1.2.
Change-Id: Idc69580f47334e0912eb431a0db0e78ee2eb5bbe
Reviewed-on: https://boringssl-review.googlesource.com/14225
Reviewed-by: Adam Langley <alangley@gmail.com>
Commit-Queue: Adam Langley <alangley@gmail.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/include/openssl/ssl.h b/include/openssl/ssl.h
index 5182df7..b476592 100644
--- a/include/openssl/ssl.h
+++ b/include/openssl/ssl.h
@@ -2105,6 +2105,7 @@
OPENSSL_EXPORT int SSL_set1_curves_list(SSL *ssl, const char *curves);
/* SSL_CURVE_* define TLS curve IDs. */
+#define SSL_CURVE_SECP224R1 21
#define SSL_CURVE_SECP256R1 23
#define SSL_CURVE_SECP384R1 24
#define SSL_CURVE_SECP521R1 25
diff --git a/ssl/ssl_ecdh.c b/ssl/ssl_ecdh.c
index f49d566..25e3df9 100644
--- a/ssl/ssl_ecdh.c
+++ b/ssl/ssl_ecdh.c
@@ -300,6 +300,17 @@
static const SSL_ECDH_METHOD kMethods[] = {
{
+ NID_secp224r1,
+ SSL_CURVE_SECP224R1,
+ "P-224",
+ ssl_ec_point_cleanup,
+ ssl_ec_point_offer,
+ ssl_ec_point_accept,
+ ssl_ec_point_finish,
+ CBS_get_u8_length_prefixed,
+ CBB_add_u8_length_prefixed,
+ },
+ {
NID_X9_62_prime256v1,
SSL_CURVE_SECP256R1,
"P-256",
diff --git a/ssl/test/bssl_shim.cc b/ssl/test/bssl_shim.cc
index dccf0c9..70ea664 100644
--- a/ssl/test/bssl_shim.cc
+++ b/ssl/test/bssl_shim.cc
@@ -1793,7 +1793,8 @@
}
if (config->enable_all_curves) {
static const int kAllCurves[] = {
- NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1, NID_X25519,
+ NID_secp224r1, NID_X9_62_prime256v1, NID_secp384r1,
+ NID_secp521r1, NID_X25519,
};
if (!SSL_set1_curves(ssl.get(), kAllCurves,
OPENSSL_ARRAY_SIZE(kAllCurves))) {
diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go
index 3bdb865..a6d08ef 100644
--- a/ssl/test/runner/runner.go
+++ b/ssl/test/runner/runner.go
@@ -6662,6 +6662,10 @@
{"RSA-PKCS1-SHA384", signatureRSAPKCS1WithSHA384, testCertRSA},
{"RSA-PKCS1-SHA512", signatureRSAPKCS1WithSHA512, testCertRSA},
{"ECDSA-SHA1", signatureECDSAWithSHA1, testCertECDSAP256},
+ // The “P256” in the following line is not a mistake. In TLS 1.2 the
+ // hash function doesn't have to match the curve and so the same
+ // signature algorithm works with P-224.
+ {"ECDSA-P224-SHA256", signatureECDSAWithP256AndSHA256, testCertECDSAP224},
{"ECDSA-P256-SHA256", signatureECDSAWithP256AndSHA256, testCertECDSAP256},
{"ECDSA-P384-SHA384", signatureECDSAWithP384AndSHA384, testCertECDSAP384},
{"ECDSA-P521-SHA512", signatureECDSAWithP521AndSHA512, testCertECDSAP521},
@@ -6718,7 +6722,13 @@
shouldVerifyFail = true
}
// RSA-PKCS1 does not exist in TLS 1.3.
- if ver.version == VersionTLS13 && hasComponent(alg.name, "PKCS1") {
+ if ver.version >= VersionTLS13 && hasComponent(alg.name, "PKCS1") {
+ shouldSignFail = true
+ shouldVerifyFail = true
+ }
+ // SHA-224 has been removed from TLS 1.3 and, in 1.3,
+ // the curve has to match the hash size.
+ if ver.version >= VersionTLS13 && alg.cert == testCertECDSAP224 {
shouldSignFail = true
shouldVerifyFail = true
}
@@ -7486,31 +7496,6 @@
},
flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
})
-
- // A server certificate with a P-224 key will only work up to TLS 1.2
- // and we only test it with BoringSSL acting as a server because that's
- // all Alphabet requires with it.
- testCases = append(testCases, testCase{
- testType: serverTest,
- name: "P224-Server",
- config: Config{
- VerifySignatureAlgorithms: []signatureAlgorithm{
- // TLS 1.2 does not require that the curve
- // match the hash, thus P-256 with SHA-256 is
- // the same signature algorithm value as P-224
- // with SHA-256.
- signatureECDSAWithP256AndSHA256,
- },
- // P-256 must be offered as well because ECDHE requires
- // it.
- CurvePreferences: []CurveID{CurveP224, CurveP256},
- },
- flags: []string{
- "-max-version", strconv.Itoa(VersionTLS12),
- "-cert-file", path.Join(*resourceDir, ecdsaP224CertificateFile),
- "-key-file", path.Join(*resourceDir, ecdsaP224KeyFile),
- },
- })
}
// timeouts is the retransmit schedule for BoringSSL. It doubles and
@@ -8146,6 +8131,7 @@
name string
id CurveID
}{
+ {"P-224", CurveP224},
{"P-256", CurveP256},
{"P-384", CurveP384},
{"P-521", CurveP521},