Test that the early callback can affect max_version. The early callback needs to run before even version negotiation has been resolved. Change-Id: Ibb449ccec07dedef19b7827400ef318fa2f422c0 Reviewed-on: https://boringssl-review.googlesource.com/10722 Commit-Queue: David Benjamin <davidben@google.com> Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: Adam Langley <agl@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc index 5c68f26..3f9c898 100644 --- a/ssl/ssl_test.cc +++ b/ssl/ssl_test.cc
@@ -2096,6 +2096,43 @@ return true; } +static int SetMaxVersion(const struct ssl_early_callback_ctx *ctx) { + SSL_set_max_version(ctx->ssl, TLS1_2_VERSION); + return 1; +} + +// TestEarlyCallbackVersionSwitch tests that the early callback can swap the +// maximum version. +static bool TestEarlyCallbackVersionSwitch() { + ScopedX509 cert = GetTestCertificate(); + ScopedEVP_PKEY key = GetTestKey(); + ScopedSSL_CTX server_ctx(SSL_CTX_new(TLS_method())); + ScopedSSL_CTX client_ctx(SSL_CTX_new(TLS_method())); + if (!cert || !key || !server_ctx || !client_ctx || + !SSL_CTX_use_certificate(server_ctx.get(), cert.get()) || + !SSL_CTX_use_PrivateKey(server_ctx.get(), key.get())) { + return false; + } + + SSL_CTX_set_max_version(client_ctx.get(), TLS1_3_VERSION); + SSL_CTX_set_max_version(server_ctx.get(), TLS1_3_VERSION); + + SSL_CTX_set_select_certificate_cb(server_ctx.get(), SetMaxVersion); + + ScopedSSL client, server; + if (!ConnectClientAndServer(&client, &server, client_ctx.get(), + server_ctx.get(), nullptr)) { + return false; + } + + if (SSL_version(client.get()) != TLS1_2_VERSION) { + fprintf(stderr, "Early callback failed to switch the maximum version.\n"); + return false; + } + + return true; +} + int main() { CRYPTO_library_init(); @@ -2130,7 +2167,8 @@ !TestClientHello() || !TestSessionIDContext() || !TestSessionTimeout() || - !TestSNICallback()) { + !TestSNICallback() || + !TestEarlyCallbackVersionSwitch()) { ERR_print_errors_fp(stderr); return 1; }