Allow configuring QUIC method per-connection This allows sharing SSL_CTX between TCP and QUIC connections, such that common settings can be configured without having to duplicate the context. Change-Id: Ie920e7f2a772dd6c6c7b63fdac243914ac5b7b26 Reviewed-on: https://boringssl-review.googlesource.com/c/33904 Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/ssl/ssl_lib.cc b/ssl/ssl_lib.cc index bbc3758..f3d92a6 100644 --- a/ssl/ssl_lib.cc +++ b/ssl/ssl_lib.cc
@@ -714,6 +714,7 @@ ssl->config->ocsp_stapling_enabled = ctx->ocsp_stapling_enabled; ssl->config->handoff = ctx->handoff; ssl->config->ignore_tls13_downgrade = ctx->ignore_tls13_downgrade; + ssl->quic_method = ctx->quic_method; if (!ssl->method->ssl_new(ssl.get()) || !ssl->ctx->x509_method->ssl_new(ssl->s3->hs.get())) { @@ -850,7 +851,7 @@ int SSL_provide_quic_data(SSL *ssl, enum ssl_encryption_level_t level, const uint8_t *data, size_t len) { - if (ssl->ctx->quic_method == nullptr) { + if (ssl->quic_method == nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -1077,7 +1078,7 @@ } int SSL_peek(SSL *ssl, void *buf, int num) { - if (ssl->ctx->quic_method != nullptr) { + if (ssl->quic_method != nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -1098,7 +1099,7 @@ int SSL_write(SSL *ssl, const void *buf, int num) { ssl_reset_error_state(ssl); - if (ssl->ctx->quic_method != nullptr) { + if (ssl->quic_method != nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); return 0; } @@ -1342,7 +1343,7 @@ return SSL_ERROR_HANDBACK; case SSL_READING: { - if (ssl->ctx->quic_method) { + if (ssl->quic_method) { return SSL_ERROR_WANT_READ; } BIO *bio = SSL_get_rbio(ssl); @@ -2459,6 +2460,14 @@ return 1; } +int SSL_set_quic_method(SSL *ssl, const SSL_QUIC_METHOD *quic_method) { + if (ssl->method->is_dtls) { + return 0; + } + ssl->quic_method = quic_method; + return 1; +} + int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_unused *unused, CRYPTO_EX_dup *dup_unused, CRYPTO_EX_free *free_func) { int index;