At this stage we just support msg_callback on receipt of a datagram.
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Hugo Landau <hlandau@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20914)
*/
OSSL_TIME (*now_cb)(void *arg);
void *now_cb_arg;
+
+ /* Message callback related arguments */
+ ossl_msg_cb msg_callback;
+ void *msg_callback_arg;
+ SSL *msg_callback_s;
} QUIC_CHANNEL_ARGS;
typedef struct quic_channel_st QUIC_CHANNEL;
# ifndef OPENSSL_NO_QUIC
+typedef void (*ossl_msg_cb)(int write_p, int version, int content_type,
+ const void *buf, size_t len, SSL *ssl, void *arg);
+
/*
* QUIC Record Layer - RX
* ======================
/* Initial key phase. For debugging use only; always 0 in real use. */
unsigned char init_key_phase_bit;
+
+ /* Message callback related arguments */
+ ossl_msg_cb msg_callback;
+ void *msg_callback_arg;
+ SSL *msg_callback_s;
} OSSL_QRX_ARGS;
/* Instantiates a new QRX. */
# define SSL3_RT_HEADER 0x100
# define SSL3_RT_INNER_CONTENT_TYPE 0x101
+/* Pseudo content types for QUIC */
+# define SSL3_RT_QUIC_DATAGRAM 0x200
+
# define SSL3_AL_WARNING 1
# define SSL3_AL_FATAL 2
qrx_args.demux = ch->demux;
qrx_args.short_conn_id_len = rx_short_cid_len;
qrx_args.max_deferred = 32;
+ /* Callback related arguments */
+ qrx_args.msg_callback = ch->msg_callback;
+ qrx_args.msg_callback_arg = ch->msg_callback_arg;
+ qrx_args.msg_callback_s = ch->msg_callback_s;
if ((ch->qrx = ossl_qrx_new(&qrx_args)) == NULL)
goto err;
if ((ch = OPENSSL_zalloc(sizeof(*ch))) == NULL)
return NULL;
- ch->libctx = args->libctx;
- ch->propq = args->propq;
- ch->is_server = args->is_server;
- ch->tls = args->tls;
- ch->mutex = args->mutex;
- ch->now_cb = args->now_cb;
- ch->now_cb_arg = args->now_cb_arg;
+ ch->libctx = args->libctx;
+ ch->propq = args->propq;
+ ch->is_server = args->is_server;
+ ch->tls = args->tls;
+ ch->mutex = args->mutex;
+ ch->now_cb = args->now_cb;
+ ch->now_cb_arg = args->now_cb_arg;
+ ch->msg_callback = args->msg_callback;
+ ch->msg_callback_arg = args->msg_callback_arg;
+ ch->msg_callback_s = args->msg_callback_s;
if (!ch_init(ch)) {
OPENSSL_free(ch);
OSSL_QTX *qtx;
OSSL_QRX *qrx;
+ /* Message callback related arguments */
+ ossl_msg_cb msg_callback;
+ void *msg_callback_arg;
+ SSL *msg_callback_s;
+
/*
* Send and receive parts of the crypto streams.
* crypto_send[QUIC_PN_SPACE_APP] is the 1-RTT crypto stream. There is no
qc->default_blocking = 1;
qc->incoming_stream_policy = SSL_INCOMING_STREAM_POLICY_AUTO;
qc->last_error = SSL_ERROR_NONE;
+ qc->msg_callback = ctx->msg_callback;
+ qc->msg_callback_arg = ctx->msg_callback_arg;
+ qc->msg_callback_s = ssl_base;
if (!create_channel(qc))
goto err;
}
return ctx.qc->default_ssl_mode;
+
+ case SSL_CTRL_SET_MSG_CALLBACK_ARG:
+ ctx.qc->msg_callback_arg = parg;
+ /* This ctrl also needs to be passed to the internal SSL object */
+ return SSL_ctrl(ctx.qc->tls, cmd, larg, parg);
+
default:
/* Probably a TLS related ctrl. Defer to our internal SSL object */
return SSL_ctrl(ctx.qc->tls, cmd, larg, parg);
{
QUIC_CHANNEL_ARGS args = {0};
- args.libctx = qc->ssl.ctx->libctx;
- args.propq = qc->ssl.ctx->propq;
- args.is_server = qc->as_server;
- args.tls = qc->tls;
- args.mutex = qc->mutex;
- args.now_cb = qc->override_now_cb;
- args.now_cb_arg = qc->override_now_cb_arg;
+ args.libctx = qc->ssl.ctx->libctx;
+ args.propq = qc->ssl.ctx->propq;
+ args.is_server = qc->as_server;
+ args.tls = qc->tls;
+ args.mutex = qc->mutex;
+ args.now_cb = qc->override_now_cb;
+ args.now_cb_arg = qc->override_now_cb_arg;
+ args.msg_callback = qc->msg_callback;
+ args.msg_callback_arg = qc->msg_callback_arg;
+ args.msg_callback_s = qc->msg_callback_s;
qc->ch = ossl_quic_channel_new(&args);
if (qc->ch == NULL)
long ossl_quic_callback_ctrl(SSL *s, int cmd, void (*fp) (void))
{
- return ssl3_callback_ctrl(s, cmd, fp);
+ QCTX ctx;
+
+ if (!expect_quic_conn_only(s, &ctx))
+ return 0;
+
+ switch (cmd) {
+ case SSL_CTRL_SET_MSG_CALLBACK:
+ ctx.qc->msg_callback = (ossl_msg_cb)fp;
+ /* This callback also needs to be set on the internal SSL object */
+ return ssl3_callback_ctrl(ctx.qc->tls, cmd, fp);;
+
+ default:
+ /* Probably a TLS related ctrl. Defer to our internal SSL object */
+ return ssl3_callback_ctrl(ctx.qc->tls, cmd, fp);
+ }
}
long ossl_quic_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp) (void))
* and SSL_ERROR_WANT_WRITE.
*/
int last_error;
+
+ /* Message callback related arguments */
+ ossl_msg_cb msg_callback;
+ void *msg_callback_arg;
+ SSL *msg_callback_s;
};
/* Internal calls to the QUIC CSM which come from various places. */
/* Initial key phase. For debugging use only; always 0 in real use. */
unsigned char init_key_phase_bit;
+
+ /* Message callback related arguments */
+ ossl_msg_cb msg_callback;
+ void *msg_callback_arg;
+ SSL *msg_callback_s;
};
static void qrx_on_rx(QUIC_URXE *urxe, void *arg);
qrx->short_conn_id_len = args->short_conn_id_len;
qrx->init_key_phase_bit = args->init_key_phase_bit;
qrx->max_deferred = args->max_deferred;
+ qrx->msg_callback = args->msg_callback;
+ qrx->msg_callback_arg = args->msg_callback_arg;
+ qrx->msg_callback_s = args->msg_callback_s;
return qrx;
}
if (!PACKET_buf_init(&pkt, data, data_len))
return 0;
+ if (qrx->msg_callback != NULL)
+ qrx->msg_callback(0, OSSL_QUIC1_VERSION, SSL3_RT_QUIC_DATAGRAM, data,
+ data_len, qrx->msg_callback_s, qrx->msg_callback_arg);
+
for (; PACKET_remaining(&pkt) > 0; ++pkt_idx) {
/*
* A packet smallest than the minimum possible QUIC packet size is not
return (int)sc->ext.peer_supportedgroups_len;
}
+ case SSL_CTRL_SET_MSG_CALLBACK_ARG:
+ sc->msg_callback_arg = parg;
+ return 1;
+
default:
break;
}
sc->not_resumable_session_cb = (int (*)(SSL *, int))fp;
ret = 1;
break;
+
+ case SSL_CTRL_SET_MSG_CALLBACK:
+ sc->msg_callback = (ossl_msg_cb)fp;
+ return 1;
default:
break;
}
RECORD_LAYER_set_read_ahead(&sc->rlayer, larg);
return l;
- case SSL_CTRL_SET_MSG_CALLBACK_ARG:
- sc->msg_callback_arg = parg;
- return 1;
-
case SSL_CTRL_MODE:
{
OSSL_PARAM options[2], *opts = options;
long SSL_callback_ctrl(SSL *s, int cmd, void (*fp) (void))
{
- SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
-
- if (sc == NULL)
- return 0;
-
- switch (cmd) {
- case SSL_CTRL_SET_MSG_CALLBACK:
- sc->msg_callback = (void (*)
- (int write_p, int version, int content_type,
- const void *buf, size_t len, SSL *ssl,
- void *arg))(fp);
- return 1;
-
- default:
- return s->method->ssl_callback_ctrl(s, cmd, fp);
- }
+ return s->method->ssl_callback_ctrl(s, cmd, fp);
}
LHASH_OF(SSL_SESSION) *SSL_CTX_sessions(SSL_CTX *ctx)
# define TLS_GROUP_FFDHE_FOR_TLS1_3 (TLS_GROUP_FFDHE|TLS_GROUP_ONLY_FOR_TLS1_3)
+typedef void (*ossl_msg_cb)(int write_p, int version, int content_type,
+ const void *buf, size_t len, SSL *ssl, void *arg);
+
struct ssl_ctx_st {
OSSL_LIB_CTX *libctx;
int read_ahead;
/* callback that allows applications to peek at protocol messages */
- void (*msg_callback) (int write_p, int version, int content_type,
- const void *buf, size_t len, SSL *ssl, void *arg);
+ ossl_msg_cb msg_callback;
void *msg_callback_arg;
uint32_t verify_mode;