Define TLSEXT_TYPE_quic_transport_parameters to the old code point for now. QUICHE currently does not know to call SSL_set_quic_use_legacy_codepoint, picking up the current default of the legacy code point. It then assumes that the TLSEXT_TYPE_quic_transport_parameters constant may be used to extract transport parameters, so after https://boringssl-review.googlesource.com/c/boringssl/+/44704, it breaks. To smooth over the transition, we now define three constants: TLSEXT_TYPE_quic_transport_parameters_legacy, TLSEXT_TYPE_quic_transport_parameters_standard, and the old constant. The old constant will match whatever the default is (for now, legacy) so the default is self-consistent. Then plan is then: 1. BoringSSL switches to the state in this CL: the default code point and constant are the legacy one, but there are APIs to specify the code point. This will not affect QUICHE, which only uses the defaults. 2. QUICHE calls SSL_set_quic_use_legacy_codepoint and uses the corresponding _legacy or _standard constant. It should *not* use the unsuffixed constant at this point. 3. BoringSSL switches the default setting and the constant to the standard code point. This will not affect QUICHE, which explicitly configures the code point it wants. 4. Optional: BoringSSL won't switch the default back to legacy, so QUICHE can switch _standard to unsuffixed and BoringSSL can remove the _standard alias (but not the function) early. 5. When QUICHE no longer needs both code points, it unwinds the SSL_set_quic_use_legacy_codepoint code and switches back to the unsuffixed constant. 6. BoringSSL removes all this scaffolding now that it's no longer needed. Update-Note: This this fixes a compatibility issue with https://boringssl-review.googlesource.com/c/boringssl/+/44704. Change-Id: I9f75845aba58ba93e9665cd6f05bcd080eb5f139 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/45124 Reviewed-by: David Schinazi <dschinazi@google.com> Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/include/openssl/tls1.h b/include/openssl/tls1.h index 0fbea9e..da79a08 100644 --- a/include/openssl/tls1.h +++ b/include/openssl/tls1.h
@@ -212,7 +212,19 @@ // hasn't been a problem in practice since it's QUIC-only). Drafts 33 onward // use the value 57 which was officially registered with IANA. #define TLSEXT_TYPE_quic_transport_parameters_legacy 0xffa5 -#define TLSEXT_TYPE_quic_transport_parameters 57 +#define TLSEXT_TYPE_quic_transport_parameters_standard 57 + +// TLSEXT_TYPE_quic_transport_parameters is an alias for +// |TLSEXT_TYPE_quic_transport_parameters_legacy|. It will switch to +// |TLSEXT_TYPE_quic_transport_parameters_standard| at a later date. +// +// Callers using |SSL_set_quic_use_legacy_codepoint| should use +// |TLSEXT_TYPE_quic_transport_parameters_legacy| or +// |TLSEXT_TYPE_quic_transport_parameters_standard| rather than this constant. +// When the default code point is switched to the standard one, this value will +// be updated and we will transition callers back to the unsuffixed constant. +#define TLSEXT_TYPE_quic_transport_parameters \ + TLSEXT_TYPE_quic_transport_parameters_legacy // ExtensionType value from RFC8879 #define TLSEXT_TYPE_cert_compression 27
diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc index d1d525c..637f4d5 100644 --- a/ssl/ssl_test.cc +++ b/ssl/ssl_test.cc
@@ -6149,6 +6149,31 @@ ASSERT_TRUE(RunQUICHandshakesAndExpectError(ExpectedError::kServerError)); } +// Test that the default QUIC code point is consistent with +// |TLSEXT_TYPE_quic_transport_parameters|. This test ensures we remember to +// update the two values together. +TEST_F(QUICMethodTest, QuicCodePointDefault) { + const SSL_QUIC_METHOD quic_method = DefaultQUICMethod(); + ASSERT_TRUE(SSL_CTX_set_quic_method(client_ctx_.get(), &quic_method)); + ASSERT_TRUE(SSL_CTX_set_quic_method(server_ctx_.get(), &quic_method)); + SSL_CTX_set_select_certificate_cb( + server_ctx_.get(), + [](const SSL_CLIENT_HELLO *client_hello) -> ssl_select_cert_result_t { + const uint8_t *data; + size_t len; + if (!SSL_early_callback_ctx_extension_get( + client_hello, TLSEXT_TYPE_quic_transport_parameters, &data, + &len)) { + ADD_FAILURE() << "Could not find quic_transport_parameters extension"; + return ssl_select_cert_error; + } + return ssl_select_cert_success; + }); + + ASSERT_TRUE(CreateClientAndServer()); + ASSERT_TRUE(CompleteHandshakesForQUIC()); +} + extern "C" { int BORINGSSL_enum_c_type_test(void); }
diff --git a/ssl/t1_lib.cc b/ssl/t1_lib.cc index 5ca96109..342c170 100644 --- a/ssl/t1_lib.cc +++ b/ssl/t1_lib.cc
@@ -2794,7 +2794,7 @@ return true; } - uint16_t extension_type = TLSEXT_TYPE_quic_transport_parameters; + uint16_t extension_type = TLSEXT_TYPE_quic_transport_parameters_standard; if (hs->config->quic_use_legacy_codepoint) { extension_type = TLSEXT_TYPE_quic_transport_parameters_legacy; } @@ -2930,7 +2930,7 @@ return true; } - uint16_t extension_type = TLSEXT_TYPE_quic_transport_parameters; + uint16_t extension_type = TLSEXT_TYPE_quic_transport_parameters_standard; if (hs->config->quic_use_legacy_codepoint) { extension_type = TLSEXT_TYPE_quic_transport_parameters_legacy; } @@ -3399,7 +3399,7 @@ dont_add_serverhello, }, { - TLSEXT_TYPE_quic_transport_parameters, + TLSEXT_TYPE_quic_transport_parameters_standard, NULL, ext_quic_transport_params_add_clienthello, ext_quic_transport_params_parse_serverhello,