In some cases a QUIC SSL_CONNECTION object needs to get hold of a reference
to the original SSL object as created by the user. We should keep a
reference to it.
Reviewed-by: Viktor Dukhovni <viktor@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/25931)
(cherry picked from commit
6612799fb51eea3ddd0f077a76d01db873d43df9)
goto err;
}
- qc->tls = ossl_ssl_connection_new_int(ctx, TLS_method());
+ qc->tls = ossl_ssl_connection_new_int(ctx, ssl_base, TLS_method());
if (qc->tls == NULL || (sc = SSL_CONNECTION_FROM_SSL(qc->tls)) == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
goto err;
SSL *tls = NULL;
SSL_CONNECTION *tls_conn = NULL;
- tls = ossl_ssl_connection_new_int(port->channel_ctx, TLS_method());
+ tls = ossl_ssl_connection_new_int(port->channel_ctx, NULL, TLS_method());
if (tls == NULL || (tls_conn = SSL_CONNECTION_FROM_SSL(tls)) == NULL)
return NULL;
return 1;
}
-SSL *ossl_ssl_connection_new_int(SSL_CTX *ctx, const SSL_METHOD *method)
+SSL *ossl_ssl_connection_new_int(SSL_CTX *ctx, SSL *user_ssl,
+ const SSL_METHOD *method)
{
SSL_CONNECTION *s;
SSL *ssl;
return NULL;
ssl = &s->ssl;
+ s->user_ssl = (user_ssl == NULL) ? ssl : user_ssl;
+
if (!ossl_ssl_init(ssl, ctx, method, SSL_TYPE_SSL_CONNECTION)) {
OPENSSL_free(s);
s = NULL;
SSL *ossl_ssl_connection_new(SSL_CTX *ctx)
{
- return ossl_ssl_connection_new_int(ctx, ctx->method);
+ return ossl_ssl_connection_new_int(ctx, NULL, ctx->method);
}
int SSL_is_dtls(const SSL *s)
struct ssl_connection_st {
/* type identifier and common data */
struct ssl_st ssl;
+
+ /*
+ * The actual end user's SSL object. Could be different to this one for
+ * QUIC
+ */
+ SSL *user_ssl;
+
/*
* protocol version (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION,
* DTLS1_VERSION)
SSL_CONNECTION_FROM_SSL_ONLY_int(ssl, const)
# define SSL_CONNECTION_GET_CTX(sc) ((sc)->ssl.ctx)
# define SSL_CONNECTION_GET_SSL(sc) (&(sc)->ssl)
+# define SSL_CONNECTION_GET_USER_SSL(sc) ((sc)->user_ssl)
# ifndef OPENSSL_NO_QUIC
# include "quic/quic_local.h"
# define SSL_CONNECTION_FROM_SSL_int(ssl, c) \
__owur int ossl_ssl_init(SSL *ssl, SSL_CTX *ctx, const SSL_METHOD *method,
int type);
-__owur SSL *ossl_ssl_connection_new_int(SSL_CTX *ctx, const SSL_METHOD *method);
+__owur SSL *ossl_ssl_connection_new_int(SSL_CTX *ctx, SSL *user_ssl,
+ const SSL_METHOD *method);
__owur SSL *ossl_ssl_connection_new(SSL_CTX *ctx);
void ossl_ssl_connection_free(SSL *ssl);
__owur int ossl_ssl_connection_reset(SSL *ssl);