xref: /openssl/ssl/quic/quic_impl.c (revision 2de7e1d6)
1 /*
2  * Copyright 2022-2024 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the Apache License 2.0 (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9 
10 #include <openssl/macros.h>
11 #include <openssl/objects.h>
12 #include <openssl/sslerr.h>
13 #include <crypto/rand.h>
14 #include "quic_local.h"
15 #include "internal/quic_tls.h"
16 #include "internal/quic_rx_depack.h"
17 #include "internal/quic_error.h"
18 #include "internal/quic_engine.h"
19 #include "internal/quic_port.h"
20 #include "internal/time.h"
21 
22 typedef struct qctx_st QCTX;
23 
24 static void aon_write_finish(QUIC_XSO *xso);
25 static int create_channel(QUIC_CONNECTION *qc);
26 static QUIC_XSO *create_xso_from_stream(QUIC_CONNECTION *qc, QUIC_STREAM *qs);
27 static int qc_try_create_default_xso_for_write(QCTX *ctx);
28 static int qc_wait_for_default_xso_for_read(QCTX *ctx, int peek);
29 static void quic_lock(QUIC_CONNECTION *qc);
30 static void quic_unlock(QUIC_CONNECTION *qc);
31 static void quic_lock_for_io(QCTX *ctx);
32 static int quic_do_handshake(QCTX *ctx);
33 static void qc_update_reject_policy(QUIC_CONNECTION *qc);
34 static void qc_touch_default_xso(QUIC_CONNECTION *qc);
35 static void qc_set_default_xso(QUIC_CONNECTION *qc, QUIC_XSO *xso, int touch);
36 static void qc_set_default_xso_keep_ref(QUIC_CONNECTION *qc, QUIC_XSO *xso,
37                                         int touch, QUIC_XSO **old_xso);
38 static SSL *quic_conn_stream_new(QCTX *ctx, uint64_t flags, int need_lock);
39 static int quic_validate_for_write(QUIC_XSO *xso, int *err);
40 static int quic_mutation_allowed(QUIC_CONNECTION *qc, int req_active);
41 static int qc_blocking_mode(const QUIC_CONNECTION *qc);
42 static int xso_blocking_mode(const QUIC_XSO *xso);
43 static void qctx_maybe_autotick(QCTX *ctx);
44 static int qctx_should_autotick(QCTX *ctx);
45 
46 /*
47  * QUIC Front-End I/O API: Common Utilities
48  * ========================================
49  */
50 
51 /*
52  * Block until a predicate is met.
53  *
54  * Precondition: Must have a channel.
55  * Precondition: Must hold channel lock (unchecked).
56  */
57 QUIC_NEEDS_LOCK
block_until_pred(QUIC_CONNECTION * qc,int (* pred)(void * arg),void * pred_arg,uint32_t flags)58 static int block_until_pred(QUIC_CONNECTION *qc,
59                             int (*pred)(void *arg), void *pred_arg,
60                             uint32_t flags)
61 {
62     QUIC_REACTOR *rtor;
63 
64     assert(qc->ch != NULL);
65 
66     /*
67      * Any attempt to block auto-disables tick inhibition as otherwise we will
68      * hang around forever.
69      */
70     ossl_quic_engine_set_inhibit_tick(qc->engine, 0);
71 
72     rtor = ossl_quic_channel_get_reactor(qc->ch);
73     return ossl_quic_reactor_block_until_pred(rtor, pred, pred_arg, flags,
74                                               qc->mutex);
75 }
76 
get_time(QUIC_CONNECTION * qc)77 static OSSL_TIME get_time(QUIC_CONNECTION *qc)
78 {
79     if (qc->override_now_cb != NULL)
80         return qc->override_now_cb(qc->override_now_cb_arg);
81     else
82         return ossl_time_now();
83 }
84 
get_time_cb(void * arg)85 static OSSL_TIME get_time_cb(void *arg)
86 {
87     QUIC_CONNECTION *qc = arg;
88 
89     return get_time(qc);
90 }
91 
92 /*
93  * QCTX is a utility structure which provides information we commonly wish to
94  * unwrap upon an API call being dispatched to us, namely:
95  *
96  *   - a pointer to the QUIC_CONNECTION (regardless of whether a QCSO or QSSO
97  *     was passed);
98  *   - a pointer to any applicable QUIC_XSO (e.g. if a QSSO was passed, or if
99  *     a QCSO with a default stream was passed);
100  *   - whether a QSSO was passed (xso == NULL must not be used to determine this
101  *     because it may be non-NULL when a QCSO is passed if that QCSO has a
102  *     default stream);
103  *   - whether we are in "I/O context", meaning that non-normal errors can
104  *     be reported via SSL_get_error() as well as via ERR. Functions such as
105  *     SSL_read(), SSL_write() and SSL_do_handshake() are "I/O context"
106  *     functions which are allowed to change the value returned by
107  *     SSL_get_error. However, other functions (including functions which call
108  *     SSL_do_handshake() implicitly) are not allowed to change the return value
109  *     of SSL_get_error.
110  */
111 struct qctx_st {
112     QUIC_CONNECTION *qc;
113     QUIC_XSO        *xso;
114     int             is_stream, in_io;
115 };
116 
117 QUIC_NEEDS_LOCK
quic_set_last_error(QCTX * ctx,int last_error)118 static void quic_set_last_error(QCTX *ctx, int last_error)
119 {
120     if (!ctx->in_io)
121         return;
122 
123     if (ctx->is_stream && ctx->xso != NULL)
124         ctx->xso->last_error = last_error;
125     else if (!ctx->is_stream && ctx->qc != NULL)
126         ctx->qc->last_error = last_error;
127 }
128 
129 /*
130  * Raise a 'normal' error, meaning one that can be reported via SSL_get_error()
131  * rather than via ERR. Note that normal errors must always be raised while
132  * holding a lock.
133  */
134 QUIC_NEEDS_LOCK
quic_raise_normal_error(QCTX * ctx,int err)135 static int quic_raise_normal_error(QCTX *ctx,
136                                    int err)
137 {
138     assert(ctx->in_io);
139     quic_set_last_error(ctx, err);
140 
141     return 0;
142 }
143 
144 /*
145  * Raise a 'non-normal' error, meaning any error that is not reported via
146  * SSL_get_error() and must be reported via ERR.
147  *
148  * qc should be provided if available. In exceptional circumstances when qc is
149  * not known NULL may be passed. This should generally only happen when an
150  * expect_...() function defined below fails, which generally indicates a
151  * dispatch error or caller error.
152  *
153  * ctx should be NULL if the connection lock is not held.
154  */
quic_raise_non_normal_error(QCTX * ctx,const char * file,int line,const char * func,int reason,const char * fmt,...)155 static int quic_raise_non_normal_error(QCTX *ctx,
156                                        const char *file,
157                                        int line,
158                                        const char *func,
159                                        int reason,
160                                        const char *fmt,
161                                        ...)
162 {
163     va_list args;
164 
165     if (ctx != NULL) {
166         quic_set_last_error(ctx, SSL_ERROR_SSL);
167 
168         if (reason == SSL_R_PROTOCOL_IS_SHUTDOWN && ctx->qc != NULL)
169             ossl_quic_channel_restore_err_state(ctx->qc->ch);
170     }
171 
172     ERR_new();
173     ERR_set_debug(file, line, func);
174 
175     va_start(args, fmt);
176     ERR_vset_error(ERR_LIB_SSL, reason, fmt, args);
177     va_end(args);
178 
179     return 0;
180 }
181 
182 #define QUIC_RAISE_NORMAL_ERROR(ctx, err)                       \
183     quic_raise_normal_error((ctx), (err))
184 
185 #define QUIC_RAISE_NON_NORMAL_ERROR(ctx, reason, msg)           \
186     quic_raise_non_normal_error((ctx),                          \
187                                 OPENSSL_FILE, OPENSSL_LINE,     \
188                                 OPENSSL_FUNC,                   \
189                                 (reason),                       \
190                                 (msg))
191 
192 /*
193  * Given a QCSO or QSSO, initialises a QCTX, determining the contextually
194  * applicable QUIC_CONNECTION pointer and, if applicable, QUIC_XSO pointer.
195  *
196  * After this returns 1, all fields of the passed QCTX are initialised.
197  * Returns 0 on failure. This function is intended to be used to provide API
198  * semantics and as such, it invokes QUIC_RAISE_NON_NORMAL_ERROR() on failure.
199  */
expect_quic(const SSL * s,QCTX * ctx)200 static int expect_quic(const SSL *s, QCTX *ctx)
201 {
202     QUIC_CONNECTION *qc;
203     QUIC_XSO *xso;
204 
205     ctx->qc         = NULL;
206     ctx->xso        = NULL;
207     ctx->is_stream  = 0;
208 
209     if (s == NULL)
210         return QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_PASSED_NULL_PARAMETER, NULL);
211 
212     switch (s->type) {
213     case SSL_TYPE_QUIC_CONNECTION:
214         qc              = (QUIC_CONNECTION *)s;
215         ctx->qc         = qc;
216         ctx->xso        = qc->default_xso;
217         ctx->is_stream  = 0;
218         ctx->in_io      = 0;
219         return 1;
220 
221     case SSL_TYPE_QUIC_XSO:
222         xso             = (QUIC_XSO *)s;
223         ctx->qc         = xso->conn;
224         ctx->xso        = xso;
225         ctx->is_stream  = 1;
226         ctx->in_io      = 0;
227         return 1;
228 
229     default:
230         return QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
231     }
232 }
233 
234 /*
235  * Like expect_quic(), but requires a QUIC_XSO be contextually available. In
236  * other words, requires that the passed QSO be a QSSO or a QCSO with a default
237  * stream.
238  *
239  * remote_init determines if we expect the default XSO to be remotely created or
240  * not. If it is -1, do not instantiate a default XSO if one does not yet exist.
241  *
242  * Channel mutex is acquired and retained on success.
243  */
244 QUIC_ACQUIRES_LOCK
expect_quic_with_stream_lock(const SSL * s,int remote_init,int in_io,QCTX * ctx)245 static int ossl_unused expect_quic_with_stream_lock(const SSL *s, int remote_init,
246                                                     int in_io, QCTX *ctx)
247 {
248     if (!expect_quic(s, ctx))
249         return 0;
250 
251     if (in_io)
252         quic_lock_for_io(ctx);
253     else
254         quic_lock(ctx->qc);
255 
256     if (ctx->xso == NULL && remote_init >= 0) {
257         if (!quic_mutation_allowed(ctx->qc, /*req_active=*/0)) {
258             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
259             goto err;
260         }
261 
262         /* If we haven't finished the handshake, try to advance it. */
263         if (quic_do_handshake(ctx) < 1)
264             /* ossl_quic_do_handshake raised error here */
265             goto err;
266 
267         if (remote_init == 0) {
268             if (!qc_try_create_default_xso_for_write(ctx))
269                 goto err;
270         } else {
271             if (!qc_wait_for_default_xso_for_read(ctx, /*peek=*/0))
272                 goto err;
273         }
274 
275         ctx->xso = ctx->qc->default_xso;
276     }
277 
278     if (ctx->xso == NULL) {
279         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_NO_STREAM, NULL);
280         goto err;
281     }
282 
283     return 1; /* coverity[missing_unlock]: lock held */
284 
285 err:
286     quic_unlock(ctx->qc);
287     return 0;
288 }
289 
290 /*
291  * Like expect_quic(), but fails if called on a QUIC_XSO. ctx->xso may still
292  * be non-NULL if the QCSO has a default stream.
293  */
expect_quic_conn_only(const SSL * s,QCTX * ctx)294 static int ossl_unused expect_quic_conn_only(const SSL *s, QCTX *ctx)
295 {
296     if (!expect_quic(s, ctx))
297         return 0;
298 
299     if (ctx->is_stream)
300         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_CONN_USE_ONLY, NULL);
301 
302     return 1;
303 }
304 
305 /*
306  * Ensures that the channel mutex is held for a method which touches channel
307  * state.
308  *
309  * Precondition: Channel mutex is not held (unchecked)
310  */
quic_lock(QUIC_CONNECTION * qc)311 static void quic_lock(QUIC_CONNECTION *qc)
312 {
313 #if defined(OPENSSL_THREADS)
314     ossl_crypto_mutex_lock(qc->mutex);
315 #endif
316 }
317 
quic_lock_for_io(QCTX * ctx)318 static void quic_lock_for_io(QCTX *ctx)
319 {
320     quic_lock(ctx->qc);
321     ctx->in_io = 1;
322 
323     /*
324      * We are entering an I/O function so we must update the values returned by
325      * SSL_get_error and SSL_want. Set no error. This will be overridden later
326      * if a call to QUIC_RAISE_NORMAL_ERROR or QUIC_RAISE_NON_NORMAL_ERROR
327      * occurs during the API call.
328      */
329     quic_set_last_error(ctx, SSL_ERROR_NONE);
330 }
331 
332 /* Precondition: Channel mutex is held (unchecked) */
333 QUIC_NEEDS_LOCK
quic_unlock(QUIC_CONNECTION * qc)334 static void quic_unlock(QUIC_CONNECTION *qc)
335 {
336 #if defined(OPENSSL_THREADS)
337     ossl_crypto_mutex_unlock(qc->mutex);
338 #endif
339 }
340 
341 /*
342  * This predicate is the criterion which should determine API call rejection for
343  * *most* mutating API calls, particularly stream-related operations for send
344  * parts.
345  *
346  * A call is rejected (this function returns 0) if shutdown is in progress
347  * (stream flushing), or we are in a TERMINATING or TERMINATED state. If
348  * req_active=1, the connection must be active (i.e., the IDLE state is also
349  * rejected).
350  */
quic_mutation_allowed(QUIC_CONNECTION * qc,int req_active)351 static int quic_mutation_allowed(QUIC_CONNECTION *qc, int req_active)
352 {
353     if (qc->shutting_down || ossl_quic_channel_is_term_any(qc->ch))
354         return 0;
355 
356     if (req_active && !ossl_quic_channel_is_active(qc->ch))
357         return 0;
358 
359     return 1;
360 }
361 
362 /*
363  * QUIC Front-End I/O API: Initialization
364  * ======================================
365  *
366  *         SSL_new                  => ossl_quic_new
367  *                                     ossl_quic_init
368  *         SSL_reset                => ossl_quic_reset
369  *         SSL_clear                => ossl_quic_clear
370  *                                     ossl_quic_deinit
371  *         SSL_free                 => ossl_quic_free
372  *
373  *         SSL_set_options          => ossl_quic_set_options
374  *         SSL_get_options          => ossl_quic_get_options
375  *         SSL_clear_options        => ossl_quic_clear_options
376  *
377  */
378 
379 /* SSL_new */
ossl_quic_new(SSL_CTX * ctx)380 SSL *ossl_quic_new(SSL_CTX *ctx)
381 {
382     QUIC_CONNECTION *qc = NULL;
383     SSL *ssl_base = NULL;
384     SSL_CONNECTION *sc = NULL;
385 
386     qc = OPENSSL_zalloc(sizeof(*qc));
387     if (qc == NULL) {
388         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_CRYPTO_LIB, NULL);
389         return NULL;
390     }
391 #if defined(OPENSSL_THREADS)
392     if ((qc->mutex = ossl_crypto_mutex_new()) == NULL) {
393         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_CRYPTO_LIB, NULL);
394         goto err;
395     }
396 #endif
397 
398     /* Initialise the QUIC_CONNECTION's stub header. */
399     ssl_base = &qc->ssl;
400     if (!ossl_ssl_init(ssl_base, ctx, ctx->method, SSL_TYPE_QUIC_CONNECTION)) {
401         ssl_base = NULL;
402         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
403         goto err;
404     }
405 
406     qc->tls = ossl_ssl_connection_new_int(ctx, ssl_base, TLS_method());
407     if (qc->tls == NULL || (sc = SSL_CONNECTION_FROM_SSL(qc->tls)) == NULL) {
408         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
409         goto err;
410     }
411 
412     /* override the user_ssl of the inner connection */
413     sc->s3.flags |= TLS1_FLAGS_QUIC;
414 
415     /* Restrict options derived from the SSL_CTX. */
416     sc->options &= OSSL_QUIC_PERMITTED_OPTIONS_CONN;
417     sc->pha_enabled = 0;
418 
419 #if !defined(OPENSSL_NO_QUIC_THREAD_ASSIST)
420     qc->is_thread_assisted
421         = (ssl_base->method == OSSL_QUIC_client_thread_method());
422 #endif
423 
424     qc->as_server       = 0; /* TODO(QUIC SERVER): add server support */
425     qc->as_server_state = qc->as_server;
426 
427     qc->default_stream_mode     = SSL_DEFAULT_STREAM_MODE_AUTO_BIDI;
428     qc->default_ssl_mode        = qc->ssl.ctx->mode;
429     qc->default_ssl_options     = qc->ssl.ctx->options & OSSL_QUIC_PERMITTED_OPTIONS;
430     qc->desires_blocking        = 1;
431     qc->blocking                = 0;
432     qc->incoming_stream_policy  = SSL_INCOMING_STREAM_POLICY_AUTO;
433     qc->last_error              = SSL_ERROR_NONE;
434 
435     if (!create_channel(qc))
436         goto err;
437 
438     ossl_quic_channel_set_msg_callback(qc->ch, ctx->msg_callback, ssl_base);
439     ossl_quic_channel_set_msg_callback_arg(qc->ch, ctx->msg_callback_arg);
440 
441     qc_update_reject_policy(qc);
442 
443     /*
444      * We do not create the default XSO yet. The reason for this is that the
445      * stream ID of the default XSO will depend on whether the stream is client
446      * or server-initiated, which depends on who transmits first. Since we do
447      * not know whether the application will be using a client-transmits-first
448      * or server-transmits-first protocol, we defer default XSO creation until
449      * the client calls SSL_read() or SSL_write(). If it calls SSL_read() first,
450      * we take that as a cue that the client is expecting a server-initiated
451      * stream, and vice versa if SSL_write() is called first.
452      */
453     return ssl_base;
454 
455 err:
456     if (ssl_base == NULL) {
457 #if defined(OPENSSL_THREADS)
458         ossl_crypto_mutex_free(&qc->mutex);
459 #endif
460         OPENSSL_free(qc);
461     } else {
462         SSL_free(ssl_base);
463     }
464     return NULL;
465 }
466 
467 /* SSL_free */
468 QUIC_TAKES_LOCK
ossl_quic_free(SSL * s)469 void ossl_quic_free(SSL *s)
470 {
471     QCTX ctx;
472     int is_default;
473 
474     /* We should never be called on anything but a QSO. */
475     if (!expect_quic(s, &ctx))
476         return;
477 
478     quic_lock(ctx.qc);
479 
480     if (ctx.is_stream) {
481         /*
482          * When a QSSO is freed, the XSO is freed immediately, because the XSO
483          * itself only contains API personality layer data. However the
484          * underlying QUIC_STREAM is not freed immediately but is instead marked
485          * as deleted for later collection.
486          */
487 
488         assert(ctx.qc->num_xso > 0);
489         --ctx.qc->num_xso;
490 
491         /* If a stream's send part has not been finished, auto-reset it. */
492         if ((   ctx.xso->stream->send_state == QUIC_SSTREAM_STATE_READY
493              || ctx.xso->stream->send_state == QUIC_SSTREAM_STATE_SEND)
494             && !ossl_quic_sstream_get_final_size(ctx.xso->stream->sstream, NULL))
495             ossl_quic_stream_map_reset_stream_send_part(ossl_quic_channel_get_qsm(ctx.qc->ch),
496                                                         ctx.xso->stream, 0);
497 
498         /* Do STOP_SENDING for the receive part, if applicable. */
499         if (   ctx.xso->stream->recv_state == QUIC_RSTREAM_STATE_RECV
500             || ctx.xso->stream->recv_state == QUIC_RSTREAM_STATE_SIZE_KNOWN)
501             ossl_quic_stream_map_stop_sending_recv_part(ossl_quic_channel_get_qsm(ctx.qc->ch),
502                                                         ctx.xso->stream, 0);
503 
504         /* Update stream state. */
505         ctx.xso->stream->deleted = 1;
506         ossl_quic_stream_map_update_state(ossl_quic_channel_get_qsm(ctx.qc->ch),
507                                           ctx.xso->stream);
508 
509         is_default = (ctx.xso == ctx.qc->default_xso);
510         quic_unlock(ctx.qc);
511 
512         /*
513          * Unref the connection in most cases; the XSO has a ref to the QC and
514          * not vice versa. But for a default XSO, to avoid circular references,
515          * the QC refs the XSO but the XSO does not ref the QC. If we are the
516          * default XSO, we only get here when the QC is being torn down anyway,
517          * so don't call SSL_free(qc) as we are already in it.
518          */
519         if (!is_default)
520             SSL_free(&ctx.qc->ssl);
521 
522         /* Note: SSL_free calls OPENSSL_free(xso) for us */
523         return;
524     }
525 
526     /*
527      * Free the default XSO, if any. The QUIC_STREAM is not deleted at this
528      * stage, but is freed during the channel free when the whole QSM is freed.
529      */
530     if (ctx.qc->default_xso != NULL) {
531         QUIC_XSO *xso = ctx.qc->default_xso;
532 
533         quic_unlock(ctx.qc);
534         SSL_free(&xso->ssl);
535         quic_lock(ctx.qc);
536         ctx.qc->default_xso = NULL;
537     }
538 
539     /* Ensure we have no remaining XSOs. */
540     assert(ctx.qc->num_xso == 0);
541 
542 #if !defined(OPENSSL_NO_QUIC_THREAD_ASSIST)
543     if (ctx.qc->is_thread_assisted && ctx.qc->started) {
544         ossl_quic_thread_assist_wait_stopped(&ctx.qc->thread_assist);
545         ossl_quic_thread_assist_cleanup(&ctx.qc->thread_assist);
546     }
547 #endif
548 
549     SSL_free(ctx.qc->tls);
550 
551     ossl_quic_channel_free(ctx.qc->ch);
552     ossl_quic_port_free(ctx.qc->port);
553     ossl_quic_engine_free(ctx.qc->engine);
554 
555     BIO_free_all(ctx.qc->net_rbio);
556     BIO_free_all(ctx.qc->net_wbio);
557 
558     quic_unlock(ctx.qc); /* tsan doesn't like freeing locked mutexes */
559 #if defined(OPENSSL_THREADS)
560     ossl_crypto_mutex_free(&ctx.qc->mutex);
561 #endif
562 
563     /*
564      * Note: SSL_free (that called this function) calls OPENSSL_free(ctx.qc) for
565      * us
566      */
567 }
568 
569 /* SSL method init */
ossl_quic_init(SSL * s)570 int ossl_quic_init(SSL *s)
571 {
572     /* Same op as SSL_clear, forward the call. */
573     return ossl_quic_clear(s);
574 }
575 
576 /* SSL method deinit */
ossl_quic_deinit(SSL * s)577 void ossl_quic_deinit(SSL *s)
578 {
579     /* No-op. */
580 }
581 
582 /* SSL_clear (ssl_reset method) */
ossl_quic_reset(SSL * s)583 int ossl_quic_reset(SSL *s)
584 {
585     QCTX ctx;
586 
587     if (!expect_quic(s, &ctx))
588         return 0;
589 
590     ERR_raise(ERR_LIB_SSL, ERR_R_UNSUPPORTED);
591     return 0;
592 }
593 
594 /* ssl_clear method (unused) */
ossl_quic_clear(SSL * s)595 int ossl_quic_clear(SSL *s)
596 {
597     QCTX ctx;
598 
599     if (!expect_quic(s, &ctx))
600         return 0;
601 
602     ERR_raise(ERR_LIB_SSL, ERR_R_UNSUPPORTED);
603     return 0;
604 }
605 
ossl_quic_conn_set_override_now_cb(SSL * s,OSSL_TIME (* now_cb)(void * arg),void * now_cb_arg)606 int ossl_quic_conn_set_override_now_cb(SSL *s,
607                                        OSSL_TIME (*now_cb)(void *arg),
608                                        void *now_cb_arg)
609 {
610     QCTX ctx;
611 
612     if (!expect_quic(s, &ctx))
613         return 0;
614 
615     quic_lock(ctx.qc);
616 
617     ctx.qc->override_now_cb     = now_cb;
618     ctx.qc->override_now_cb_arg = now_cb_arg;
619 
620     quic_unlock(ctx.qc);
621     return 1;
622 }
623 
ossl_quic_conn_force_assist_thread_wake(SSL * s)624 void ossl_quic_conn_force_assist_thread_wake(SSL *s)
625 {
626     QCTX ctx;
627 
628     if (!expect_quic(s, &ctx))
629         return;
630 
631 #if !defined(OPENSSL_NO_QUIC_THREAD_ASSIST)
632     if (ctx.qc->is_thread_assisted && ctx.qc->started)
633         ossl_quic_thread_assist_notify_deadline_changed(&ctx.qc->thread_assist);
634 #endif
635 }
636 
637 QUIC_NEEDS_LOCK
qc_touch_default_xso(QUIC_CONNECTION * qc)638 static void qc_touch_default_xso(QUIC_CONNECTION *qc)
639 {
640     qc->default_xso_created = 1;
641     qc_update_reject_policy(qc);
642 }
643 
644 /*
645  * Changes default XSO. Allows caller to keep reference to the old default XSO
646  * (if any). Reference to new XSO is transferred from caller.
647  */
648 QUIC_NEEDS_LOCK
qc_set_default_xso_keep_ref(QUIC_CONNECTION * qc,QUIC_XSO * xso,int touch,QUIC_XSO ** old_xso)649 static void qc_set_default_xso_keep_ref(QUIC_CONNECTION *qc, QUIC_XSO *xso,
650                                         int touch,
651                                         QUIC_XSO **old_xso)
652 {
653     int refs;
654 
655     *old_xso = NULL;
656 
657     if (qc->default_xso != xso) {
658         *old_xso = qc->default_xso; /* transfer old XSO ref to caller */
659 
660         qc->default_xso = xso;
661 
662         if (xso == NULL) {
663             /*
664              * Changing to not having a default XSO. XSO becomes standalone and
665              * now has a ref to the QC.
666              */
667             if (!ossl_assert(SSL_up_ref(&qc->ssl)))
668                 return;
669         } else {
670             /*
671              * Changing from not having a default XSO to having one. The new XSO
672              * will have had a reference to the QC we need to drop to avoid a
673              * circular reference.
674              *
675              * Currently we never change directly from one default XSO to
676              * another, though this function would also still be correct if this
677              * weren't the case.
678              */
679             assert(*old_xso == NULL);
680 
681             CRYPTO_DOWN_REF(&qc->ssl.references, &refs);
682             assert(refs > 0);
683         }
684     }
685 
686     if (touch)
687         qc_touch_default_xso(qc);
688 }
689 
690 /*
691  * Changes default XSO, releasing the reference to any previous default XSO.
692  * Reference to new XSO is transferred from caller.
693  */
694 QUIC_NEEDS_LOCK
qc_set_default_xso(QUIC_CONNECTION * qc,QUIC_XSO * xso,int touch)695 static void qc_set_default_xso(QUIC_CONNECTION *qc, QUIC_XSO *xso, int touch)
696 {
697     QUIC_XSO *old_xso = NULL;
698 
699     qc_set_default_xso_keep_ref(qc, xso, touch, &old_xso);
700 
701     if (old_xso != NULL)
702         SSL_free(&old_xso->ssl);
703 }
704 
705 QUIC_NEEDS_LOCK
xso_update_options(QUIC_XSO * xso)706 static void xso_update_options(QUIC_XSO *xso)
707 {
708     int cleanse = ((xso->ssl_options & SSL_OP_CLEANSE_PLAINTEXT) != 0);
709 
710     if (xso->stream->rstream != NULL)
711         ossl_quic_rstream_set_cleanse(xso->stream->rstream, cleanse);
712 
713     if (xso->stream->sstream != NULL)
714         ossl_quic_sstream_set_cleanse(xso->stream->sstream, cleanse);
715 }
716 
717 /*
718  * SSL_set_options
719  * ---------------
720  *
721  * Setting options on a QCSO
722  *   - configures the handshake-layer options;
723  *   - configures the default data-plane options for new streams;
724  *   - configures the data-plane options on the default XSO, if there is one.
725  *
726  * Setting options on a QSSO
727  *   - configures data-plane options for that stream only.
728  */
729 QUIC_TAKES_LOCK
quic_mask_or_options(SSL * ssl,uint64_t mask_value,uint64_t or_value)730 static uint64_t quic_mask_or_options(SSL *ssl, uint64_t mask_value, uint64_t or_value)
731 {
732     QCTX ctx;
733     uint64_t hs_mask_value, hs_or_value, ret;
734 
735     if (!expect_quic(ssl, &ctx))
736         return 0;
737 
738     quic_lock(ctx.qc);
739 
740     if (!ctx.is_stream) {
741         /*
742          * If we were called on the connection, we apply any handshake option
743          * changes.
744          */
745         hs_mask_value = (mask_value & OSSL_QUIC_PERMITTED_OPTIONS_CONN);
746         hs_or_value   = (or_value   & OSSL_QUIC_PERMITTED_OPTIONS_CONN);
747 
748         SSL_clear_options(ctx.qc->tls, hs_mask_value);
749         SSL_set_options(ctx.qc->tls, hs_or_value);
750 
751         /* Update defaults for new streams. */
752         ctx.qc->default_ssl_options
753             = ((ctx.qc->default_ssl_options & ~mask_value) | or_value)
754               & OSSL_QUIC_PERMITTED_OPTIONS;
755     }
756 
757     if (ctx.xso != NULL) {
758         ctx.xso->ssl_options
759             = ((ctx.xso->ssl_options & ~mask_value) | or_value)
760             & OSSL_QUIC_PERMITTED_OPTIONS_STREAM;
761 
762         xso_update_options(ctx.xso);
763     }
764 
765     ret = ctx.is_stream ? ctx.xso->ssl_options : ctx.qc->default_ssl_options;
766 
767     quic_unlock(ctx.qc);
768     return ret;
769 }
770 
ossl_quic_set_options(SSL * ssl,uint64_t options)771 uint64_t ossl_quic_set_options(SSL *ssl, uint64_t options)
772 {
773     return quic_mask_or_options(ssl, 0, options);
774 }
775 
776 /* SSL_clear_options */
ossl_quic_clear_options(SSL * ssl,uint64_t options)777 uint64_t ossl_quic_clear_options(SSL *ssl, uint64_t options)
778 {
779     return quic_mask_or_options(ssl, options, 0);
780 }
781 
782 /* SSL_get_options */
ossl_quic_get_options(const SSL * ssl)783 uint64_t ossl_quic_get_options(const SSL *ssl)
784 {
785     return quic_mask_or_options((SSL *)ssl, 0, 0);
786 }
787 
788 /*
789  * QUIC Front-End I/O API: Network BIO Configuration
790  * =================================================
791  *
792  * Handling the different BIOs is difficult:
793  *
794  *   - It is more or less a requirement that we use non-blocking network I/O;
795  *     we need to be able to have timeouts on recv() calls, and make best effort
796  *     (non blocking) send() and recv() calls.
797  *
798  *     The only sensible way to do this is to configure the socket into
799  *     non-blocking mode. We could try to do select() before calling send() or
800  *     recv() to get a guarantee that the call will not block, but this will
801  *     probably run into issues with buggy OSes which generate spurious socket
802  *     readiness events. In any case, relying on this to work reliably does not
803  *     seem sane.
804  *
805  *     Timeouts could be handled via setsockopt() socket timeout options, but
806  *     this depends on OS support and adds another syscall to every network I/O
807  *     operation. It also has obvious thread safety concerns if we want to move
808  *     to concurrent use of a single socket at some later date.
809  *
810  *     Some OSes support a MSG_DONTWAIT flag which allows a single I/O option to
811  *     be made non-blocking. However some OSes (e.g. Windows) do not support
812  *     this, so we cannot rely on this.
813  *
814  *     As such, we need to configure any FD in non-blocking mode. This may
815  *     confound users who pass a blocking socket to libssl. However, in practice
816  *     it would be extremely strange for a user of QUIC to pass an FD to us,
817  *     then also try and send receive traffic on the same socket(!). Thus the
818  *     impact of this should be limited, and can be documented.
819  *
820  *   - We support both blocking and non-blocking operation in terms of the API
821  *     presented to the user. One prospect is to set the blocking mode based on
822  *     whether the socket passed to us was already in blocking mode. However,
823  *     Windows has no API for determining if a socket is in blocking mode (!),
824  *     therefore this cannot be done portably. Currently therefore we expose an
825  *     explicit API call to set this, and default to blocking mode.
826  *
827  *   - We need to determine our initial destination UDP address. The "natural"
828  *     way for a user to do this is to set the peer variable on a BIO_dgram.
829  *     However, this has problems because BIO_dgram's peer variable is used for
830  *     both transmission and reception. This means it can be constantly being
831  *     changed to a malicious value (e.g. if some random unrelated entity on the
832  *     network starts sending traffic to us) on every read call. This is not a
833  *     direct issue because we use the 'stateless' BIO_sendmmsg and BIO_recvmmsg
834  *     calls only, which do not use this variable. However, we do need to let
835  *     the user specify the peer in a 'normal' manner. The compromise here is
836  *     that we grab the current peer value set at the time the write BIO is set
837  *     and do not read the value again.
838  *
839  *   - We also need to support memory BIOs (e.g. BIO_dgram_pair) or custom BIOs.
840  *     Currently we do this by only supporting non-blocking mode.
841  *
842  */
843 
844 /*
845  * Determines what initial destination UDP address we should use, if possible.
846  * If this fails the client must set the destination address manually, or use a
847  * BIO which does not need a destination address.
848  */
csm_analyse_init_peer_addr(BIO * net_wbio,BIO_ADDR * peer)849 static int csm_analyse_init_peer_addr(BIO *net_wbio, BIO_ADDR *peer)
850 {
851     if (BIO_dgram_detect_peer_addr(net_wbio, peer) <= 0)
852         return 0;
853 
854     return 1;
855 }
856 
qc_can_support_blocking_cached(QUIC_CONNECTION * qc)857 static int qc_can_support_blocking_cached(QUIC_CONNECTION *qc)
858 {
859     QUIC_REACTOR *rtor = ossl_quic_channel_get_reactor(qc->ch);
860 
861     return ossl_quic_reactor_can_poll_r(rtor)
862         && ossl_quic_reactor_can_poll_w(rtor);
863 }
864 
qc_update_can_support_blocking(QUIC_CONNECTION * qc)865 static void qc_update_can_support_blocking(QUIC_CONNECTION *qc)
866 {
867     ossl_quic_port_update_poll_descriptors(qc->port); /* best effort */
868 }
869 
qc_update_blocking_mode(QUIC_CONNECTION * qc)870 static void qc_update_blocking_mode(QUIC_CONNECTION *qc)
871 {
872     qc->blocking = qc->desires_blocking && qc_can_support_blocking_cached(qc);
873 }
874 
ossl_quic_conn_set0_net_rbio(SSL * s,BIO * net_rbio)875 void ossl_quic_conn_set0_net_rbio(SSL *s, BIO *net_rbio)
876 {
877     QCTX ctx;
878 
879     if (!expect_quic(s, &ctx))
880         return;
881 
882     if (ctx.qc->net_rbio == net_rbio)
883         return;
884 
885     if (!ossl_quic_port_set_net_rbio(ctx.qc->port, net_rbio))
886         return;
887 
888     BIO_free_all(ctx.qc->net_rbio);
889     ctx.qc->net_rbio = net_rbio;
890 
891     if (net_rbio != NULL)
892         BIO_set_nbio(net_rbio, 1); /* best effort autoconfig */
893 
894     /*
895      * Determine if the current pair of read/write BIOs now set allows blocking
896      * mode to be supported.
897      */
898     qc_update_can_support_blocking(ctx.qc);
899     qc_update_blocking_mode(ctx.qc);
900 }
901 
ossl_quic_conn_set0_net_wbio(SSL * s,BIO * net_wbio)902 void ossl_quic_conn_set0_net_wbio(SSL *s, BIO *net_wbio)
903 {
904     QCTX ctx;
905 
906     if (!expect_quic(s, &ctx))
907         return;
908 
909     if (ctx.qc->net_wbio == net_wbio)
910         return;
911 
912     if (!ossl_quic_port_set_net_wbio(ctx.qc->port, net_wbio))
913         return;
914 
915     BIO_free_all(ctx.qc->net_wbio);
916     ctx.qc->net_wbio = net_wbio;
917 
918     if (net_wbio != NULL)
919         BIO_set_nbio(net_wbio, 1); /* best effort autoconfig */
920 
921     /*
922      * Determine if the current pair of read/write BIOs now set allows blocking
923      * mode to be supported.
924      */
925     qc_update_can_support_blocking(ctx.qc);
926     qc_update_blocking_mode(ctx.qc);
927 }
928 
ossl_quic_conn_get_net_rbio(const SSL * s)929 BIO *ossl_quic_conn_get_net_rbio(const SSL *s)
930 {
931     QCTX ctx;
932 
933     if (!expect_quic(s, &ctx))
934         return NULL;
935 
936     return ctx.qc->net_rbio;
937 }
938 
ossl_quic_conn_get_net_wbio(const SSL * s)939 BIO *ossl_quic_conn_get_net_wbio(const SSL *s)
940 {
941     QCTX ctx;
942 
943     if (!expect_quic(s, &ctx))
944         return NULL;
945 
946     return ctx.qc->net_wbio;
947 }
948 
ossl_quic_conn_get_blocking_mode(const SSL * s)949 int ossl_quic_conn_get_blocking_mode(const SSL *s)
950 {
951     QCTX ctx;
952 
953     if (!expect_quic(s, &ctx))
954         return 0;
955 
956     if (ctx.is_stream)
957         return xso_blocking_mode(ctx.xso);
958 
959     return qc_blocking_mode(ctx.qc);
960 }
961 
962 QUIC_TAKES_LOCK
ossl_quic_conn_set_blocking_mode(SSL * s,int blocking)963 int ossl_quic_conn_set_blocking_mode(SSL *s, int blocking)
964 {
965     int ret = 0;
966     QCTX ctx;
967 
968     if (!expect_quic(s, &ctx))
969         return 0;
970 
971     quic_lock(ctx.qc);
972 
973     /* Sanity check - can we support the request given the current network BIO? */
974     if (blocking) {
975         /*
976          * If called directly on a QCSO, update our information on network BIO
977          * capabilities.
978          */
979         if (!ctx.is_stream)
980             qc_update_can_support_blocking(ctx.qc);
981 
982         /* Cannot enable blocking mode if we do not have pollable FDs. */
983         if (!qc_can_support_blocking_cached(ctx.qc)) {
984             ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_UNSUPPORTED, NULL);
985             goto out;
986         }
987     }
988 
989     if (!ctx.is_stream)
990         /*
991          * If called directly on a QCSO, update default and connection-level
992          * blocking modes.
993          */
994         ctx.qc->desires_blocking = (blocking != 0);
995 
996     if (ctx.xso != NULL) {
997         /*
998          * If called on a QSSO or a QCSO with a default XSO, update the blocking
999          * mode.
1000          */
1001         ctx.xso->desires_blocking       = (blocking != 0);
1002         ctx.xso->desires_blocking_set   = 1;
1003     }
1004 
1005     ret = 1;
1006 out:
1007     qc_update_blocking_mode(ctx.qc);
1008     quic_unlock(ctx.qc);
1009     return ret;
1010 }
1011 
ossl_quic_conn_set_initial_peer_addr(SSL * s,const BIO_ADDR * peer_addr)1012 int ossl_quic_conn_set_initial_peer_addr(SSL *s,
1013                                          const BIO_ADDR *peer_addr)
1014 {
1015     QCTX ctx;
1016 
1017     if (!expect_quic(s, &ctx))
1018         return 0;
1019 
1020     if (ctx.qc->started)
1021         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED,
1022                                        NULL);
1023 
1024     if (peer_addr == NULL) {
1025         BIO_ADDR_clear(&ctx.qc->init_peer_addr);
1026         return 1;
1027     }
1028 
1029     ctx.qc->init_peer_addr = *peer_addr;
1030     return 1;
1031 }
1032 
1033 /*
1034  * QUIC Front-End I/O API: Asynchronous I/O Management
1035  * ===================================================
1036  *
1037  *   (BIO/)SSL_handle_events        => ossl_quic_handle_events
1038  *   (BIO/)SSL_get_event_timeout    => ossl_quic_get_event_timeout
1039  *   (BIO/)SSL_get_poll_fd          => ossl_quic_get_poll_fd
1040  *
1041  */
1042 
1043 /* Returns 1 if the connection is being used in blocking mode. */
qc_blocking_mode(const QUIC_CONNECTION * qc)1044 static int qc_blocking_mode(const QUIC_CONNECTION *qc)
1045 {
1046     return qc->blocking;
1047 }
1048 
xso_blocking_mode(const QUIC_XSO * xso)1049 static int xso_blocking_mode(const QUIC_XSO *xso)
1050 {
1051     if (xso->desires_blocking_set)
1052         return xso->desires_blocking && qc_can_support_blocking_cached(xso->conn);
1053     else
1054         /* Only ever set if we can support blocking. */
1055         return xso->conn->blocking;
1056 }
1057 
1058 /* SSL_handle_events; performs QUIC I/O and timeout processing. */
1059 QUIC_TAKES_LOCK
ossl_quic_handle_events(SSL * s)1060 int ossl_quic_handle_events(SSL *s)
1061 {
1062     QCTX ctx;
1063 
1064     if (!expect_quic(s, &ctx))
1065         return 0;
1066 
1067     quic_lock(ctx.qc);
1068     if (ctx.qc->started)
1069         ossl_quic_reactor_tick(ossl_quic_channel_get_reactor(ctx.qc->ch), 0);
1070     quic_unlock(ctx.qc);
1071     return 1;
1072 }
1073 
1074 /*
1075  * SSL_get_event_timeout. Get the time in milliseconds until the SSL object
1076  * should next have events handled by the application by calling
1077  * SSL_handle_events(). tv is set to 0 if the object should have events handled
1078  * immediately. If no timeout is currently active, *is_infinite is set to 1 and
1079  * the value of *tv is undefined.
1080  */
1081 QUIC_TAKES_LOCK
ossl_quic_get_event_timeout(SSL * s,struct timeval * tv,int * is_infinite)1082 int ossl_quic_get_event_timeout(SSL *s, struct timeval *tv, int *is_infinite)
1083 {
1084     QCTX ctx;
1085     OSSL_TIME deadline = ossl_time_infinite();
1086 
1087     if (!expect_quic(s, &ctx))
1088         return 0;
1089 
1090     quic_lock(ctx.qc);
1091 
1092     if (ctx.qc->started)
1093         deadline
1094             = ossl_quic_reactor_get_tick_deadline(ossl_quic_channel_get_reactor(ctx.qc->ch));
1095 
1096     if (ossl_time_is_infinite(deadline)) {
1097         *is_infinite = 1;
1098 
1099         /*
1100          * Robustness against faulty applications that don't check *is_infinite;
1101          * harmless long timeout.
1102          */
1103         tv->tv_sec  = 1000000;
1104         tv->tv_usec = 0;
1105 
1106         quic_unlock(ctx.qc);
1107         return 1;
1108     }
1109 
1110     *tv = ossl_time_to_timeval(ossl_time_subtract(deadline, get_time(ctx.qc)));
1111     *is_infinite = 0;
1112     quic_unlock(ctx.qc);
1113     return 1;
1114 }
1115 
1116 /* SSL_get_rpoll_descriptor */
ossl_quic_get_rpoll_descriptor(SSL * s,BIO_POLL_DESCRIPTOR * desc)1117 int ossl_quic_get_rpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *desc)
1118 {
1119     QCTX ctx;
1120 
1121     if (!expect_quic(s, &ctx))
1122         return 0;
1123 
1124     if (desc == NULL || ctx.qc->net_rbio == NULL)
1125         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_INVALID_ARGUMENT,
1126                                        NULL);
1127 
1128     return BIO_get_rpoll_descriptor(ctx.qc->net_rbio, desc);
1129 }
1130 
1131 /* SSL_get_wpoll_descriptor */
ossl_quic_get_wpoll_descriptor(SSL * s,BIO_POLL_DESCRIPTOR * desc)1132 int ossl_quic_get_wpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *desc)
1133 {
1134     QCTX ctx;
1135 
1136     if (!expect_quic(s, &ctx))
1137         return 0;
1138 
1139     if (desc == NULL || ctx.qc->net_wbio == NULL)
1140         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_INVALID_ARGUMENT,
1141                                        NULL);
1142 
1143     return BIO_get_wpoll_descriptor(ctx.qc->net_wbio, desc);
1144 }
1145 
1146 /* SSL_net_read_desired */
1147 QUIC_TAKES_LOCK
ossl_quic_get_net_read_desired(SSL * s)1148 int ossl_quic_get_net_read_desired(SSL *s)
1149 {
1150     QCTX ctx;
1151     int ret;
1152 
1153     if (!expect_quic(s, &ctx))
1154         return 0;
1155 
1156     quic_lock(ctx.qc);
1157     ret = ossl_quic_reactor_net_read_desired(ossl_quic_channel_get_reactor(ctx.qc->ch));
1158     quic_unlock(ctx.qc);
1159     return ret;
1160 }
1161 
1162 /* SSL_net_write_desired */
1163 QUIC_TAKES_LOCK
ossl_quic_get_net_write_desired(SSL * s)1164 int ossl_quic_get_net_write_desired(SSL *s)
1165 {
1166     int ret;
1167     QCTX ctx;
1168 
1169     if (!expect_quic(s, &ctx))
1170         return 0;
1171 
1172     quic_lock(ctx.qc);
1173     ret = ossl_quic_reactor_net_write_desired(ossl_quic_channel_get_reactor(ctx.qc->ch));
1174     quic_unlock(ctx.qc);
1175     return ret;
1176 }
1177 
1178 /*
1179  * QUIC Front-End I/O API: Connection Lifecycle Operations
1180  * =======================================================
1181  *
1182  *         SSL_do_handshake         => ossl_quic_do_handshake
1183  *         SSL_set_connect_state    => ossl_quic_set_connect_state
1184  *         SSL_set_accept_state     => ossl_quic_set_accept_state
1185  *         SSL_shutdown             => ossl_quic_shutdown
1186  *         SSL_ctrl                 => ossl_quic_ctrl
1187  *   (BIO/)SSL_connect              => ossl_quic_connect
1188  *   (BIO/)SSL_accept               => ossl_quic_accept
1189  *
1190  */
1191 
1192 QUIC_NEEDS_LOCK
qc_shutdown_flush_init(QUIC_CONNECTION * qc)1193 static void qc_shutdown_flush_init(QUIC_CONNECTION *qc)
1194 {
1195     QUIC_STREAM_MAP *qsm;
1196 
1197     if (qc->shutting_down)
1198         return;
1199 
1200     qsm = ossl_quic_channel_get_qsm(qc->ch);
1201 
1202     ossl_quic_stream_map_begin_shutdown_flush(qsm);
1203     qc->shutting_down = 1;
1204 }
1205 
1206 /* Returns 1 if all shutdown-flush streams have been done with. */
1207 QUIC_NEEDS_LOCK
qc_shutdown_flush_finished(QUIC_CONNECTION * qc)1208 static int qc_shutdown_flush_finished(QUIC_CONNECTION *qc)
1209 {
1210     QUIC_STREAM_MAP *qsm = ossl_quic_channel_get_qsm(qc->ch);
1211 
1212     return qc->shutting_down
1213         && ossl_quic_stream_map_is_shutdown_flush_finished(qsm);
1214 }
1215 
1216 /* SSL_shutdown */
quic_shutdown_wait(void * arg)1217 static int quic_shutdown_wait(void *arg)
1218 {
1219     QUIC_CONNECTION *qc = arg;
1220 
1221     return ossl_quic_channel_is_terminated(qc->ch);
1222 }
1223 
1224 /* Returns 1 if shutdown flush process has finished or is inapplicable. */
quic_shutdown_flush_wait(void * arg)1225 static int quic_shutdown_flush_wait(void *arg)
1226 {
1227     QUIC_CONNECTION *qc = arg;
1228 
1229     return ossl_quic_channel_is_term_any(qc->ch)
1230         || qc_shutdown_flush_finished(qc);
1231 }
1232 
quic_shutdown_peer_wait(void * arg)1233 static int quic_shutdown_peer_wait(void *arg)
1234 {
1235     QUIC_CONNECTION *qc = arg;
1236     return ossl_quic_channel_is_term_any(qc->ch);
1237 }
1238 
1239 QUIC_TAKES_LOCK
ossl_quic_conn_shutdown(SSL * s,uint64_t flags,const SSL_SHUTDOWN_EX_ARGS * args,size_t args_len)1240 int ossl_quic_conn_shutdown(SSL *s, uint64_t flags,
1241                             const SSL_SHUTDOWN_EX_ARGS *args,
1242                             size_t args_len)
1243 {
1244     int ret;
1245     QCTX ctx;
1246     int stream_flush = ((flags & SSL_SHUTDOWN_FLAG_NO_STREAM_FLUSH) == 0);
1247     int no_block = ((flags & SSL_SHUTDOWN_FLAG_NO_BLOCK) != 0);
1248     int wait_peer = ((flags & SSL_SHUTDOWN_FLAG_WAIT_PEER) != 0);
1249 
1250     if (!expect_quic(s, &ctx))
1251         return -1;
1252 
1253     if (ctx.is_stream) {
1254         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_CONN_USE_ONLY, NULL);
1255         return -1;
1256     }
1257 
1258     quic_lock(ctx.qc);
1259 
1260     if (ossl_quic_channel_is_terminated(ctx.qc->ch)) {
1261         quic_unlock(ctx.qc);
1262         return 1;
1263     }
1264 
1265     /* Phase 1: Stream Flushing */
1266     if (!wait_peer && stream_flush) {
1267         qc_shutdown_flush_init(ctx.qc);
1268 
1269         if (!qc_shutdown_flush_finished(ctx.qc)) {
1270             if (!no_block && qc_blocking_mode(ctx.qc)) {
1271                 ret = block_until_pred(ctx.qc, quic_shutdown_flush_wait, ctx.qc, 0);
1272                 if (ret < 1) {
1273                     ret = 0;
1274                     goto err;
1275                 }
1276             } else {
1277                 qctx_maybe_autotick(&ctx);
1278             }
1279         }
1280 
1281         if (!qc_shutdown_flush_finished(ctx.qc)) {
1282             quic_unlock(ctx.qc);
1283             return 0; /* ongoing */
1284         }
1285     }
1286 
1287     /* Phase 2: Connection Closure */
1288     if (wait_peer && !ossl_quic_channel_is_term_any(ctx.qc->ch)) {
1289         if (!no_block && qc_blocking_mode(ctx.qc)) {
1290             ret = block_until_pred(ctx.qc, quic_shutdown_peer_wait, ctx.qc, 0);
1291             if (ret < 1) {
1292                 ret = 0;
1293                 goto err;
1294             }
1295         } else {
1296             qctx_maybe_autotick(&ctx);
1297         }
1298 
1299         if (!ossl_quic_channel_is_term_any(ctx.qc->ch)) {
1300             ret = 0; /* peer hasn't closed yet - still not done */
1301             goto err;
1302         }
1303 
1304         /*
1305          * We are at least terminating - go through the normal process of
1306          * waiting until we are in the TERMINATED state.
1307          */
1308     }
1309 
1310     /* Block mutation ops regardless of if we did stream flush. */
1311     ctx.qc->shutting_down = 1;
1312 
1313     /*
1314      * This call is a no-op if we are already terminating, so it doesn't
1315      * affect the wait_peer case.
1316      */
1317     ossl_quic_channel_local_close(ctx.qc->ch,
1318                                   args != NULL ? args->quic_error_code : 0,
1319                                   args != NULL ? args->quic_reason : NULL);
1320 
1321     SSL_set_shutdown(ctx.qc->tls, SSL_SENT_SHUTDOWN);
1322 
1323     if (ossl_quic_channel_is_terminated(ctx.qc->ch)) {
1324         quic_unlock(ctx.qc);
1325         return 1;
1326     }
1327 
1328     /* Phase 3: Terminating Wait Time */
1329     if (!no_block && qc_blocking_mode(ctx.qc)
1330         && (flags & SSL_SHUTDOWN_FLAG_RAPID) == 0) {
1331         ret = block_until_pred(ctx.qc, quic_shutdown_wait, ctx.qc, 0);
1332         if (ret < 1) {
1333             ret = 0;
1334             goto err;
1335         }
1336     } else {
1337         qctx_maybe_autotick(&ctx);
1338     }
1339 
1340     ret = ossl_quic_channel_is_terminated(ctx.qc->ch);
1341 err:
1342     quic_unlock(ctx.qc);
1343     return ret;
1344 }
1345 
1346 /* SSL_ctrl */
ossl_quic_ctrl(SSL * s,int cmd,long larg,void * parg)1347 long ossl_quic_ctrl(SSL *s, int cmd, long larg, void *parg)
1348 {
1349     QCTX ctx;
1350 
1351     if (!expect_quic(s, &ctx))
1352         return 0;
1353 
1354     switch (cmd) {
1355     case SSL_CTRL_MODE:
1356         /* If called on a QCSO, update the default mode. */
1357         if (!ctx.is_stream)
1358             ctx.qc->default_ssl_mode |= (uint32_t)larg;
1359 
1360         /*
1361          * If we were called on a QSSO or have a default stream, we also update
1362          * that.
1363          */
1364         if (ctx.xso != NULL) {
1365             /* Cannot enable EPW while AON write in progress. */
1366             if (ctx.xso->aon_write_in_progress)
1367                 larg &= ~SSL_MODE_ENABLE_PARTIAL_WRITE;
1368 
1369             ctx.xso->ssl_mode |= (uint32_t)larg;
1370             return ctx.xso->ssl_mode;
1371         }
1372 
1373         return ctx.qc->default_ssl_mode;
1374     case SSL_CTRL_CLEAR_MODE:
1375         if (!ctx.is_stream)
1376             ctx.qc->default_ssl_mode &= ~(uint32_t)larg;
1377 
1378         if (ctx.xso != NULL) {
1379             ctx.xso->ssl_mode &= ~(uint32_t)larg;
1380             return ctx.xso->ssl_mode;
1381         }
1382 
1383         return ctx.qc->default_ssl_mode;
1384 
1385     case SSL_CTRL_SET_MSG_CALLBACK_ARG:
1386         ossl_quic_channel_set_msg_callback_arg(ctx.qc->ch, parg);
1387         /* This ctrl also needs to be passed to the internal SSL object */
1388         return SSL_ctrl(ctx.qc->tls, cmd, larg, parg);
1389 
1390     case DTLS_CTRL_GET_TIMEOUT: /* DTLSv1_get_timeout */
1391         {
1392             int is_infinite;
1393 
1394             if (!ossl_quic_get_event_timeout(s, parg, &is_infinite))
1395                 return 0;
1396 
1397             return !is_infinite;
1398         }
1399     case DTLS_CTRL_HANDLE_TIMEOUT: /* DTLSv1_handle_timeout */
1400         /* For legacy compatibility with DTLS calls. */
1401         return ossl_quic_handle_events(s) == 1 ? 1 : -1;
1402 
1403         /* Mask ctrls we shouldn't support for QUIC. */
1404     case SSL_CTRL_GET_READ_AHEAD:
1405     case SSL_CTRL_SET_READ_AHEAD:
1406     case SSL_CTRL_SET_MAX_SEND_FRAGMENT:
1407     case SSL_CTRL_SET_SPLIT_SEND_FRAGMENT:
1408     case SSL_CTRL_SET_MAX_PIPELINES:
1409         return 0;
1410 
1411     default:
1412         /*
1413          * Probably a TLS related ctrl. Send back to the frontend SSL_ctrl
1414          * implementation. Either SSL_ctrl will handle it itself by direct
1415          * access into handshake layer state, or failing that, it will be passed
1416          * to the handshake layer via the SSL_METHOD vtable. If the ctrl is not
1417          * supported by anything, the handshake layer's ctrl method will finally
1418          * return 0.
1419          */
1420         return ossl_ctrl_internal(&ctx.qc->ssl, cmd, larg, parg, /*no_quic=*/1);
1421     }
1422 }
1423 
1424 /* SSL_set_connect_state */
ossl_quic_set_connect_state(SSL * s)1425 void ossl_quic_set_connect_state(SSL *s)
1426 {
1427     QCTX ctx;
1428 
1429     if (!expect_quic(s, &ctx))
1430         return;
1431 
1432     /* Cannot be changed after handshake started */
1433     if (ctx.qc->started || ctx.is_stream)
1434         return;
1435 
1436     ctx.qc->as_server_state = 0;
1437 }
1438 
1439 /* SSL_set_accept_state */
ossl_quic_set_accept_state(SSL * s)1440 void ossl_quic_set_accept_state(SSL *s)
1441 {
1442     QCTX ctx;
1443 
1444     if (!expect_quic(s, &ctx))
1445         return;
1446 
1447     /* Cannot be changed after handshake started */
1448     if (ctx.qc->started || ctx.is_stream)
1449         return;
1450 
1451     ctx.qc->as_server_state = 1;
1452 }
1453 
1454 /* SSL_do_handshake */
1455 struct quic_handshake_wait_args {
1456     QUIC_CONNECTION     *qc;
1457 };
1458 
tls_wants_non_io_retry(QUIC_CONNECTION * qc)1459 static int tls_wants_non_io_retry(QUIC_CONNECTION *qc)
1460 {
1461     int want = SSL_want(qc->tls);
1462 
1463     if (want == SSL_X509_LOOKUP
1464             || want == SSL_CLIENT_HELLO_CB
1465             || want == SSL_RETRY_VERIFY)
1466         return 1;
1467 
1468     return 0;
1469 }
1470 
quic_handshake_wait(void * arg)1471 static int quic_handshake_wait(void *arg)
1472 {
1473     struct quic_handshake_wait_args *args = arg;
1474 
1475     if (!quic_mutation_allowed(args->qc, /*req_active=*/1))
1476         return -1;
1477 
1478     if (ossl_quic_channel_is_handshake_complete(args->qc->ch))
1479         return 1;
1480 
1481     if (tls_wants_non_io_retry(args->qc))
1482         return 1;
1483 
1484     return 0;
1485 }
1486 
configure_channel(QUIC_CONNECTION * qc)1487 static int configure_channel(QUIC_CONNECTION *qc)
1488 {
1489     assert(qc->ch != NULL);
1490 
1491     if (!ossl_quic_port_set_net_rbio(qc->port, qc->net_rbio)
1492         || !ossl_quic_port_set_net_wbio(qc->port, qc->net_wbio)
1493         || !ossl_quic_channel_set_peer_addr(qc->ch, &qc->init_peer_addr))
1494         return 0;
1495 
1496     return 1;
1497 }
1498 
1499 QUIC_NEEDS_LOCK
create_channel(QUIC_CONNECTION * qc)1500 static int create_channel(QUIC_CONNECTION *qc)
1501 {
1502     QUIC_ENGINE_ARGS engine_args = {0};
1503     QUIC_PORT_ARGS port_args = {0};
1504 
1505     engine_args.libctx        = qc->ssl.ctx->libctx;
1506     engine_args.propq         = qc->ssl.ctx->propq;
1507     engine_args.mutex         = qc->mutex;
1508     engine_args.now_cb        = get_time_cb;
1509     engine_args.now_cb_arg    = qc;
1510     qc->engine = ossl_quic_engine_new(&engine_args);
1511     if (qc->engine == NULL) {
1512         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
1513         return 0;
1514     }
1515 
1516     port_args.channel_ctx = qc->ssl.ctx;
1517     qc->port = ossl_quic_engine_create_port(qc->engine, &port_args);
1518     if (qc->port == NULL) {
1519         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
1520         ossl_quic_engine_free(qc->engine);
1521         return 0;
1522     }
1523 
1524     qc->ch = ossl_quic_port_create_outgoing(qc->port, qc->tls);
1525     if (qc->ch == NULL) {
1526         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
1527         ossl_quic_port_free(qc->port);
1528         ossl_quic_engine_free(qc->engine);
1529         return 0;
1530     }
1531 
1532     return 1;
1533 }
1534 
1535 /*
1536  * Configures a channel with the information we have accumulated via calls made
1537  * to us from the application prior to starting a handshake attempt.
1538  */
1539 QUIC_NEEDS_LOCK
ensure_channel_started(QCTX * ctx)1540 static int ensure_channel_started(QCTX *ctx)
1541 {
1542     QUIC_CONNECTION *qc = ctx->qc;
1543 
1544     if (!qc->started) {
1545         if (!configure_channel(qc)) {
1546             QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR,
1547                                         "failed to configure channel");
1548             return 0;
1549         }
1550 
1551         if (!ossl_quic_channel_start(qc->ch)) {
1552             ossl_quic_channel_restore_err_state(qc->ch);
1553             QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR,
1554                                         "failed to start channel");
1555             return 0;
1556         }
1557 
1558 #if !defined(OPENSSL_NO_QUIC_THREAD_ASSIST)
1559         if (qc->is_thread_assisted)
1560             if (!ossl_quic_thread_assist_init_start(&qc->thread_assist, qc->ch,
1561                                                     qc->override_now_cb,
1562                                                     qc->override_now_cb_arg)) {
1563                 QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR,
1564                                             "failed to start assist thread");
1565                 return 0;
1566             }
1567 #endif
1568     }
1569 
1570     qc->started = 1;
1571     return 1;
1572 }
1573 
1574 QUIC_NEEDS_LOCK
quic_do_handshake(QCTX * ctx)1575 static int quic_do_handshake(QCTX *ctx)
1576 {
1577     int ret;
1578     QUIC_CONNECTION *qc = ctx->qc;
1579 
1580     if (ossl_quic_channel_is_handshake_complete(qc->ch))
1581         /* Handshake already completed. */
1582         return 1;
1583 
1584     if (!quic_mutation_allowed(qc, /*req_active=*/0))
1585         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
1586 
1587     if (qc->as_server != qc->as_server_state) {
1588         QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_PASSED_INVALID_ARGUMENT, NULL);
1589         return -1; /* Non-protocol error */
1590     }
1591 
1592     if (qc->net_rbio == NULL || qc->net_wbio == NULL) {
1593         /* Need read and write BIOs. */
1594         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_BIO_NOT_SET, NULL);
1595         return -1; /* Non-protocol error */
1596     }
1597 
1598     /*
1599      * We need to determine our addressing mode. There are basically two
1600      * ways we can use L4 addresses:
1601      *
1602      *   - Addressed mode, in which our BIO_sendmmsg calls have destination
1603      *     addresses attached to them which we expect the underlying network BIO
1604      *     to handle;
1605      *
1606      *   - Unaddressed mode, in which the BIO provided to us on the
1607      *     network side neither provides us with L4 addresses nor is capable of
1608      *     honouring ones we provide. We don't know where the QUIC traffic we
1609      *     send ends up exactly and trust the application to know what it is
1610      *     doing.
1611      *
1612      * Addressed mode is preferred because it enables support for connection
1613      * migration, multipath, etc. in the future. Addressed mode is automatically
1614      * enabled if we are using e.g. BIO_s_datagram, with or without
1615      * BIO_s_connect.
1616      *
1617      * If we are passed a BIO_s_dgram_pair (or some custom BIO) we may have to
1618      * use unaddressed mode unless that BIO supports capability flags indicating
1619      * it can provide and honour L4 addresses.
1620      *
1621      * Our strategy for determining address mode is simple: we probe the
1622      * underlying network BIOs for their capabilities. If the network BIOs
1623      * support what we need, we use addressed mode. Otherwise, we use
1624      * unaddressed mode.
1625      *
1626      * If addressed mode is chosen, we require an initial peer address to be
1627      * set. If this is not set, we fail. If unaddressed mode is used, we do not
1628      * require this, as such an address is superfluous, though it can be set if
1629      * desired.
1630      */
1631     if (!qc->started && !qc->addressing_probe_done) {
1632         long rcaps = BIO_dgram_get_effective_caps(qc->net_rbio);
1633         long wcaps = BIO_dgram_get_effective_caps(qc->net_wbio);
1634 
1635         qc->addressed_mode_r = ((rcaps & BIO_DGRAM_CAP_PROVIDES_SRC_ADDR) != 0);
1636         qc->addressed_mode_w = ((wcaps & BIO_DGRAM_CAP_HANDLES_DST_ADDR) != 0);
1637         qc->addressing_probe_done = 1;
1638     }
1639 
1640     if (!qc->started && qc->addressed_mode_w
1641         && BIO_ADDR_family(&qc->init_peer_addr) == AF_UNSPEC) {
1642         /*
1643          * We are trying to connect and are using addressed mode, which means we
1644          * need an initial peer address; if we do not have a peer address yet,
1645          * we should try to autodetect one.
1646          *
1647          * We do this as late as possible because some BIOs (e.g. BIO_s_connect)
1648          * may not be able to provide us with a peer address until they have
1649          * finished their own processing. They may not be able to perform this
1650          * processing until an application has finished configuring that BIO
1651          * (e.g. with setter calls), which might happen after SSL_set_bio is
1652          * called.
1653          */
1654         if (!csm_analyse_init_peer_addr(qc->net_wbio, &qc->init_peer_addr))
1655             /* best effort */
1656             BIO_ADDR_clear(&qc->init_peer_addr);
1657         else
1658             ossl_quic_channel_set_peer_addr(qc->ch, &qc->init_peer_addr);
1659     }
1660 
1661     if (!qc->started
1662         && qc->addressed_mode_w
1663         && BIO_ADDR_family(&qc->init_peer_addr) == AF_UNSPEC) {
1664         /*
1665          * If we still don't have a peer address in addressed mode, we can't do
1666          * anything.
1667          */
1668         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_REMOTE_PEER_ADDRESS_NOT_SET, NULL);
1669         return -1; /* Non-protocol error */
1670     }
1671 
1672     /*
1673      * Start connection process. Note we may come here multiple times in
1674      * non-blocking mode, which is fine.
1675      */
1676     if (!ensure_channel_started(ctx)) /* raises on failure */
1677         return -1; /* Non-protocol error */
1678 
1679     if (ossl_quic_channel_is_handshake_complete(qc->ch))
1680         /* The handshake is now done. */
1681         return 1;
1682 
1683     if (!qc_blocking_mode(qc)) {
1684         /* Try to advance the reactor. */
1685         qctx_maybe_autotick(ctx);
1686 
1687         if (ossl_quic_channel_is_handshake_complete(qc->ch))
1688             /* The handshake is now done. */
1689             return 1;
1690 
1691         if (ossl_quic_channel_is_term_any(qc->ch)) {
1692             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
1693             return 0;
1694         } else if (qc->desires_blocking) {
1695             /*
1696              * As a special case when doing a handshake when blocking mode is
1697              * desired yet not available, see if the network BIOs have become
1698              * poll descriptor-enabled. This supports BIOs such as BIO_s_connect
1699              * which do late creation of socket FDs and therefore cannot expose
1700              * a poll descriptor until after a network BIO is set on the QCSO.
1701              */
1702             assert(!qc->blocking);
1703             qc_update_can_support_blocking(qc);
1704             qc_update_blocking_mode(qc);
1705         }
1706     }
1707 
1708     /*
1709      * We are either in blocking mode or just entered it due to the code above.
1710      */
1711     if (qc_blocking_mode(qc)) {
1712         /* In blocking mode, wait for the handshake to complete. */
1713         struct quic_handshake_wait_args args;
1714 
1715         args.qc     = qc;
1716 
1717         ret = block_until_pred(qc, quic_handshake_wait, &args, 0);
1718         if (!quic_mutation_allowed(qc, /*req_active=*/1)) {
1719             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
1720             return 0; /* Shutdown before completion */
1721         } else if (ret <= 0) {
1722             QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
1723             return -1; /* Non-protocol error */
1724         }
1725 
1726         if (tls_wants_non_io_retry(qc)) {
1727             QUIC_RAISE_NORMAL_ERROR(ctx, SSL_get_error(qc->tls, 0));
1728             return -1;
1729         }
1730 
1731         assert(ossl_quic_channel_is_handshake_complete(qc->ch));
1732         return 1;
1733     }
1734 
1735     if (tls_wants_non_io_retry(qc)) {
1736         QUIC_RAISE_NORMAL_ERROR(ctx, SSL_get_error(qc->tls, 0));
1737         return -1;
1738     }
1739 
1740     /*
1741      * Otherwise, indicate that the handshake isn't done yet.
1742      * We can only get here in non-blocking mode.
1743      */
1744     QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_READ);
1745     return -1; /* Non-protocol error */
1746 }
1747 
1748 QUIC_TAKES_LOCK
ossl_quic_do_handshake(SSL * s)1749 int ossl_quic_do_handshake(SSL *s)
1750 {
1751     int ret;
1752     QCTX ctx;
1753 
1754     if (!expect_quic(s, &ctx))
1755         return 0;
1756 
1757     quic_lock_for_io(&ctx);
1758 
1759     ret = quic_do_handshake(&ctx);
1760     quic_unlock(ctx.qc);
1761     return ret;
1762 }
1763 
1764 /* SSL_connect */
ossl_quic_connect(SSL * s)1765 int ossl_quic_connect(SSL *s)
1766 {
1767     /* Ensure we are in connect state (no-op if non-idle). */
1768     ossl_quic_set_connect_state(s);
1769 
1770     /* Begin or continue the handshake */
1771     return ossl_quic_do_handshake(s);
1772 }
1773 
1774 /* SSL_accept */
ossl_quic_accept(SSL * s)1775 int ossl_quic_accept(SSL *s)
1776 {
1777     /* Ensure we are in accept state (no-op if non-idle). */
1778     ossl_quic_set_accept_state(s);
1779 
1780     /* Begin or continue the handshake */
1781     return ossl_quic_do_handshake(s);
1782 }
1783 
1784 /*
1785  * QUIC Front-End I/O API: Stream Lifecycle Operations
1786  * ===================================================
1787  *
1788  *         SSL_stream_new       => ossl_quic_conn_stream_new
1789  *
1790  */
1791 
1792 /*
1793  * Try to create the default XSO if it doesn't already exist. Returns 1 if the
1794  * default XSO was created. Returns 0 if it was not (e.g. because it already
1795  * exists). Note that this is NOT an error condition.
1796  */
1797 QUIC_NEEDS_LOCK
qc_try_create_default_xso_for_write(QCTX * ctx)1798 static int qc_try_create_default_xso_for_write(QCTX *ctx)
1799 {
1800     uint64_t flags = 0;
1801     QUIC_CONNECTION *qc = ctx->qc;
1802 
1803     if (qc->default_xso_created
1804         || qc->default_stream_mode == SSL_DEFAULT_STREAM_MODE_NONE)
1805         /*
1806          * We only do this once. If the user detaches a previously created
1807          * default XSO we don't auto-create another one.
1808          */
1809         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_NO_STREAM, NULL);
1810 
1811     /* Create a locally-initiated stream. */
1812     if (qc->default_stream_mode == SSL_DEFAULT_STREAM_MODE_AUTO_UNI)
1813         flags |= SSL_STREAM_FLAG_UNI;
1814 
1815     qc_set_default_xso(qc, (QUIC_XSO *)quic_conn_stream_new(ctx, flags,
1816                                                             /*needs_lock=*/0),
1817                        /*touch=*/0);
1818     if (qc->default_xso == NULL)
1819         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
1820 
1821     qc_touch_default_xso(qc);
1822     return 1;
1823 }
1824 
1825 struct quic_wait_for_stream_args {
1826     QUIC_CONNECTION *qc;
1827     QUIC_STREAM     *qs;
1828     QCTX            *ctx;
1829     uint64_t        expect_id;
1830 };
1831 
1832 QUIC_NEEDS_LOCK
quic_wait_for_stream(void * arg)1833 static int quic_wait_for_stream(void *arg)
1834 {
1835     struct quic_wait_for_stream_args *args = arg;
1836 
1837     if (!quic_mutation_allowed(args->qc, /*req_active=*/1)) {
1838         /* If connection is torn down due to an error while blocking, stop. */
1839         QUIC_RAISE_NON_NORMAL_ERROR(args->ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
1840         return -1;
1841     }
1842 
1843     args->qs = ossl_quic_stream_map_get_by_id(ossl_quic_channel_get_qsm(args->qc->ch),
1844                                               args->expect_id | QUIC_STREAM_DIR_BIDI);
1845     if (args->qs == NULL)
1846         args->qs = ossl_quic_stream_map_get_by_id(ossl_quic_channel_get_qsm(args->qc->ch),
1847                                                   args->expect_id | QUIC_STREAM_DIR_UNI);
1848 
1849     if (args->qs != NULL)
1850         return 1; /* stream now exists */
1851 
1852     return 0; /* did not get a stream, keep trying */
1853 }
1854 
1855 QUIC_NEEDS_LOCK
qc_wait_for_default_xso_for_read(QCTX * ctx,int peek)1856 static int qc_wait_for_default_xso_for_read(QCTX *ctx, int peek)
1857 {
1858     /* Called on a QCSO and we don't currently have a default stream. */
1859     uint64_t expect_id;
1860     QUIC_CONNECTION *qc = ctx->qc;
1861     QUIC_STREAM *qs;
1862     int res;
1863     struct quic_wait_for_stream_args wargs;
1864     OSSL_RTT_INFO rtt_info;
1865 
1866     /*
1867      * If default stream functionality is disabled or we already detached
1868      * one, don't make another default stream and just fail.
1869      */
1870     if (qc->default_xso_created
1871         || qc->default_stream_mode == SSL_DEFAULT_STREAM_MODE_NONE)
1872         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_NO_STREAM, NULL);
1873 
1874     /*
1875      * The peer may have opened a stream since we last ticked. So tick and
1876      * see if the stream with ordinal 0 (remote, bidi/uni based on stream
1877      * mode) exists yet. QUIC stream IDs must be allocated in order, so the
1878      * first stream created by a peer must have an ordinal of 0.
1879      */
1880     expect_id = qc->as_server
1881         ? QUIC_STREAM_INITIATOR_CLIENT
1882         : QUIC_STREAM_INITIATOR_SERVER;
1883 
1884     qs = ossl_quic_stream_map_get_by_id(ossl_quic_channel_get_qsm(qc->ch),
1885                                         expect_id | QUIC_STREAM_DIR_BIDI);
1886     if (qs == NULL)
1887         qs = ossl_quic_stream_map_get_by_id(ossl_quic_channel_get_qsm(qc->ch),
1888                                             expect_id | QUIC_STREAM_DIR_UNI);
1889 
1890     if (qs == NULL) {
1891         qctx_maybe_autotick(ctx);
1892 
1893         qs = ossl_quic_stream_map_get_by_id(ossl_quic_channel_get_qsm(qc->ch),
1894                                             expect_id);
1895     }
1896 
1897     if (qs == NULL) {
1898         if (peek)
1899             return 0;
1900 
1901         if (!qc_blocking_mode(qc))
1902             /* Non-blocking mode, so just bail immediately. */
1903             return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_READ);
1904 
1905         /* Block until we have a stream. */
1906         wargs.qc        = qc;
1907         wargs.qs        = NULL;
1908         wargs.ctx       = ctx;
1909         wargs.expect_id = expect_id;
1910 
1911         res = block_until_pred(qc, quic_wait_for_stream, &wargs, 0);
1912         if (res == 0)
1913             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
1914         else if (res < 0 || wargs.qs == NULL)
1915             /* quic_wait_for_stream raised error here */
1916             return 0;
1917 
1918         qs = wargs.qs;
1919     }
1920 
1921     /*
1922      * We now have qs != NULL. Remove it from the incoming stream queue so that
1923      * it isn't also returned by any future SSL_accept_stream calls.
1924      */
1925     ossl_statm_get_rtt_info(ossl_quic_channel_get_statm(qc->ch), &rtt_info);
1926     ossl_quic_stream_map_remove_from_accept_queue(ossl_quic_channel_get_qsm(qc->ch),
1927                                                   qs, rtt_info.smoothed_rtt);
1928 
1929     /*
1930      * Now make qs the default stream, creating the necessary XSO.
1931      */
1932     qc_set_default_xso(qc, create_xso_from_stream(qc, qs), /*touch=*/0);
1933     if (qc->default_xso == NULL)
1934         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
1935 
1936     qc_touch_default_xso(qc); /* inhibits default XSO */
1937     return 1;
1938 }
1939 
1940 QUIC_NEEDS_LOCK
create_xso_from_stream(QUIC_CONNECTION * qc,QUIC_STREAM * qs)1941 static QUIC_XSO *create_xso_from_stream(QUIC_CONNECTION *qc, QUIC_STREAM *qs)
1942 {
1943     QUIC_XSO *xso = NULL;
1944 
1945     if ((xso = OPENSSL_zalloc(sizeof(*xso))) == NULL) {
1946         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_CRYPTO_LIB, NULL);
1947         goto err;
1948     }
1949 
1950     if (!ossl_ssl_init(&xso->ssl, qc->ssl.ctx, qc->ssl.method, SSL_TYPE_QUIC_XSO)) {
1951         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
1952         goto err;
1953     }
1954 
1955     /* XSO refs QC */
1956     if (!SSL_up_ref(&qc->ssl)) {
1957         QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_SSL_LIB, NULL);
1958         goto err;
1959     }
1960 
1961     xso->conn       = qc;
1962     xso->ssl_mode   = qc->default_ssl_mode;
1963     xso->ssl_options
1964         = qc->default_ssl_options & OSSL_QUIC_PERMITTED_OPTIONS_STREAM;
1965     xso->last_error = SSL_ERROR_NONE;
1966 
1967     xso->stream     = qs;
1968 
1969     ++qc->num_xso;
1970     xso_update_options(xso);
1971     return xso;
1972 
1973 err:
1974     OPENSSL_free(xso);
1975     return NULL;
1976 }
1977 
1978 struct quic_new_stream_wait_args {
1979     QUIC_CONNECTION *qc;
1980     int is_uni;
1981 };
1982 
quic_new_stream_wait(void * arg)1983 static int quic_new_stream_wait(void *arg)
1984 {
1985     struct quic_new_stream_wait_args *args = arg;
1986     QUIC_CONNECTION *qc = args->qc;
1987 
1988     if (!quic_mutation_allowed(qc, /*req_active=*/1))
1989         return -1;
1990 
1991     if (ossl_quic_channel_is_new_local_stream_admissible(qc->ch, args->is_uni))
1992         return 1;
1993 
1994     return 0;
1995 }
1996 
1997 /* locking depends on need_lock */
quic_conn_stream_new(QCTX * ctx,uint64_t flags,int need_lock)1998 static SSL *quic_conn_stream_new(QCTX *ctx, uint64_t flags, int need_lock)
1999 {
2000     int ret;
2001     QUIC_CONNECTION *qc = ctx->qc;
2002     QUIC_XSO *xso = NULL;
2003     QUIC_STREAM *qs = NULL;
2004     int is_uni = ((flags & SSL_STREAM_FLAG_UNI) != 0);
2005     int no_blocking = ((flags & SSL_STREAM_FLAG_NO_BLOCK) != 0);
2006     int advance = ((flags & SSL_STREAM_FLAG_ADVANCE) != 0);
2007 
2008     if (need_lock)
2009         quic_lock(qc);
2010 
2011     if (!quic_mutation_allowed(qc, /*req_active=*/0)) {
2012         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2013         goto err;
2014     }
2015 
2016     if (!advance
2017         && !ossl_quic_channel_is_new_local_stream_admissible(qc->ch, is_uni)) {
2018         struct quic_new_stream_wait_args args;
2019 
2020         /*
2021          * Stream count flow control currently doesn't permit this stream to be
2022          * opened.
2023          */
2024         if (no_blocking || !qc_blocking_mode(qc)) {
2025             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_STREAM_COUNT_LIMITED, NULL);
2026             goto err;
2027         }
2028 
2029         args.qc     = qc;
2030         args.is_uni = is_uni;
2031 
2032         /* Blocking mode - wait until we can get a stream. */
2033         ret = block_until_pred(ctx->qc, quic_new_stream_wait, &args, 0);
2034         if (!quic_mutation_allowed(qc, /*req_active=*/1)) {
2035             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2036             goto err; /* Shutdown before completion */
2037         } else if (ret <= 0) {
2038             QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2039             goto err; /* Non-protocol error */
2040         }
2041     }
2042 
2043     qs = ossl_quic_channel_new_stream_local(qc->ch, is_uni);
2044     if (qs == NULL) {
2045         QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2046         goto err;
2047     }
2048 
2049     xso = create_xso_from_stream(qc, qs);
2050     if (xso == NULL)
2051         goto err;
2052 
2053     qc_touch_default_xso(qc); /* inhibits default XSO */
2054     if (need_lock)
2055         quic_unlock(qc);
2056 
2057     return &xso->ssl;
2058 
2059 err:
2060     OPENSSL_free(xso);
2061     ossl_quic_stream_map_release(ossl_quic_channel_get_qsm(qc->ch), qs);
2062     if (need_lock)
2063         quic_unlock(qc);
2064 
2065     return NULL;
2066 
2067 }
2068 
2069 QUIC_TAKES_LOCK
ossl_quic_conn_stream_new(SSL * s,uint64_t flags)2070 SSL *ossl_quic_conn_stream_new(SSL *s, uint64_t flags)
2071 {
2072     QCTX ctx;
2073 
2074     if (!expect_quic_conn_only(s, &ctx))
2075         return NULL;
2076 
2077     return quic_conn_stream_new(&ctx, flags, /*need_lock=*/1);
2078 }
2079 
2080 /*
2081  * QUIC Front-End I/O API: Steady-State Operations
2082  * ===============================================
2083  *
2084  * Here we dispatch calls to the steady-state front-end I/O API functions; that
2085  * is, the functions used during the established phase of a QUIC connection
2086  * (e.g. SSL_read, SSL_write).
2087  *
2088  * Each function must handle both blocking and non-blocking modes. As discussed
2089  * above, all QUIC I/O is implemented using non-blocking mode internally.
2090  *
2091  *         SSL_get_error        => partially implemented by ossl_quic_get_error
2092  *         SSL_want             => ossl_quic_want
2093  *   (BIO/)SSL_read             => ossl_quic_read
2094  *   (BIO/)SSL_write            => ossl_quic_write
2095  *         SSL_pending          => ossl_quic_pending
2096  *         SSL_stream_conclude  => ossl_quic_conn_stream_conclude
2097  *         SSL_key_update       => ossl_quic_key_update
2098  */
2099 
2100 /* SSL_get_error */
ossl_quic_get_error(const SSL * s,int i)2101 int ossl_quic_get_error(const SSL *s, int i)
2102 {
2103     QCTX ctx;
2104     int net_error, last_error;
2105 
2106     if (!expect_quic(s, &ctx))
2107         return 0;
2108 
2109     quic_lock(ctx.qc);
2110     net_error = ossl_quic_channel_net_error(ctx.qc->ch);
2111     last_error = ctx.is_stream ? ctx.xso->last_error : ctx.qc->last_error;
2112     quic_unlock(ctx.qc);
2113 
2114     if (net_error)
2115         return SSL_ERROR_SYSCALL;
2116 
2117     return last_error;
2118 }
2119 
2120 /* Converts a code returned by SSL_get_error to a code returned by SSL_want. */
error_to_want(int error)2121 static int error_to_want(int error)
2122 {
2123     switch (error) {
2124     case SSL_ERROR_WANT_CONNECT: /* never used - UDP is connectionless */
2125     case SSL_ERROR_WANT_ACCEPT:  /* never used - UDP is connectionless */
2126     case SSL_ERROR_ZERO_RETURN:
2127     default:
2128         return SSL_NOTHING;
2129 
2130     case SSL_ERROR_WANT_READ:
2131         return SSL_READING;
2132 
2133     case SSL_ERROR_WANT_WRITE:
2134         return SSL_WRITING;
2135 
2136     case SSL_ERROR_WANT_RETRY_VERIFY:
2137         return SSL_RETRY_VERIFY;
2138 
2139     case SSL_ERROR_WANT_CLIENT_HELLO_CB:
2140         return SSL_CLIENT_HELLO_CB;
2141 
2142     case SSL_ERROR_WANT_X509_LOOKUP:
2143         return SSL_X509_LOOKUP;
2144     }
2145 }
2146 
2147 /* SSL_want */
ossl_quic_want(const SSL * s)2148 int ossl_quic_want(const SSL *s)
2149 {
2150     QCTX ctx;
2151     int w;
2152 
2153     if (!expect_quic(s, &ctx))
2154         return SSL_NOTHING;
2155 
2156     quic_lock(ctx.qc);
2157 
2158     w = error_to_want(ctx.is_stream ? ctx.xso->last_error : ctx.qc->last_error);
2159 
2160     quic_unlock(ctx.qc);
2161     return w;
2162 }
2163 
2164 /*
2165  * SSL_write
2166  * ---------
2167  *
2168  * The set of functions below provide the implementation of the public SSL_write
2169  * function. We must handle:
2170  *
2171  *   - both blocking and non-blocking operation at the application level,
2172  *     depending on how we are configured;
2173  *
2174  *   - SSL_MODE_ENABLE_PARTIAL_WRITE being on or off;
2175  *
2176  *   - SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER.
2177  *
2178  */
2179 QUIC_NEEDS_LOCK
quic_post_write(QUIC_XSO * xso,int did_append,int did_append_all,uint64_t flags,int do_tick)2180 static void quic_post_write(QUIC_XSO *xso, int did_append,
2181                             int did_append_all, uint64_t flags,
2182                             int do_tick)
2183 {
2184     /*
2185      * We have appended at least one byte to the stream.
2186      * Potentially mark stream as active, depending on FC.
2187      */
2188     if (did_append)
2189         ossl_quic_stream_map_update_state(ossl_quic_channel_get_qsm(xso->conn->ch),
2190                                           xso->stream);
2191 
2192     if (did_append_all && (flags & SSL_WRITE_FLAG_CONCLUDE) != 0)
2193         ossl_quic_sstream_fin(xso->stream->sstream);
2194 
2195     /*
2196      * Try and send.
2197      *
2198      * TODO(QUIC FUTURE): It is probably inefficient to try and do this
2199      * immediately, plus we should eventually consider Nagle's algorithm.
2200      */
2201     if (do_tick)
2202         ossl_quic_reactor_tick(ossl_quic_channel_get_reactor(xso->conn->ch), 0);
2203 }
2204 
2205 struct quic_write_again_args {
2206     QUIC_XSO            *xso;
2207     const unsigned char *buf;
2208     size_t              len;
2209     size_t              total_written;
2210     int                 err;
2211     uint64_t            flags;
2212 };
2213 
2214 /*
2215  * Absolute maximum write buffer size, enforced to prevent a rogue peer from
2216  * deliberately inducing DoS. This has been chosen based on the optimal buffer
2217  * size for an RTT of 500ms and a bandwidth of 100 Mb/s.
2218  */
2219 #define MAX_WRITE_BUF_SIZE      (6 * 1024 * 1024)
2220 
2221 /*
2222  * Ensure spare buffer space available (up until a limit, at least).
2223  */
2224 QUIC_NEEDS_LOCK
sstream_ensure_spare(QUIC_SSTREAM * sstream,uint64_t spare)2225 static int sstream_ensure_spare(QUIC_SSTREAM *sstream, uint64_t spare)
2226 {
2227     size_t cur_sz = ossl_quic_sstream_get_buffer_size(sstream);
2228     size_t avail = ossl_quic_sstream_get_buffer_avail(sstream);
2229     size_t spare_ = (spare > SIZE_MAX) ? SIZE_MAX : (size_t)spare;
2230     size_t new_sz, growth;
2231 
2232     if (spare_ <= avail || cur_sz == MAX_WRITE_BUF_SIZE)
2233         return 1;
2234 
2235     growth = spare_ - avail;
2236     if (cur_sz + growth > MAX_WRITE_BUF_SIZE)
2237         new_sz = MAX_WRITE_BUF_SIZE;
2238     else
2239         new_sz = cur_sz + growth;
2240 
2241     return ossl_quic_sstream_set_buffer_size(sstream, new_sz);
2242 }
2243 
2244 /*
2245  * Append to a QUIC_STREAM's QUIC_SSTREAM, ensuring buffer space is expanded
2246  * as needed according to flow control.
2247  */
2248 QUIC_NEEDS_LOCK
xso_sstream_append(QUIC_XSO * xso,const unsigned char * buf,size_t len,size_t * actual_written)2249 static int xso_sstream_append(QUIC_XSO *xso, const unsigned char *buf,
2250                               size_t len, size_t *actual_written)
2251 {
2252     QUIC_SSTREAM *sstream = xso->stream->sstream;
2253     uint64_t cur = ossl_quic_sstream_get_cur_size(sstream);
2254     uint64_t cwm = ossl_quic_txfc_get_cwm(&xso->stream->txfc);
2255     uint64_t permitted = (cwm >= cur ? cwm - cur : 0);
2256 
2257     if (len > permitted)
2258         len = (size_t)permitted;
2259 
2260     if (!sstream_ensure_spare(sstream, len))
2261         return 0;
2262 
2263     return ossl_quic_sstream_append(sstream, buf, len, actual_written);
2264 }
2265 
2266 QUIC_NEEDS_LOCK
quic_write_again(void * arg)2267 static int quic_write_again(void *arg)
2268 {
2269     struct quic_write_again_args *args = arg;
2270     size_t actual_written = 0;
2271 
2272     if (!quic_mutation_allowed(args->xso->conn, /*req_active=*/1))
2273         /* If connection is torn down due to an error while blocking, stop. */
2274         return -2;
2275 
2276     if (!quic_validate_for_write(args->xso, &args->err))
2277         /*
2278          * Stream may have become invalid for write due to connection events
2279          * while we blocked.
2280          */
2281         return -2;
2282 
2283     args->err = ERR_R_INTERNAL_ERROR;
2284     if (!xso_sstream_append(args->xso, args->buf, args->len, &actual_written))
2285         return -2;
2286 
2287     quic_post_write(args->xso, actual_written > 0,
2288                     args->len == actual_written, args->flags, 0);
2289 
2290     args->buf           += actual_written;
2291     args->len           -= actual_written;
2292     args->total_written += actual_written;
2293 
2294     if (args->len == 0)
2295         /* Written everything, done. */
2296         return 1;
2297 
2298     /* Not written everything yet, keep trying. */
2299     return 0;
2300 }
2301 
2302 QUIC_NEEDS_LOCK
quic_write_blocking(QCTX * ctx,const void * buf,size_t len,uint64_t flags,size_t * written)2303 static int quic_write_blocking(QCTX *ctx, const void *buf, size_t len,
2304                                uint64_t flags, size_t *written)
2305 {
2306     int res;
2307     QUIC_XSO *xso = ctx->xso;
2308     struct quic_write_again_args args;
2309     size_t actual_written = 0;
2310 
2311     /* First make a best effort to append as much of the data as possible. */
2312     if (!xso_sstream_append(xso, buf, len, &actual_written)) {
2313         /* Stream already finished or allocation error. */
2314         *written = 0;
2315         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2316     }
2317 
2318     quic_post_write(xso, actual_written > 0, actual_written == len, flags, 1);
2319 
2320     /*
2321      * Record however much data we wrote
2322      */
2323     *written = actual_written;
2324 
2325     if (actual_written == len) {
2326         /* Managed to append everything on the first try. */
2327         return 1;
2328     }
2329 
2330     /*
2331      * We did not manage to append all of the data immediately, so the stream
2332      * buffer has probably filled up. This means we need to block until some of
2333      * it is freed up.
2334      */
2335     args.xso            = xso;
2336     args.buf            = (const unsigned char *)buf + actual_written;
2337     args.len            = len - actual_written;
2338     args.total_written  = 0;
2339     args.err            = ERR_R_INTERNAL_ERROR;
2340     args.flags          = flags;
2341 
2342     res = block_until_pred(xso->conn, quic_write_again, &args, 0);
2343     if (res <= 0) {
2344         if (!quic_mutation_allowed(xso->conn, /*req_active=*/1))
2345             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2346         else
2347             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, args.err, NULL);
2348     }
2349 
2350     /*
2351      * When waiting on extra buffer space to be available, args.total_written
2352      * holds the amount of remaining data we requested to write, which will be
2353      * something less than the len parameter passed in, however much we wrote
2354      * here, add it to the value that we wrote when we initially called
2355      * xso_sstream_append
2356      */
2357     *written += args.total_written;
2358     return 1;
2359 }
2360 
2361 /*
2362  * Functions to manage All-or-Nothing (AON) (that is, non-ENABLE_PARTIAL_WRITE)
2363  * write semantics.
2364  */
aon_write_begin(QUIC_XSO * xso,const unsigned char * buf,size_t buf_len,size_t already_sent)2365 static void aon_write_begin(QUIC_XSO *xso, const unsigned char *buf,
2366                             size_t buf_len, size_t already_sent)
2367 {
2368     assert(!xso->aon_write_in_progress);
2369 
2370     xso->aon_write_in_progress = 1;
2371     xso->aon_buf_base          = buf;
2372     xso->aon_buf_pos           = already_sent;
2373     xso->aon_buf_len           = buf_len;
2374 }
2375 
aon_write_finish(QUIC_XSO * xso)2376 static void aon_write_finish(QUIC_XSO *xso)
2377 {
2378     xso->aon_write_in_progress   = 0;
2379     xso->aon_buf_base            = NULL;
2380     xso->aon_buf_pos             = 0;
2381     xso->aon_buf_len             = 0;
2382 }
2383 
2384 QUIC_NEEDS_LOCK
quic_write_nonblocking_aon(QCTX * ctx,const void * buf,size_t len,uint64_t flags,size_t * written)2385 static int quic_write_nonblocking_aon(QCTX *ctx, const void *buf,
2386                                       size_t len, uint64_t flags,
2387                                       size_t *written)
2388 {
2389     QUIC_XSO *xso = ctx->xso;
2390     const void *actual_buf;
2391     size_t actual_len, actual_written = 0;
2392     int accept_moving_buffer
2393         = ((xso->ssl_mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER) != 0);
2394 
2395     if (xso->aon_write_in_progress) {
2396         /*
2397          * We are in the middle of an AON write (i.e., a previous write did not
2398          * manage to append all data to the SSTREAM and we have Enable Partial
2399          * Write (EPW) mode disabled.)
2400          */
2401         if ((!accept_moving_buffer && xso->aon_buf_base != buf)
2402             || len != xso->aon_buf_len)
2403             /*
2404              * Pointer must not have changed if we are not in accept moving
2405              * buffer mode. Length must never change.
2406              */
2407             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_BAD_WRITE_RETRY, NULL);
2408 
2409         actual_buf = (unsigned char *)buf + xso->aon_buf_pos;
2410         actual_len = len - xso->aon_buf_pos;
2411         assert(actual_len > 0);
2412     } else {
2413         actual_buf = buf;
2414         actual_len = len;
2415     }
2416 
2417     /* First make a best effort to append as much of the data as possible. */
2418     if (!xso_sstream_append(xso, actual_buf, actual_len, &actual_written)) {
2419         /* Stream already finished or allocation error. */
2420         *written = 0;
2421         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2422     }
2423 
2424     quic_post_write(xso, actual_written > 0, actual_written == actual_len,
2425                     flags, qctx_should_autotick(ctx));
2426 
2427     if (actual_written == actual_len) {
2428         /* We have sent everything. */
2429         if (xso->aon_write_in_progress) {
2430             /*
2431              * We have sent everything, and we were in the middle of an AON
2432              * write. The output write length is the total length of the AON
2433              * buffer, not however many bytes we managed to write to the stream
2434              * in this call.
2435              */
2436             *written = xso->aon_buf_len;
2437             aon_write_finish(xso);
2438         } else {
2439             *written = actual_written;
2440         }
2441 
2442         return 1;
2443     }
2444 
2445     if (xso->aon_write_in_progress) {
2446         /*
2447          * AON write is in progress but we have not written everything yet. We
2448          * may have managed to send zero bytes, or some number of bytes less
2449          * than the total remaining which need to be appended during this
2450          * AON operation.
2451          */
2452         xso->aon_buf_pos += actual_written;
2453         assert(xso->aon_buf_pos < xso->aon_buf_len);
2454         return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_WRITE);
2455     }
2456 
2457     /*
2458      * Not in an existing AON operation but partial write is not enabled, so we
2459      * need to begin a new AON operation. However we needn't bother if we didn't
2460      * actually append anything.
2461      */
2462     if (actual_written > 0)
2463         aon_write_begin(xso, buf, len, actual_written);
2464 
2465     /*
2466      * AON - We do not publicly admit to having appended anything until AON
2467      * completes.
2468      */
2469     *written = 0;
2470     return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_WRITE);
2471 }
2472 
2473 QUIC_NEEDS_LOCK
quic_write_nonblocking_epw(QCTX * ctx,const void * buf,size_t len,uint64_t flags,size_t * written)2474 static int quic_write_nonblocking_epw(QCTX *ctx, const void *buf, size_t len,
2475                                       uint64_t flags, size_t *written)
2476 {
2477     QUIC_XSO *xso = ctx->xso;
2478 
2479     /* Simple best effort operation. */
2480     if (!xso_sstream_append(xso, buf, len, written)) {
2481         /* Stream already finished or allocation error. */
2482         *written = 0;
2483         return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2484     }
2485 
2486     quic_post_write(xso, *written > 0, *written == len, flags,
2487                     qctx_should_autotick(ctx));
2488 
2489     if (*written == 0)
2490         /* SSL_write_ex returns 0 if it didn't read anything. */
2491         return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_WANT_READ);
2492 
2493     return 1;
2494 }
2495 
2496 QUIC_NEEDS_LOCK
quic_validate_for_write(QUIC_XSO * xso,int * err)2497 static int quic_validate_for_write(QUIC_XSO *xso, int *err)
2498 {
2499     QUIC_STREAM_MAP *qsm;
2500 
2501     if (xso == NULL || xso->stream == NULL) {
2502         *err = ERR_R_INTERNAL_ERROR;
2503         return 0;
2504     }
2505 
2506     switch (xso->stream->send_state) {
2507     default:
2508     case QUIC_SSTREAM_STATE_NONE:
2509         *err = SSL_R_STREAM_RECV_ONLY;
2510         return 0;
2511 
2512     case QUIC_SSTREAM_STATE_READY:
2513         qsm = ossl_quic_channel_get_qsm(xso->conn->ch);
2514 
2515         if (!ossl_quic_stream_map_ensure_send_part_id(qsm, xso->stream)) {
2516             *err = ERR_R_INTERNAL_ERROR;
2517             return 0;
2518         }
2519 
2520         /* FALLTHROUGH */
2521     case QUIC_SSTREAM_STATE_SEND:
2522     case QUIC_SSTREAM_STATE_DATA_SENT:
2523         if (ossl_quic_sstream_get_final_size(xso->stream->sstream, NULL)) {
2524             *err = SSL_R_STREAM_FINISHED;
2525             return 0;
2526         }
2527         return 1;
2528 
2529     case QUIC_SSTREAM_STATE_DATA_RECVD:
2530         *err = SSL_R_STREAM_FINISHED;
2531         return 0;
2532 
2533     case QUIC_SSTREAM_STATE_RESET_SENT:
2534     case QUIC_SSTREAM_STATE_RESET_RECVD:
2535         *err = SSL_R_STREAM_RESET;
2536         return 0;
2537     }
2538 }
2539 
2540 QUIC_TAKES_LOCK
ossl_quic_write_flags(SSL * s,const void * buf,size_t len,uint64_t flags,size_t * written)2541 int ossl_quic_write_flags(SSL *s, const void *buf, size_t len,
2542                           uint64_t flags, size_t *written)
2543 {
2544     int ret;
2545     QCTX ctx;
2546     int partial_write, err;
2547 
2548     *written = 0;
2549 
2550     if (len == 0) {
2551         /* Do not autocreate default XSO for zero-length writes. */
2552         if (!expect_quic(s, &ctx))
2553             return 0;
2554 
2555         quic_lock_for_io(&ctx);
2556     } else {
2557         if (!expect_quic_with_stream_lock(s, /*remote_init=*/0, /*io=*/1, &ctx))
2558             return 0;
2559     }
2560 
2561     partial_write = ((ctx.xso != NULL)
2562         ? ((ctx.xso->ssl_mode & SSL_MODE_ENABLE_PARTIAL_WRITE) != 0) : 0);
2563 
2564     if ((flags & ~SSL_WRITE_FLAG_CONCLUDE) != 0) {
2565         ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_UNSUPPORTED_WRITE_FLAG, NULL);
2566         goto out;
2567     }
2568 
2569     if (!quic_mutation_allowed(ctx.qc, /*req_active=*/0)) {
2570         ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2571         goto out;
2572     }
2573 
2574     /*
2575      * If we haven't finished the handshake, try to advance it.
2576      * We don't accept writes until the handshake is completed.
2577      */
2578     if (quic_do_handshake(&ctx) < 1) {
2579         ret = 0;
2580         goto out;
2581     }
2582 
2583     /* Ensure correct stream state, stream send part not concluded, etc. */
2584     if (len > 0 && !quic_validate_for_write(ctx.xso, &err)) {
2585         ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, err, NULL);
2586         goto out;
2587     }
2588 
2589     if (len == 0) {
2590         if ((flags & SSL_WRITE_FLAG_CONCLUDE) != 0)
2591             quic_post_write(ctx.xso, 0, 1, flags,
2592                             qctx_should_autotick(&ctx));
2593 
2594         ret = 1;
2595         goto out;
2596     }
2597 
2598     if (xso_blocking_mode(ctx.xso))
2599         ret = quic_write_blocking(&ctx, buf, len, flags, written);
2600     else if (partial_write)
2601         ret = quic_write_nonblocking_epw(&ctx, buf, len, flags, written);
2602     else
2603         ret = quic_write_nonblocking_aon(&ctx, buf, len, flags, written);
2604 
2605 out:
2606     quic_unlock(ctx.qc);
2607     return ret;
2608 }
2609 
2610 QUIC_TAKES_LOCK
ossl_quic_write(SSL * s,const void * buf,size_t len,size_t * written)2611 int ossl_quic_write(SSL *s, const void *buf, size_t len, size_t *written)
2612 {
2613     return ossl_quic_write_flags(s, buf, len, 0, written);
2614 }
2615 
2616 /*
2617  * SSL_read
2618  * --------
2619  */
2620 struct quic_read_again_args {
2621     QCTX            *ctx;
2622     QUIC_STREAM     *stream;
2623     void            *buf;
2624     size_t          len;
2625     size_t          *bytes_read;
2626     int             peek;
2627 };
2628 
2629 QUIC_NEEDS_LOCK
quic_validate_for_read(QUIC_XSO * xso,int * err,int * eos)2630 static int quic_validate_for_read(QUIC_XSO *xso, int *err, int *eos)
2631 {
2632     QUIC_STREAM_MAP *qsm;
2633 
2634     *eos = 0;
2635 
2636     if (xso == NULL || xso->stream == NULL) {
2637         *err = ERR_R_INTERNAL_ERROR;
2638         return 0;
2639     }
2640 
2641     switch (xso->stream->recv_state) {
2642     default:
2643     case QUIC_RSTREAM_STATE_NONE:
2644         *err = SSL_R_STREAM_SEND_ONLY;
2645         return 0;
2646 
2647     case QUIC_RSTREAM_STATE_RECV:
2648     case QUIC_RSTREAM_STATE_SIZE_KNOWN:
2649     case QUIC_RSTREAM_STATE_DATA_RECVD:
2650         return 1;
2651 
2652     case QUIC_RSTREAM_STATE_DATA_READ:
2653         *eos = 1;
2654         return 0;
2655 
2656     case QUIC_RSTREAM_STATE_RESET_RECVD:
2657         qsm = ossl_quic_channel_get_qsm(xso->conn->ch);
2658         ossl_quic_stream_map_notify_app_read_reset_recv_part(qsm, xso->stream);
2659 
2660         /* FALLTHROUGH */
2661     case QUIC_RSTREAM_STATE_RESET_READ:
2662         *err = SSL_R_STREAM_RESET;
2663         return 0;
2664     }
2665 }
2666 
2667 QUIC_NEEDS_LOCK
quic_read_actual(QCTX * ctx,QUIC_STREAM * stream,void * buf,size_t buf_len,size_t * bytes_read,int peek)2668 static int quic_read_actual(QCTX *ctx,
2669                             QUIC_STREAM *stream,
2670                             void *buf, size_t buf_len,
2671                             size_t *bytes_read,
2672                             int peek)
2673 {
2674     int is_fin = 0, err, eos;
2675     QUIC_CONNECTION *qc = ctx->qc;
2676 
2677     if (!quic_validate_for_read(ctx->xso, &err, &eos)) {
2678         if (eos) {
2679             ctx->xso->retired_fin = 1;
2680             return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_ZERO_RETURN);
2681         } else {
2682             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, err, NULL);
2683         }
2684     }
2685 
2686     if (peek) {
2687         if (!ossl_quic_rstream_peek(stream->rstream, buf, buf_len,
2688                                     bytes_read, &is_fin))
2689             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2690 
2691     } else {
2692         if (!ossl_quic_rstream_read(stream->rstream, buf, buf_len,
2693                                     bytes_read, &is_fin))
2694             return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2695     }
2696 
2697     if (!peek) {
2698         if (*bytes_read > 0) {
2699             /*
2700              * We have read at least one byte from the stream. Inform stream-level
2701              * RXFC of the retirement of controlled bytes. Update the active stream
2702              * status (the RXFC may now want to emit a frame granting more credit to
2703              * the peer).
2704              */
2705             OSSL_RTT_INFO rtt_info;
2706 
2707             ossl_statm_get_rtt_info(ossl_quic_channel_get_statm(qc->ch), &rtt_info);
2708 
2709             if (!ossl_quic_rxfc_on_retire(&stream->rxfc, *bytes_read,
2710                                           rtt_info.smoothed_rtt))
2711                 return QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_INTERNAL_ERROR, NULL);
2712         }
2713 
2714         if (is_fin && !peek) {
2715             QUIC_STREAM_MAP *qsm = ossl_quic_channel_get_qsm(ctx->qc->ch);
2716 
2717             ossl_quic_stream_map_notify_totally_read(qsm, ctx->xso->stream);
2718         }
2719 
2720         if (*bytes_read > 0)
2721             ossl_quic_stream_map_update_state(ossl_quic_channel_get_qsm(qc->ch),
2722                                               stream);
2723     }
2724 
2725     if (*bytes_read == 0 && is_fin) {
2726         ctx->xso->retired_fin = 1;
2727         return QUIC_RAISE_NORMAL_ERROR(ctx, SSL_ERROR_ZERO_RETURN);
2728     }
2729 
2730     return 1;
2731 }
2732 
2733 QUIC_NEEDS_LOCK
quic_read_again(void * arg)2734 static int quic_read_again(void *arg)
2735 {
2736     struct quic_read_again_args *args = arg;
2737 
2738     if (!quic_mutation_allowed(args->ctx->qc, /*req_active=*/1)) {
2739         /* If connection is torn down due to an error while blocking, stop. */
2740         QUIC_RAISE_NON_NORMAL_ERROR(args->ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2741         return -1;
2742     }
2743 
2744     if (!quic_read_actual(args->ctx, args->stream,
2745                           args->buf, args->len, args->bytes_read,
2746                           args->peek))
2747         return -1;
2748 
2749     if (*args->bytes_read > 0)
2750         /* got at least one byte, the SSL_read op can finish now */
2751         return 1;
2752 
2753     return 0; /* did not read anything, keep trying */
2754 }
2755 
2756 QUIC_TAKES_LOCK
quic_read(SSL * s,void * buf,size_t len,size_t * bytes_read,int peek)2757 static int quic_read(SSL *s, void *buf, size_t len, size_t *bytes_read, int peek)
2758 {
2759     int ret, res;
2760     QCTX ctx;
2761     struct quic_read_again_args args;
2762 
2763     *bytes_read = 0;
2764 
2765     if (!expect_quic(s, &ctx))
2766         return 0;
2767 
2768     quic_lock_for_io(&ctx);
2769 
2770     if (!quic_mutation_allowed(ctx.qc, /*req_active=*/0)) {
2771         ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2772         goto out;
2773     }
2774 
2775     /* If we haven't finished the handshake, try to advance it. */
2776     if (quic_do_handshake(&ctx) < 1) {
2777         ret = 0; /* ossl_quic_do_handshake raised error here */
2778         goto out;
2779     }
2780 
2781     if (ctx.xso == NULL) {
2782         /*
2783          * Called on a QCSO and we don't currently have a default stream.
2784          *
2785          * Wait until we get a stream initiated by the peer (blocking mode) or
2786          * fail if we don't have one yet (non-blocking mode).
2787          */
2788         if (!qc_wait_for_default_xso_for_read(&ctx, /*peek=*/0)) {
2789             ret = 0; /* error already raised here */
2790             goto out;
2791         }
2792 
2793         ctx.xso = ctx.qc->default_xso;
2794     }
2795 
2796     if (!quic_read_actual(&ctx, ctx.xso->stream, buf, len, bytes_read, peek)) {
2797         ret = 0; /* quic_read_actual raised error here */
2798         goto out;
2799     }
2800 
2801     if (*bytes_read > 0) {
2802         /*
2803          * Even though we succeeded, tick the reactor here to ensure we are
2804          * handling other aspects of the QUIC connection.
2805          */
2806         qctx_maybe_autotick(&ctx);
2807         ret = 1;
2808     } else if (xso_blocking_mode(ctx.xso)) {
2809         /*
2810          * We were not able to read anything immediately, so our stream
2811          * buffer is empty. This means we need to block until we get
2812          * at least one byte.
2813          */
2814         args.ctx        = &ctx;
2815         args.stream     = ctx.xso->stream;
2816         args.buf        = buf;
2817         args.len        = len;
2818         args.bytes_read = bytes_read;
2819         args.peek       = peek;
2820 
2821         res = block_until_pred(ctx.qc, quic_read_again, &args, 0);
2822         if (res == 0) {
2823             ret = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_INTERNAL_ERROR, NULL);
2824             goto out;
2825         } else if (res < 0) {
2826             ret = 0; /* quic_read_again raised error here */
2827             goto out;
2828         }
2829 
2830         ret = 1;
2831     } else {
2832         /*
2833          * We did not get any bytes and are not in blocking mode.
2834          * Tick to see if this delivers any more.
2835          */
2836         qctx_maybe_autotick(&ctx);
2837 
2838         /* Try the read again. */
2839         if (!quic_read_actual(&ctx, ctx.xso->stream, buf, len, bytes_read, peek)) {
2840             ret = 0; /* quic_read_actual raised error here */
2841             goto out;
2842         }
2843 
2844         if (*bytes_read > 0)
2845             ret = 1; /* Succeeded this time. */
2846         else
2847             ret = QUIC_RAISE_NORMAL_ERROR(&ctx, SSL_ERROR_WANT_READ);
2848     }
2849 
2850 out:
2851     quic_unlock(ctx.qc);
2852     return ret;
2853 }
2854 
ossl_quic_read(SSL * s,void * buf,size_t len,size_t * bytes_read)2855 int ossl_quic_read(SSL *s, void *buf, size_t len, size_t *bytes_read)
2856 {
2857     return quic_read(s, buf, len, bytes_read, 0);
2858 }
2859 
ossl_quic_peek(SSL * s,void * buf,size_t len,size_t * bytes_read)2860 int ossl_quic_peek(SSL *s, void *buf, size_t len, size_t *bytes_read)
2861 {
2862     return quic_read(s, buf, len, bytes_read, 1);
2863 }
2864 
2865 /*
2866  * SSL_pending
2867  * -----------
2868  */
2869 
2870 QUIC_TAKES_LOCK
ossl_quic_pending_int(const SSL * s,int check_channel)2871 static size_t ossl_quic_pending_int(const SSL *s, int check_channel)
2872 {
2873     QCTX ctx;
2874     size_t avail = 0;
2875 
2876     if (!expect_quic(s, &ctx))
2877         return 0;
2878 
2879     quic_lock(ctx.qc);
2880 
2881     if (!ctx.qc->started)
2882         goto out;
2883 
2884     if (ctx.xso == NULL) {
2885         /* No XSO yet, but there might be a default XSO eligible to be created. */
2886         if (qc_wait_for_default_xso_for_read(&ctx, /*peek=*/1)) {
2887             ctx.xso = ctx.qc->default_xso;
2888         } else {
2889             QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_NO_STREAM, NULL);
2890             goto out;
2891         }
2892     }
2893 
2894     if (ctx.xso->stream == NULL) {
2895         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_INTERNAL_ERROR, NULL);
2896         goto out;
2897     }
2898 
2899     if (check_channel)
2900         avail = ossl_quic_stream_recv_pending(ctx.xso->stream,
2901                                               /*include_fin=*/1)
2902              || ossl_quic_channel_has_pending(ctx.qc->ch)
2903              || ossl_quic_channel_is_term_any(ctx.qc->ch);
2904     else
2905         avail = ossl_quic_stream_recv_pending(ctx.xso->stream,
2906                                               /*include_fin=*/0);
2907 
2908 out:
2909     quic_unlock(ctx.qc);
2910     return avail;
2911 }
2912 
ossl_quic_pending(const SSL * s)2913 size_t ossl_quic_pending(const SSL *s)
2914 {
2915     return ossl_quic_pending_int(s, /*check_channel=*/0);
2916 }
2917 
ossl_quic_has_pending(const SSL * s)2918 int ossl_quic_has_pending(const SSL *s)
2919 {
2920     /* Do we have app-side pending data or pending URXEs or RXEs? */
2921     return ossl_quic_pending_int(s, /*check_channel=*/1) > 0;
2922 }
2923 
2924 /*
2925  * SSL_stream_conclude
2926  * -------------------
2927  */
2928 QUIC_TAKES_LOCK
ossl_quic_conn_stream_conclude(SSL * s)2929 int ossl_quic_conn_stream_conclude(SSL *s)
2930 {
2931     QCTX ctx;
2932     QUIC_STREAM *qs;
2933     int err;
2934 
2935     if (!expect_quic_with_stream_lock(s, /*remote_init=*/0, /*io=*/0, &ctx))
2936         return 0;
2937 
2938     qs = ctx.xso->stream;
2939 
2940     if (!quic_mutation_allowed(ctx.qc, /*req_active=*/1)) {
2941         quic_unlock(ctx.qc);
2942         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
2943     }
2944 
2945     if (!quic_validate_for_write(ctx.xso, &err)) {
2946         quic_unlock(ctx.qc);
2947         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, err, NULL);
2948     }
2949 
2950     if (ossl_quic_sstream_get_final_size(qs->sstream, NULL)) {
2951         quic_unlock(ctx.qc);
2952         return 1;
2953     }
2954 
2955     ossl_quic_sstream_fin(qs->sstream);
2956     quic_post_write(ctx.xso, 1, 0, 0, qctx_should_autotick(&ctx));
2957     quic_unlock(ctx.qc);
2958     return 1;
2959 }
2960 
2961 /*
2962  * SSL_inject_net_dgram
2963  * --------------------
2964  */
2965 QUIC_TAKES_LOCK
SSL_inject_net_dgram(SSL * s,const unsigned char * buf,size_t buf_len,const BIO_ADDR * peer,const BIO_ADDR * local)2966 int SSL_inject_net_dgram(SSL *s, const unsigned char *buf,
2967                          size_t buf_len,
2968                          const BIO_ADDR *peer,
2969                          const BIO_ADDR *local)
2970 {
2971     int ret;
2972     QCTX ctx;
2973     QUIC_DEMUX *demux;
2974 
2975     if (!expect_quic(s, &ctx))
2976         return 0;
2977 
2978     quic_lock(ctx.qc);
2979 
2980     demux = ossl_quic_channel_get0_demux(ctx.qc->ch);
2981     ret = ossl_quic_demux_inject(demux, buf, buf_len, peer, local);
2982 
2983     quic_unlock(ctx.qc);
2984     return ret;
2985 }
2986 
2987 /*
2988  * SSL_get0_connection
2989  * -------------------
2990  */
ossl_quic_get0_connection(SSL * s)2991 SSL *ossl_quic_get0_connection(SSL *s)
2992 {
2993     QCTX ctx;
2994 
2995     if (!expect_quic(s, &ctx))
2996         return NULL;
2997 
2998     return &ctx.qc->ssl;
2999 }
3000 
3001 /*
3002  * SSL_get_stream_type
3003  * -------------------
3004  */
ossl_quic_get_stream_type(SSL * s)3005 int ossl_quic_get_stream_type(SSL *s)
3006 {
3007     QCTX ctx;
3008 
3009     if (!expect_quic(s, &ctx))
3010         return SSL_STREAM_TYPE_BIDI;
3011 
3012     if (ctx.xso == NULL) {
3013         /*
3014          * If deferred XSO creation has yet to occur, proceed according to the
3015          * default stream mode. If AUTO_BIDI or AUTO_UNI is set, we cannot know
3016          * what kind of stream will be created yet, so return BIDI on the basis
3017          * that at this time, the client still has the option of calling
3018          * SSL_read() or SSL_write() first.
3019          */
3020         if (ctx.qc->default_xso_created
3021             || ctx.qc->default_stream_mode == SSL_DEFAULT_STREAM_MODE_NONE)
3022             return SSL_STREAM_TYPE_NONE;
3023         else
3024             return SSL_STREAM_TYPE_BIDI;
3025     }
3026 
3027     if (ossl_quic_stream_is_bidi(ctx.xso->stream))
3028         return SSL_STREAM_TYPE_BIDI;
3029 
3030     if (ossl_quic_stream_is_server_init(ctx.xso->stream) != ctx.qc->as_server)
3031         return SSL_STREAM_TYPE_READ;
3032     else
3033         return SSL_STREAM_TYPE_WRITE;
3034 }
3035 
3036 /*
3037  * SSL_get_stream_id
3038  * -----------------
3039  */
3040 QUIC_TAKES_LOCK
ossl_quic_get_stream_id(SSL * s)3041 uint64_t ossl_quic_get_stream_id(SSL *s)
3042 {
3043     QCTX ctx;
3044     uint64_t id;
3045 
3046     if (!expect_quic_with_stream_lock(s, /*remote_init=*/-1, /*io=*/0, &ctx))
3047         return UINT64_MAX;
3048 
3049     id = ctx.xso->stream->id;
3050     quic_unlock(ctx.qc);
3051 
3052     return id;
3053 }
3054 
3055 /*
3056  * SSL_is_stream_local
3057  * -------------------
3058  */
3059 QUIC_TAKES_LOCK
ossl_quic_is_stream_local(SSL * s)3060 int ossl_quic_is_stream_local(SSL *s)
3061 {
3062     QCTX ctx;
3063     int is_local;
3064 
3065     if (!expect_quic_with_stream_lock(s, /*remote_init=*/-1, /*io=*/0, &ctx))
3066         return -1;
3067 
3068     is_local = ossl_quic_stream_is_local_init(ctx.xso->stream);
3069     quic_unlock(ctx.qc);
3070 
3071     return is_local;
3072 }
3073 
3074 /*
3075  * SSL_set_default_stream_mode
3076  * ---------------------------
3077  */
3078 QUIC_TAKES_LOCK
ossl_quic_set_default_stream_mode(SSL * s,uint32_t mode)3079 int ossl_quic_set_default_stream_mode(SSL *s, uint32_t mode)
3080 {
3081     QCTX ctx;
3082 
3083     if (!expect_quic_conn_only(s, &ctx))
3084         return 0;
3085 
3086     quic_lock(ctx.qc);
3087 
3088     if (ctx.qc->default_xso_created) {
3089         quic_unlock(ctx.qc);
3090         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED,
3091                                        "too late to change default stream mode");
3092     }
3093 
3094     switch (mode) {
3095     case SSL_DEFAULT_STREAM_MODE_NONE:
3096     case SSL_DEFAULT_STREAM_MODE_AUTO_BIDI:
3097     case SSL_DEFAULT_STREAM_MODE_AUTO_UNI:
3098         ctx.qc->default_stream_mode = mode;
3099         break;
3100     default:
3101         quic_unlock(ctx.qc);
3102         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_INVALID_ARGUMENT,
3103                                        "bad default stream type");
3104     }
3105 
3106     quic_unlock(ctx.qc);
3107     return 1;
3108 }
3109 
3110 /*
3111  * SSL_detach_stream
3112  * -----------------
3113  */
3114 QUIC_TAKES_LOCK
ossl_quic_detach_stream(SSL * s)3115 SSL *ossl_quic_detach_stream(SSL *s)
3116 {
3117     QCTX ctx;
3118     QUIC_XSO *xso = NULL;
3119 
3120     if (!expect_quic_conn_only(s, &ctx))
3121         return NULL;
3122 
3123     quic_lock(ctx.qc);
3124 
3125     /* Calling this function inhibits default XSO autocreation. */
3126     /* QC ref to any default XSO is transferred to us and to caller. */
3127     qc_set_default_xso_keep_ref(ctx.qc, NULL, /*touch=*/1, &xso);
3128 
3129     quic_unlock(ctx.qc);
3130 
3131     return xso != NULL ? &xso->ssl : NULL;
3132 }
3133 
3134 /*
3135  * SSL_attach_stream
3136  * -----------------
3137  */
3138 QUIC_TAKES_LOCK
ossl_quic_attach_stream(SSL * conn,SSL * stream)3139 int ossl_quic_attach_stream(SSL *conn, SSL *stream)
3140 {
3141     QCTX ctx;
3142     QUIC_XSO *xso;
3143     int nref;
3144 
3145     if (!expect_quic_conn_only(conn, &ctx))
3146         return 0;
3147 
3148     if (stream == NULL || stream->type != SSL_TYPE_QUIC_XSO)
3149         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_NULL_PARAMETER,
3150                                        "stream to attach must be a valid QUIC stream");
3151 
3152     xso = (QUIC_XSO *)stream;
3153 
3154     quic_lock(ctx.qc);
3155 
3156     if (ctx.qc->default_xso != NULL) {
3157         quic_unlock(ctx.qc);
3158         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED,
3159                                        "connection already has a default stream");
3160     }
3161 
3162     /*
3163      * It is a caller error for the XSO being attached as a default XSO to have
3164      * more than one ref.
3165      */
3166     if (!CRYPTO_GET_REF(&xso->ssl.references, &nref)) {
3167         quic_unlock(ctx.qc);
3168         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_INTERNAL_ERROR,
3169                                        "ref");
3170     }
3171 
3172     if (nref != 1) {
3173         quic_unlock(ctx.qc);
3174         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_INVALID_ARGUMENT,
3175                                        "stream being attached must have "
3176                                        "only 1 reference");
3177     }
3178 
3179     /* Caller's reference to the XSO is transferred to us. */
3180     /* Calling this function inhibits default XSO autocreation. */
3181     qc_set_default_xso(ctx.qc, xso, /*touch=*/1);
3182 
3183     quic_unlock(ctx.qc);
3184     return 1;
3185 }
3186 
3187 /*
3188  * SSL_set_incoming_stream_policy
3189  * ------------------------------
3190  */
3191 QUIC_NEEDS_LOCK
qc_get_effective_incoming_stream_policy(QUIC_CONNECTION * qc)3192 static int qc_get_effective_incoming_stream_policy(QUIC_CONNECTION *qc)
3193 {
3194     switch (qc->incoming_stream_policy) {
3195         case SSL_INCOMING_STREAM_POLICY_AUTO:
3196             if ((qc->default_xso == NULL && !qc->default_xso_created)
3197                 || qc->default_stream_mode == SSL_DEFAULT_STREAM_MODE_NONE)
3198                 return SSL_INCOMING_STREAM_POLICY_ACCEPT;
3199             else
3200                 return SSL_INCOMING_STREAM_POLICY_REJECT;
3201 
3202         default:
3203             return qc->incoming_stream_policy;
3204     }
3205 }
3206 
3207 QUIC_NEEDS_LOCK
qc_update_reject_policy(QUIC_CONNECTION * qc)3208 static void qc_update_reject_policy(QUIC_CONNECTION *qc)
3209 {
3210     int policy = qc_get_effective_incoming_stream_policy(qc);
3211     int enable_reject = (policy == SSL_INCOMING_STREAM_POLICY_REJECT);
3212 
3213     ossl_quic_channel_set_incoming_stream_auto_reject(qc->ch,
3214                                                       enable_reject,
3215                                                       qc->incoming_stream_aec);
3216 }
3217 
3218 QUIC_TAKES_LOCK
ossl_quic_set_incoming_stream_policy(SSL * s,int policy,uint64_t aec)3219 int ossl_quic_set_incoming_stream_policy(SSL *s, int policy,
3220                                          uint64_t aec)
3221 {
3222     int ret = 1;
3223     QCTX ctx;
3224 
3225     if (!expect_quic_conn_only(s, &ctx))
3226         return 0;
3227 
3228     quic_lock(ctx.qc);
3229 
3230     switch (policy) {
3231     case SSL_INCOMING_STREAM_POLICY_AUTO:
3232     case SSL_INCOMING_STREAM_POLICY_ACCEPT:
3233     case SSL_INCOMING_STREAM_POLICY_REJECT:
3234         ctx.qc->incoming_stream_policy = policy;
3235         ctx.qc->incoming_stream_aec    = aec;
3236         break;
3237 
3238     default:
3239         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_INVALID_ARGUMENT, NULL);
3240         ret = 0;
3241         break;
3242     }
3243 
3244     qc_update_reject_policy(ctx.qc);
3245     quic_unlock(ctx.qc);
3246     return ret;
3247 }
3248 
3249 /*
3250  * SSL_get_value, SSL_set_value
3251  * ----------------------------
3252  */
3253 QUIC_TAKES_LOCK
qc_getset_idle_timeout(QCTX * ctx,uint32_t class_,uint64_t * p_value_out,uint64_t * p_value_in)3254 static int qc_getset_idle_timeout(QCTX *ctx, uint32_t class_,
3255                                   uint64_t *p_value_out, uint64_t *p_value_in)
3256 {
3257     int ret = 0;
3258     uint64_t value_out = 0, value_in;
3259 
3260     quic_lock(ctx->qc);
3261 
3262     switch (class_) {
3263     case SSL_VALUE_CLASS_FEATURE_REQUEST:
3264         value_out = ossl_quic_channel_get_max_idle_timeout_request(ctx->qc->ch);
3265 
3266         if (p_value_in != NULL) {
3267             value_in = *p_value_in;
3268             if (value_in > OSSL_QUIC_VLINT_MAX) {
3269                 QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_PASSED_INVALID_ARGUMENT,
3270                                             NULL);
3271                 goto err;
3272             }
3273 
3274             if (ossl_quic_channel_have_generated_transport_params(ctx->qc->ch)) {
3275                 QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_FEATURE_NOT_RENEGOTIABLE,
3276                                             NULL);
3277                 goto err;
3278             }
3279 
3280             ossl_quic_channel_set_max_idle_timeout_request(ctx->qc->ch, value_in);
3281         }
3282         break;
3283 
3284     case SSL_VALUE_CLASS_FEATURE_PEER_REQUEST:
3285     case SSL_VALUE_CLASS_FEATURE_NEGOTIATED:
3286         if (p_value_in != NULL) {
3287             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_UNSUPPORTED_CONFIG_VALUE_OP,
3288                                         NULL);
3289             goto err;
3290         }
3291 
3292         if (!ossl_quic_channel_is_handshake_complete(ctx->qc->ch)) {
3293             QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_FEATURE_NEGOTIATION_NOT_COMPLETE,
3294                                         NULL);
3295             goto err;
3296         }
3297 
3298         value_out = (class_ == SSL_VALUE_CLASS_FEATURE_NEGOTIATED)
3299             ? ossl_quic_channel_get_max_idle_timeout_actual(ctx->qc->ch)
3300             : ossl_quic_channel_get_max_idle_timeout_peer_request(ctx->qc->ch);
3301         break;
3302 
3303     default:
3304         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS,
3305                                     NULL);
3306         goto err;
3307     }
3308 
3309     ret = 1;
3310 err:
3311     quic_unlock(ctx->qc);
3312     if (ret && p_value_out != NULL)
3313         *p_value_out = value_out;
3314 
3315     return ret;
3316 }
3317 
3318 QUIC_TAKES_LOCK
qc_get_stream_avail(QCTX * ctx,uint32_t class_,int is_uni,int is_remote,uint64_t * value)3319 static int qc_get_stream_avail(QCTX *ctx, uint32_t class_,
3320                                int is_uni, int is_remote,
3321                                uint64_t *value)
3322 {
3323     int ret = 0;
3324 
3325     if (class_ != SSL_VALUE_CLASS_GENERIC) {
3326         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS,
3327                                     NULL);
3328         return 0;
3329     }
3330 
3331     quic_lock(ctx->qc);
3332 
3333     *value = is_remote
3334         ? ossl_quic_channel_get_remote_stream_count_avail(ctx->qc->ch, is_uni)
3335         : ossl_quic_channel_get_local_stream_count_avail(ctx->qc->ch, is_uni);
3336 
3337     ret = 1;
3338     quic_unlock(ctx->qc);
3339     return ret;
3340 }
3341 
3342 QUIC_NEEDS_LOCK
qctx_should_autotick(QCTX * ctx)3343 static int qctx_should_autotick(QCTX *ctx)
3344 {
3345     int event_handling_mode;
3346 
3347     if (ctx->is_stream) {
3348         event_handling_mode = ctx->xso->event_handling_mode;
3349         if (event_handling_mode != SSL_VALUE_EVENT_HANDLING_MODE_INHERIT)
3350             return event_handling_mode != SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT;
3351     }
3352 
3353     event_handling_mode = ctx->qc->event_handling_mode;
3354     return event_handling_mode != SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT;
3355 }
3356 
3357 QUIC_NEEDS_LOCK
qctx_maybe_autotick(QCTX * ctx)3358 static void qctx_maybe_autotick(QCTX *ctx)
3359 {
3360     if (!qctx_should_autotick(ctx))
3361         return;
3362 
3363     ossl_quic_reactor_tick(ossl_quic_channel_get_reactor(ctx->qc->ch), 0);
3364 }
3365 
3366 QUIC_TAKES_LOCK
qc_getset_event_handling(QCTX * ctx,uint32_t class_,uint64_t * p_value_out,uint64_t * p_value_in)3367 static int qc_getset_event_handling(QCTX *ctx, uint32_t class_,
3368                                     uint64_t *p_value_out,
3369                                     uint64_t *p_value_in)
3370 {
3371     int ret = 0;
3372     uint64_t value_out = 0;
3373 
3374     quic_lock(ctx->qc);
3375 
3376     if (class_ != SSL_VALUE_CLASS_GENERIC) {
3377         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS,
3378                                     NULL);
3379         goto err;
3380     }
3381 
3382     if (p_value_in != NULL) {
3383         switch (*p_value_in) {
3384         case SSL_VALUE_EVENT_HANDLING_MODE_INHERIT:
3385         case SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT:
3386         case SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT:
3387             break;
3388         default:
3389             QUIC_RAISE_NON_NORMAL_ERROR(ctx, ERR_R_PASSED_INVALID_ARGUMENT,
3390                                         NULL);
3391             goto err;
3392         }
3393 
3394         value_out = *p_value_in;
3395         if (ctx->is_stream)
3396             ctx->xso->event_handling_mode = (int)value_out;
3397         else
3398             ctx->qc->event_handling_mode = (int)value_out;
3399     } else {
3400         value_out = ctx->is_stream
3401             ? ctx->xso->event_handling_mode
3402             : ctx->qc->event_handling_mode;
3403     }
3404 
3405     ret = 1;
3406 err:
3407     quic_unlock(ctx->qc);
3408     if (ret && p_value_out != NULL)
3409         *p_value_out = value_out;
3410 
3411     return ret;
3412 }
3413 
3414 QUIC_TAKES_LOCK
qc_get_stream_write_buf_stat(QCTX * ctx,uint32_t class_,uint64_t * p_value_out,size_t (* getter)(QUIC_SSTREAM * sstream))3415 static int qc_get_stream_write_buf_stat(QCTX *ctx, uint32_t class_,
3416                                         uint64_t *p_value_out,
3417                                         size_t (*getter)(QUIC_SSTREAM *sstream))
3418 {
3419     int ret = 0;
3420     size_t value = 0;
3421 
3422     quic_lock(ctx->qc);
3423 
3424     if (class_ != SSL_VALUE_CLASS_GENERIC) {
3425         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS,
3426                                     NULL);
3427         goto err;
3428     }
3429 
3430     if (ctx->xso == NULL) {
3431         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_NO_STREAM, NULL);
3432         goto err;
3433     }
3434 
3435     if (!ossl_quic_stream_has_send(ctx->xso->stream)) {
3436         QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_STREAM_RECV_ONLY, NULL);
3437         goto err;
3438     }
3439 
3440     if (ossl_quic_stream_has_send_buffer(ctx->xso->stream))
3441         value = getter(ctx->xso->stream->sstream);
3442 
3443     ret = 1;
3444 err:
3445     quic_unlock(ctx->qc);
3446     *p_value_out = (uint64_t)value;
3447     return ret;
3448 }
3449 
3450 QUIC_NEEDS_LOCK
expect_quic_for_value(SSL * s,QCTX * ctx,uint32_t id)3451 static int expect_quic_for_value(SSL *s, QCTX *ctx, uint32_t id)
3452 {
3453     switch (id) {
3454     case SSL_VALUE_EVENT_HANDLING_MODE:
3455     case SSL_VALUE_STREAM_WRITE_BUF_SIZE:
3456     case SSL_VALUE_STREAM_WRITE_BUF_USED:
3457     case SSL_VALUE_STREAM_WRITE_BUF_AVAIL:
3458         return expect_quic(s, ctx);
3459     default:
3460         return expect_quic_conn_only(s, ctx);
3461     }
3462 }
3463 
3464 QUIC_TAKES_LOCK
ossl_quic_get_value_uint(SSL * s,uint32_t class_,uint32_t id,uint64_t * value)3465 int ossl_quic_get_value_uint(SSL *s, uint32_t class_, uint32_t id,
3466                              uint64_t *value)
3467 {
3468     QCTX ctx;
3469 
3470     if (!expect_quic_for_value(s, &ctx, id))
3471         return 0;
3472 
3473     if (value == NULL)
3474         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx,
3475                                            ERR_R_PASSED_INVALID_ARGUMENT, NULL);
3476 
3477     switch (id) {
3478     case SSL_VALUE_QUIC_IDLE_TIMEOUT:
3479         return qc_getset_idle_timeout(&ctx, class_, value, NULL);
3480 
3481     case SSL_VALUE_QUIC_STREAM_BIDI_LOCAL_AVAIL:
3482         return qc_get_stream_avail(&ctx, class_, /*uni=*/0, /*remote=*/0, value);
3483     case SSL_VALUE_QUIC_STREAM_BIDI_REMOTE_AVAIL:
3484         return qc_get_stream_avail(&ctx, class_, /*uni=*/0, /*remote=*/1, value);
3485     case SSL_VALUE_QUIC_STREAM_UNI_LOCAL_AVAIL:
3486         return qc_get_stream_avail(&ctx, class_, /*uni=*/1, /*remote=*/0, value);
3487     case SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL:
3488         return qc_get_stream_avail(&ctx, class_, /*uni=*/1, /*remote=*/1, value);
3489 
3490     case SSL_VALUE_EVENT_HANDLING_MODE:
3491         return qc_getset_event_handling(&ctx, class_, value, NULL);
3492 
3493     case SSL_VALUE_STREAM_WRITE_BUF_SIZE:
3494         return qc_get_stream_write_buf_stat(&ctx, class_, value,
3495                                             ossl_quic_sstream_get_buffer_size);
3496     case SSL_VALUE_STREAM_WRITE_BUF_USED:
3497         return qc_get_stream_write_buf_stat(&ctx, class_, value,
3498                                             ossl_quic_sstream_get_buffer_used);
3499     case SSL_VALUE_STREAM_WRITE_BUF_AVAIL:
3500         return qc_get_stream_write_buf_stat(&ctx, class_, value,
3501                                             ossl_quic_sstream_get_buffer_avail);
3502 
3503     default:
3504         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx,
3505                                            SSL_R_UNSUPPORTED_CONFIG_VALUE, NULL);
3506     }
3507 
3508     return 1;
3509 }
3510 
3511 QUIC_TAKES_LOCK
ossl_quic_set_value_uint(SSL * s,uint32_t class_,uint32_t id,uint64_t value)3512 int ossl_quic_set_value_uint(SSL *s, uint32_t class_, uint32_t id,
3513                              uint64_t value)
3514 {
3515     QCTX ctx;
3516 
3517     if (!expect_quic_for_value(s, &ctx, id))
3518         return 0;
3519 
3520     switch (id) {
3521     case SSL_VALUE_QUIC_IDLE_TIMEOUT:
3522         return qc_getset_idle_timeout(&ctx, class_, NULL, &value);
3523 
3524     case SSL_VALUE_EVENT_HANDLING_MODE:
3525         return qc_getset_event_handling(&ctx, class_, NULL, &value);
3526 
3527     default:
3528         return QUIC_RAISE_NON_NORMAL_ERROR(&ctx,
3529                                            SSL_R_UNSUPPORTED_CONFIG_VALUE, NULL);
3530     }
3531 
3532     return 1;
3533 }
3534 
3535 /*
3536  * SSL_accept_stream
3537  * -----------------
3538  */
3539 struct wait_for_incoming_stream_args {
3540     QCTX            *ctx;
3541     QUIC_STREAM     *qs;
3542 };
3543 
3544 QUIC_NEEDS_LOCK
wait_for_incoming_stream(void * arg)3545 static int wait_for_incoming_stream(void *arg)
3546 {
3547     struct wait_for_incoming_stream_args *args = arg;
3548     QUIC_CONNECTION *qc = args->ctx->qc;
3549     QUIC_STREAM_MAP *qsm = ossl_quic_channel_get_qsm(qc->ch);
3550 
3551     if (!quic_mutation_allowed(qc, /*req_active=*/1)) {
3552         /* If connection is torn down due to an error while blocking, stop. */
3553         QUIC_RAISE_NON_NORMAL_ERROR(args->ctx, SSL_R_PROTOCOL_IS_SHUTDOWN, NULL);
3554         return -1;
3555     }
3556 
3557     args->qs = ossl_quic_stream_map_peek_accept_queue(qsm);
3558     if (args->qs != NULL)
3559         return 1; /* got a stream */
3560 
3561     return 0; /* did not get a stream, keep trying */
3562 }
3563 
3564 QUIC_TAKES_LOCK
ossl_quic_accept_stream(SSL * s,uint64_t flags)3565 SSL *ossl_quic_accept_stream(SSL *s, uint64_t flags)
3566 {
3567     QCTX ctx;
3568     int ret;
3569     SSL *new_s = NULL;
3570     QUIC_STREAM_MAP *qsm;
3571     QUIC_STREAM *qs;
3572     QUIC_XSO *xso;
3573     OSSL_RTT_INFO rtt_info;
3574 
3575     if (!expect_quic_conn_only(s, &ctx))
3576         return NULL;
3577 
3578     quic_lock(ctx.qc);
3579 
3580     if (qc_get_effective_incoming_stream_policy(ctx.qc)
3581         == SSL_INCOMING_STREAM_POLICY_REJECT) {
3582         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED, NULL);
3583         goto out;
3584     }
3585 
3586     qsm = ossl_quic_channel_get_qsm(ctx.qc->ch);
3587 
3588     qs = ossl_quic_stream_map_peek_accept_queue(qsm);
3589     if (qs == NULL) {
3590         if (qc_blocking_mode(ctx.qc)
3591             && (flags & SSL_ACCEPT_STREAM_NO_BLOCK) == 0) {
3592             struct wait_for_incoming_stream_args args;
3593 
3594             args.ctx = &ctx;
3595             args.qs = NULL;
3596 
3597             ret = block_until_pred(ctx.qc, wait_for_incoming_stream, &args, 0);
3598             if (ret == 0) {
3599                 QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_INTERNAL_ERROR, NULL);
3600                 goto out;
3601             } else if (ret < 0 || args.qs == NULL) {
3602                 goto out;
3603             }
3604 
3605             qs = args.qs;
3606         } else {
3607             goto out;
3608         }
3609     }
3610 
3611     xso = create_xso_from_stream(ctx.qc, qs);
3612     if (xso == NULL)
3613         goto out;
3614 
3615     ossl_statm_get_rtt_info(ossl_quic_channel_get_statm(ctx.qc->ch), &rtt_info);
3616     ossl_quic_stream_map_remove_from_accept_queue(qsm, qs,
3617                                                   rtt_info.smoothed_rtt);
3618     new_s = &xso->ssl;
3619 
3620     /* Calling this function inhibits default XSO autocreation. */
3621     qc_touch_default_xso(ctx.qc); /* inhibits default XSO */
3622 
3623 out:
3624     quic_unlock(ctx.qc);
3625     return new_s;
3626 }
3627 
3628 /*
3629  * SSL_get_accept_stream_queue_len
3630  * -------------------------------
3631  */
3632 QUIC_TAKES_LOCK
ossl_quic_get_accept_stream_queue_len(SSL * s)3633 size_t ossl_quic_get_accept_stream_queue_len(SSL *s)
3634 {
3635     QCTX ctx;
3636     size_t v;
3637 
3638     if (!expect_quic_conn_only(s, &ctx))
3639         return 0;
3640 
3641     quic_lock(ctx.qc);
3642 
3643     v = ossl_quic_stream_map_get_total_accept_queue_len(ossl_quic_channel_get_qsm(ctx.qc->ch));
3644 
3645     quic_unlock(ctx.qc);
3646     return v;
3647 }
3648 
3649 /*
3650  * SSL_stream_reset
3651  * ----------------
3652  */
ossl_quic_stream_reset(SSL * ssl,const SSL_STREAM_RESET_ARGS * args,size_t args_len)3653 int ossl_quic_stream_reset(SSL *ssl,
3654                            const SSL_STREAM_RESET_ARGS *args,
3655                            size_t args_len)
3656 {
3657     QCTX ctx;
3658     QUIC_STREAM_MAP *qsm;
3659     QUIC_STREAM *qs;
3660     uint64_t error_code;
3661     int ok, err;
3662 
3663     if (!expect_quic_with_stream_lock(ssl, /*remote_init=*/0, /*io=*/0, &ctx))
3664         return 0;
3665 
3666     qsm         = ossl_quic_channel_get_qsm(ctx.qc->ch);
3667     qs          = ctx.xso->stream;
3668     error_code  = (args != NULL ? args->quic_error_code : 0);
3669 
3670     if (!quic_validate_for_write(ctx.xso, &err)) {
3671         ok = QUIC_RAISE_NON_NORMAL_ERROR(&ctx, err, NULL);
3672         goto err;
3673     }
3674 
3675     ok = ossl_quic_stream_map_reset_stream_send_part(qsm, qs, error_code);
3676     if (ok)
3677         ctx.xso->requested_reset = 1;
3678 
3679 err:
3680     quic_unlock(ctx.qc);
3681     return ok;
3682 }
3683 
3684 /*
3685  * SSL_get_stream_read_state
3686  * -------------------------
3687  */
quic_classify_stream(QUIC_CONNECTION * qc,QUIC_STREAM * qs,int is_write,int * state,uint64_t * app_error_code)3688 static void quic_classify_stream(QUIC_CONNECTION *qc,
3689                                  QUIC_STREAM *qs,
3690                                  int is_write,
3691                                  int *state,
3692                                  uint64_t *app_error_code)
3693 {
3694     int local_init;
3695     uint64_t final_size;
3696 
3697     local_init = (ossl_quic_stream_is_server_init(qs) == qc->as_server);
3698 
3699     if (app_error_code != NULL)
3700         *app_error_code = UINT64_MAX;
3701     else
3702         app_error_code = &final_size; /* throw away value */
3703 
3704     if (!ossl_quic_stream_is_bidi(qs) && local_init != is_write) {
3705         /*
3706          * Unidirectional stream and this direction of transmission doesn't
3707          * exist.
3708          */
3709         *state = SSL_STREAM_STATE_WRONG_DIR;
3710     } else if (ossl_quic_channel_is_term_any(qc->ch)) {
3711         /* Connection already closed. */
3712         *state = SSL_STREAM_STATE_CONN_CLOSED;
3713     } else if (!is_write && qs->recv_state == QUIC_RSTREAM_STATE_DATA_READ) {
3714         /* Application has read a FIN. */
3715         *state = SSL_STREAM_STATE_FINISHED;
3716     } else if ((!is_write && qs->stop_sending)
3717                || (is_write && ossl_quic_stream_send_is_reset(qs))) {
3718         /*
3719          * Stream has been reset locally. FIN takes precedence over this for the
3720          * read case as the application need not care if the stream is reset
3721          * after a FIN has been successfully processed.
3722          */
3723         *state          = SSL_STREAM_STATE_RESET_LOCAL;
3724         *app_error_code = !is_write
3725             ? qs->stop_sending_aec
3726             : qs->reset_stream_aec;
3727     } else if ((!is_write && ossl_quic_stream_recv_is_reset(qs))
3728                || (is_write && qs->peer_stop_sending)) {
3729         /*
3730          * Stream has been reset remotely. */
3731         *state          = SSL_STREAM_STATE_RESET_REMOTE;
3732         *app_error_code = !is_write
3733             ? qs->peer_reset_stream_aec
3734             : qs->peer_stop_sending_aec;
3735     } else if (is_write && ossl_quic_sstream_get_final_size(qs->sstream,
3736                                                             &final_size)) {
3737         /*
3738          * Stream has been finished. Stream reset takes precedence over this for
3739          * the write case as peer may not have received all data.
3740          */
3741         *state = SSL_STREAM_STATE_FINISHED;
3742     } else {
3743         /* Stream still healthy. */
3744         *state = SSL_STREAM_STATE_OK;
3745     }
3746 }
3747 
quic_get_stream_state(SSL * ssl,int is_write)3748 static int quic_get_stream_state(SSL *ssl, int is_write)
3749 {
3750     QCTX ctx;
3751     int state;
3752 
3753     if (!expect_quic_with_stream_lock(ssl, /*remote_init=*/-1, /*io=*/0, &ctx))
3754         return SSL_STREAM_STATE_NONE;
3755 
3756     quic_classify_stream(ctx.qc, ctx.xso->stream, is_write, &state, NULL);
3757     quic_unlock(ctx.qc);
3758     return state;
3759 }
3760 
ossl_quic_get_stream_read_state(SSL * ssl)3761 int ossl_quic_get_stream_read_state(SSL *ssl)
3762 {
3763     return quic_get_stream_state(ssl, /*is_write=*/0);
3764 }
3765 
3766 /*
3767  * SSL_get_stream_write_state
3768  * --------------------------
3769  */
ossl_quic_get_stream_write_state(SSL * ssl)3770 int ossl_quic_get_stream_write_state(SSL *ssl)
3771 {
3772     return quic_get_stream_state(ssl, /*is_write=*/1);
3773 }
3774 
3775 /*
3776  * SSL_get_stream_read_error_code
3777  * ------------------------------
3778  */
quic_get_stream_error_code(SSL * ssl,int is_write,uint64_t * app_error_code)3779 static int quic_get_stream_error_code(SSL *ssl, int is_write,
3780                                       uint64_t *app_error_code)
3781 {
3782     QCTX ctx;
3783     int state;
3784 
3785     if (!expect_quic_with_stream_lock(ssl, /*remote_init=*/-1, /*io=*/0, &ctx))
3786         return -1;
3787 
3788     quic_classify_stream(ctx.qc, ctx.xso->stream, /*is_write=*/0,
3789                          &state, app_error_code);
3790 
3791     quic_unlock(ctx.qc);
3792     switch (state) {
3793         case SSL_STREAM_STATE_FINISHED:
3794              return 0;
3795         case SSL_STREAM_STATE_RESET_LOCAL:
3796         case SSL_STREAM_STATE_RESET_REMOTE:
3797              return 1;
3798         default:
3799              return -1;
3800     }
3801 }
3802 
ossl_quic_get_stream_read_error_code(SSL * ssl,uint64_t * app_error_code)3803 int ossl_quic_get_stream_read_error_code(SSL *ssl, uint64_t *app_error_code)
3804 {
3805     return quic_get_stream_error_code(ssl, /*is_write=*/0, app_error_code);
3806 }
3807 
3808 /*
3809  * SSL_get_stream_write_error_code
3810  * -------------------------------
3811  */
ossl_quic_get_stream_write_error_code(SSL * ssl,uint64_t * app_error_code)3812 int ossl_quic_get_stream_write_error_code(SSL *ssl, uint64_t *app_error_code)
3813 {
3814     return quic_get_stream_error_code(ssl, /*is_write=*/1, app_error_code);
3815 }
3816 
3817 /*
3818  * Write buffer size mutation
3819  * --------------------------
3820  */
ossl_quic_set_write_buffer_size(SSL * ssl,size_t size)3821 int ossl_quic_set_write_buffer_size(SSL *ssl, size_t size)
3822 {
3823     int ret = 0;
3824     QCTX ctx;
3825 
3826     if (!expect_quic_with_stream_lock(ssl, /*remote_init=*/-1, /*io=*/0, &ctx))
3827         return 0;
3828 
3829     if (!ossl_quic_stream_has_send(ctx.xso->stream)) {
3830         /* Called on a unidirectional receive-only stream - error. */
3831         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED, NULL);
3832         goto out;
3833     }
3834 
3835     if (!ossl_quic_stream_has_send_buffer(ctx.xso->stream)) {
3836         /*
3837          * If the stream has a send part but we have disposed of it because we
3838          * no longer need it, this is a no-op.
3839          */
3840         ret = 1;
3841         goto out;
3842     }
3843 
3844     if (!ossl_quic_sstream_set_buffer_size(ctx.xso->stream->sstream, size)) {
3845         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_INTERNAL_ERROR, NULL);
3846         goto out;
3847     }
3848 
3849     ret = 1;
3850 
3851 out:
3852     quic_unlock(ctx.qc);
3853     return ret;
3854 }
3855 
3856 /*
3857  * SSL_get_conn_close_info
3858  * -----------------------
3859  */
ossl_quic_get_conn_close_info(SSL * ssl,SSL_CONN_CLOSE_INFO * info,size_t info_len)3860 int ossl_quic_get_conn_close_info(SSL *ssl,
3861                                   SSL_CONN_CLOSE_INFO *info,
3862                                   size_t info_len)
3863 {
3864     QCTX ctx;
3865     const QUIC_TERMINATE_CAUSE *tc;
3866 
3867     if (!expect_quic_conn_only(ssl, &ctx))
3868         return -1;
3869 
3870     tc = ossl_quic_channel_get_terminate_cause(ctx.qc->ch);
3871     if (tc == NULL)
3872         return 0;
3873 
3874     info->error_code    = tc->error_code;
3875     info->frame_type    = tc->frame_type;
3876     info->reason        = tc->reason;
3877     info->reason_len    = tc->reason_len;
3878     info->flags         = 0;
3879     if (!tc->remote)
3880         info->flags |= SSL_CONN_CLOSE_FLAG_LOCAL;
3881     if (!tc->app)
3882         info->flags |= SSL_CONN_CLOSE_FLAG_TRANSPORT;
3883     return 1;
3884 }
3885 
3886 /*
3887  * SSL_key_update
3888  * --------------
3889  */
ossl_quic_key_update(SSL * ssl,int update_type)3890 int ossl_quic_key_update(SSL *ssl, int update_type)
3891 {
3892     QCTX ctx;
3893 
3894     if (!expect_quic_conn_only(ssl, &ctx))
3895         return 0;
3896 
3897     switch (update_type) {
3898     case SSL_KEY_UPDATE_NOT_REQUESTED:
3899         /*
3900          * QUIC signals peer key update implicily by triggering a local
3901          * spontaneous TXKU. Silently upgrade this to SSL_KEY_UPDATE_REQUESTED.
3902          */
3903     case SSL_KEY_UPDATE_REQUESTED:
3904         break;
3905 
3906     default:
3907         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, ERR_R_PASSED_INVALID_ARGUMENT, NULL);
3908         return 0;
3909     }
3910 
3911     quic_lock(ctx.qc);
3912 
3913     /* Attempt to perform a TXKU. */
3914     if (!ossl_quic_channel_trigger_txku(ctx.qc->ch)) {
3915         QUIC_RAISE_NON_NORMAL_ERROR(&ctx, SSL_R_TOO_MANY_KEY_UPDATES, NULL);
3916         quic_unlock(ctx.qc);
3917         return 0;
3918     }
3919 
3920     quic_unlock(ctx.qc);
3921     return 1;
3922 }
3923 
3924 /*
3925  * SSL_get_key_update_type
3926  * -----------------------
3927  */
ossl_quic_get_key_update_type(const SSL * s)3928 int ossl_quic_get_key_update_type(const SSL *s)
3929 {
3930     /*
3931      * We always handle key updates immediately so a key update is never
3932      * pending.
3933      */
3934     return SSL_KEY_UPDATE_NONE;
3935 }
3936 
3937 /*
3938  * QUIC Front-End I/O API: SSL_CTX Management
3939  * ==========================================
3940  */
3941 
ossl_quic_ctx_ctrl(SSL_CTX * ctx,int cmd,long larg,void * parg)3942 long ossl_quic_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
3943 {
3944     switch (cmd) {
3945     default:
3946         return ssl3_ctx_ctrl(ctx, cmd, larg, parg);
3947     }
3948 }
3949 
ossl_quic_callback_ctrl(SSL * s,int cmd,void (* fp)(void))3950 long ossl_quic_callback_ctrl(SSL *s, int cmd, void (*fp) (void))
3951 {
3952     QCTX ctx;
3953 
3954     if (!expect_quic_conn_only(s, &ctx))
3955         return 0;
3956 
3957     switch (cmd) {
3958     case SSL_CTRL_SET_MSG_CALLBACK:
3959         ossl_quic_channel_set_msg_callback(ctx.qc->ch, (ossl_msg_cb)fp,
3960                                            &ctx.qc->ssl);
3961         /* This callback also needs to be set on the internal SSL object */
3962         return ssl3_callback_ctrl(ctx.qc->tls, cmd, fp);;
3963 
3964     default:
3965         /* Probably a TLS related ctrl. Defer to our internal SSL object */
3966         return ssl3_callback_ctrl(ctx.qc->tls, cmd, fp);
3967     }
3968 }
3969 
ossl_quic_ctx_callback_ctrl(SSL_CTX * ctx,int cmd,void (* fp)(void))3970 long ossl_quic_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp) (void))
3971 {
3972     return ssl3_ctx_callback_ctrl(ctx, cmd, fp);
3973 }
3974 
ossl_quic_renegotiate_check(SSL * ssl,int initok)3975 int ossl_quic_renegotiate_check(SSL *ssl, int initok)
3976 {
3977     /* We never do renegotiation. */
3978     return 0;
3979 }
3980 
ossl_quic_get_cipher_by_char(const unsigned char * p)3981 const SSL_CIPHER *ossl_quic_get_cipher_by_char(const unsigned char *p)
3982 {
3983     const SSL_CIPHER *ciph = ssl3_get_cipher_by_char(p);
3984 
3985     if ((ciph->algorithm2 & SSL_QUIC) == 0)
3986         return NULL;
3987 
3988     return ciph;
3989 }
3990 
3991 /*
3992  * These functions define the TLSv1.2 (and below) ciphers that are supported by
3993  * the SSL_METHOD. Since QUIC only supports TLSv1.3 we don't support any.
3994  */
3995 
ossl_quic_num_ciphers(void)3996 int ossl_quic_num_ciphers(void)
3997 {
3998     return 0;
3999 }
4000 
ossl_quic_get_cipher(unsigned int u)4001 const SSL_CIPHER *ossl_quic_get_cipher(unsigned int u)
4002 {
4003     return NULL;
4004 }
4005 
4006 /*
4007  * SSL_get_shutdown()
4008  * ------------------
4009  */
ossl_quic_get_shutdown(const SSL * s)4010 int ossl_quic_get_shutdown(const SSL *s)
4011 {
4012     QCTX ctx;
4013     int shut = 0;
4014 
4015     if (!expect_quic_conn_only(s, &ctx))
4016         return 0;
4017 
4018     if (ossl_quic_channel_is_term_any(ctx.qc->ch)) {
4019         shut |= SSL_SENT_SHUTDOWN;
4020         if (!ossl_quic_channel_is_closing(ctx.qc->ch))
4021             shut |= SSL_RECEIVED_SHUTDOWN;
4022     }
4023 
4024     return shut;
4025 }
4026 
4027 /*
4028  * QUIC Polling Support APIs
4029  * =========================
4030  */
4031 
4032 /* Do we have the R (read) condition? */
4033 QUIC_NEEDS_LOCK
test_poll_event_r(QUIC_XSO * xso)4034 static int test_poll_event_r(QUIC_XSO *xso)
4035 {
4036     int fin = 0;
4037     size_t avail = 0;
4038 
4039     /*
4040      * If a stream has had the fin bit set on the last packet
4041      * received, then we need to return a 1 here to raise
4042      * SSL_POLL_EVENT_R, so that the stream can have its completion
4043      * detected and closed gracefully by an application.
4044      * However, if the client reads the data via SSL_read[_ex], that api
4045      * provides no stream status, and as a result the stream state moves to
4046      * QUIC_RSTREAM_STATE_DATA_READ, and the receive buffer is freed, which
4047      * stored the fin state, so its not directly know-able here.  Instead
4048      * check for the stream state being QUIC_RSTREAM_STATE_DATA_READ, which
4049      * is only set if the last stream frame received had the fin bit set, and
4050      * the client read the data.  This catches our poll/read/poll case
4051      */
4052     if (xso->stream->recv_state == QUIC_RSTREAM_STATE_DATA_READ)
4053         return 1;
4054 
4055     return ossl_quic_stream_has_recv_buffer(xso->stream)
4056         && ossl_quic_rstream_available(xso->stream->rstream, &avail, &fin)
4057         && (avail > 0 || (fin && !xso->retired_fin));
4058 }
4059 
4060 /* Do we have the ER (exception: read) condition? */
4061 QUIC_NEEDS_LOCK
test_poll_event_er(QUIC_XSO * xso)4062 static int test_poll_event_er(QUIC_XSO *xso)
4063 {
4064     return ossl_quic_stream_has_recv(xso->stream)
4065         && ossl_quic_stream_recv_is_reset(xso->stream)
4066         && !xso->retired_fin;
4067 }
4068 
4069 /* Do we have the W (write) condition? */
4070 QUIC_NEEDS_LOCK
test_poll_event_w(QUIC_XSO * xso)4071 static int test_poll_event_w(QUIC_XSO *xso)
4072 {
4073     return !xso->conn->shutting_down
4074         && ossl_quic_stream_has_send_buffer(xso->stream)
4075         && ossl_quic_sstream_get_buffer_avail(xso->stream->sstream)
4076         && !ossl_quic_sstream_get_final_size(xso->stream->sstream, NULL)
4077         && quic_mutation_allowed(xso->conn, /*req_active=*/1);
4078 }
4079 
4080 /* Do we have the EW (exception: write) condition? */
4081 QUIC_NEEDS_LOCK
test_poll_event_ew(QUIC_XSO * xso)4082 static int test_poll_event_ew(QUIC_XSO *xso)
4083 {
4084     return ossl_quic_stream_has_send(xso->stream)
4085         && xso->stream->peer_stop_sending
4086         && !xso->requested_reset
4087         && !xso->conn->shutting_down;
4088 }
4089 
4090 /* Do we have the EC (exception: connection) condition? */
4091 QUIC_NEEDS_LOCK
test_poll_event_ec(QUIC_CONNECTION * qc)4092 static int test_poll_event_ec(QUIC_CONNECTION *qc)
4093 {
4094     return ossl_quic_channel_is_term_any(qc->ch);
4095 }
4096 
4097 /* Do we have the ECD (exception: connection drained) condition? */
4098 QUIC_NEEDS_LOCK
test_poll_event_ecd(QUIC_CONNECTION * qc)4099 static int test_poll_event_ecd(QUIC_CONNECTION *qc)
4100 {
4101     return ossl_quic_channel_is_terminated(qc->ch);
4102 }
4103 
4104 /* Do we have the IS (incoming: stream) condition? */
4105 QUIC_NEEDS_LOCK
test_poll_event_is(QUIC_CONNECTION * qc,int is_uni)4106 static int test_poll_event_is(QUIC_CONNECTION *qc, int is_uni)
4107 {
4108     return ossl_quic_stream_map_get_accept_queue_len(ossl_quic_channel_get_qsm(qc->ch),
4109                                                      is_uni);
4110 }
4111 
4112 /* Do we have the OS (outgoing: stream) condition? */
4113 QUIC_NEEDS_LOCK
test_poll_event_os(QUIC_CONNECTION * qc,int is_uni)4114 static int test_poll_event_os(QUIC_CONNECTION *qc, int is_uni)
4115 {
4116     /* Is it currently possible for us to make an outgoing stream? */
4117     return quic_mutation_allowed(qc, /*req_active=*/1)
4118         && ossl_quic_channel_get_local_stream_count_avail(qc->ch, is_uni) > 0;
4119 }
4120 
4121 QUIC_TAKES_LOCK
ossl_quic_conn_poll_events(SSL * ssl,uint64_t events,int do_tick,uint64_t * p_revents)4122 int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, int do_tick,
4123                                uint64_t *p_revents)
4124 {
4125     QCTX ctx;
4126     uint64_t revents = 0;
4127 
4128     if (!expect_quic(ssl, &ctx))
4129         return 0;
4130 
4131     quic_lock(ctx.qc);
4132 
4133     if (!ctx.qc->started) {
4134         /* We can only try to write on non-started connection. */
4135         if ((events & SSL_POLL_EVENT_W) != 0)
4136             revents |= SSL_POLL_EVENT_W;
4137         goto end;
4138     }
4139 
4140     if (do_tick)
4141         ossl_quic_reactor_tick(ossl_quic_channel_get_reactor(ctx.qc->ch), 0);
4142 
4143     if (ctx.xso != NULL) {
4144         /* SSL object has a stream component. */
4145 
4146         if ((events & SSL_POLL_EVENT_R) != 0
4147             && test_poll_event_r(ctx.xso))
4148             revents |= SSL_POLL_EVENT_R;
4149 
4150         if ((events & SSL_POLL_EVENT_ER) != 0
4151             && test_poll_event_er(ctx.xso))
4152             revents |= SSL_POLL_EVENT_ER;
4153 
4154         if ((events & SSL_POLL_EVENT_W) != 0
4155             && test_poll_event_w(ctx.xso))
4156             revents |= SSL_POLL_EVENT_W;
4157 
4158         if ((events & SSL_POLL_EVENT_EW) != 0
4159             && test_poll_event_ew(ctx.xso))
4160             revents |= SSL_POLL_EVENT_EW;
4161     }
4162 
4163     if (!ctx.is_stream) {
4164         if ((events & SSL_POLL_EVENT_EC) != 0
4165             && test_poll_event_ec(ctx.qc))
4166             revents |= SSL_POLL_EVENT_EC;
4167 
4168         if ((events & SSL_POLL_EVENT_ECD) != 0
4169             && test_poll_event_ecd(ctx.qc))
4170             revents |= SSL_POLL_EVENT_ECD;
4171 
4172         if ((events & SSL_POLL_EVENT_ISB) != 0
4173             && test_poll_event_is(ctx.qc, /*uni=*/0))
4174             revents |= SSL_POLL_EVENT_ISB;
4175 
4176         if ((events & SSL_POLL_EVENT_ISU) != 0
4177             && test_poll_event_is(ctx.qc, /*uni=*/1))
4178             revents |= SSL_POLL_EVENT_ISU;
4179 
4180         if ((events & SSL_POLL_EVENT_OSB) != 0
4181             && test_poll_event_os(ctx.qc, /*uni=*/0))
4182             revents |= SSL_POLL_EVENT_OSB;
4183 
4184         if ((events & SSL_POLL_EVENT_OSU) != 0
4185             && test_poll_event_os(ctx.qc, /*uni=*/1))
4186             revents |= SSL_POLL_EVENT_OSU;
4187     }
4188 
4189  end:
4190     quic_unlock(ctx.qc);
4191     *p_revents = revents;
4192     return 1;
4193 }
4194 
4195 /*
4196  * Internal Testing APIs
4197  * =====================
4198  */
4199 
ossl_quic_conn_get_channel(SSL * s)4200 QUIC_CHANNEL *ossl_quic_conn_get_channel(SSL *s)
4201 {
4202     QCTX ctx;
4203 
4204     if (!expect_quic_conn_only(s, &ctx))
4205         return NULL;
4206 
4207     return ctx.qc->ch;
4208 }
4209 
ossl_quic_set_diag_title(SSL_CTX * ctx,const char * title)4210 int ossl_quic_set_diag_title(SSL_CTX *ctx, const char *title)
4211 {
4212 #ifndef OPENSSL_NO_QLOG
4213     OPENSSL_free(ctx->qlog_title);
4214     ctx->qlog_title = NULL;
4215 
4216     if (title == NULL)
4217         return 1;
4218 
4219     if ((ctx->qlog_title = OPENSSL_strdup(title)) == NULL)
4220         return 0;
4221 #endif
4222 
4223     return 1;
4224 }
4225