xref: /freebsd/crypto/openssl/ssl/quic/quic_local.h (revision e7be843b4a162e68651d3911f0357ed464915629)
1 /*
2  * Copyright 2022-2025 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 #ifndef OSSL_QUIC_LOCAL_H
11 # define OSSL_QUIC_LOCAL_H
12 
13 # include <openssl/ssl.h>
14 # include "internal/quic_ssl.h"       /* QUIC_CONNECTION */
15 # include "internal/quic_txp.h"
16 # include "internal/quic_statm.h"
17 # include "internal/quic_demux.h"
18 # include "internal/quic_record_rx.h"
19 # include "internal/quic_tls.h"
20 # include "internal/quic_fc.h"
21 # include "internal/quic_stream.h"
22 # include "internal/quic_channel.h"
23 # include "internal/quic_reactor.h"
24 # include "internal/quic_thread_assist.h"
25 # include "../ssl_local.h"
26 # include "quic_obj_local.h"
27 
28 # ifndef OPENSSL_NO_QUIC
29 
30 /*
31  * QUIC stream SSL object (QSSO) type. This implements the API personality layer
32  * for QSSO objects, wrapping the QUIC-native QUIC_STREAM object and tracking
33  * state required by the libssl API personality.
34  */
35 struct quic_xso_st {
36     /* QUIC_OBJ common header, including SSL object common header. */
37     QUIC_OBJ                        obj;
38 
39     /* The connection this stream is associated with. Always non-NULL. */
40     QUIC_CONNECTION                 *conn;
41 
42     /* The stream object. Always non-NULL for as long as the XSO exists. */
43     QUIC_STREAM                     *stream;
44 
45     /* The application has retired a FIN (i.e. SSL_ERROR_ZERO_RETURN). */
46     unsigned int                    retired_fin             : 1;
47 
48     /*
49      * The application has requested a reset. Not set for reflexive
50      * STREAM_RESETs caused by peer STOP_SENDING.
51      */
52     unsigned int                    requested_reset         : 1;
53 
54     /*
55      * This state tracks SSL_write all-or-nothing (AON) write semantics
56      * emulation.
57      *
58      * Example chronology:
59      *
60      *   t=0:  aon_write_in_progress=0
61      *   t=1:  SSL_write(ssl, b1, l1) called;
62      *         too big to enqueue into sstream at once, SSL_ERROR_WANT_WRITE;
63      *         aon_write_in_progress=1; aon_buf_base=b1; aon_buf_len=l1;
64      *         aon_buf_pos < l1 (depends on how much room was in sstream);
65      *   t=2:  SSL_write(ssl, b2, l2);
66      *         b2 must equal b1 (validated unless ACCEPT_MOVING_WRITE_BUFFER)
67      *         l2 must equal l1 (always validated)
68      *         append into sstream from [b2 + aon_buf_pos, b2 + aon_buf_len)
69      *         if done, aon_write_in_progress=0
70      *
71      */
72     /* Is an AON write in progress? */
73     unsigned int                    aon_write_in_progress   : 1;
74 
75     /*
76      * The base buffer pointer the caller passed us for the initial AON write
77      * call. We use this for validation purposes unless
78      * ACCEPT_MOVING_WRITE_BUFFER is enabled.
79      *
80      * NOTE: We never dereference this, as the caller might pass a different
81      * (but identical) buffer if using ACCEPT_MOVING_WRITE_BUFFER. It is for
82      * validation by pointer comparison only.
83      */
84     const unsigned char             *aon_buf_base;
85     /* The total length of the AON buffer being sent, in bytes. */
86     size_t                          aon_buf_len;
87     /*
88      * The position in the AON buffer up to which we have successfully sent data
89      * so far.
90      */
91     size_t                          aon_buf_pos;
92 
93     /* SSL_set_mode */
94     uint32_t                        ssl_mode;
95 
96     /* SSL_set_options */
97     uint64_t                        ssl_options;
98 
99     /*
100      * Last 'normal' error during an app-level I/O operation, used by
101      * SSL_get_error(); used to track data-path errors like SSL_ERROR_WANT_READ
102      * and SSL_ERROR_WANT_WRITE.
103      */
104     int                             last_error;
105 };
106 
107 /*
108  * QUIC connection SSL object (QCSO) type. This implements the API personality
109  * layer for QCSO objects, wrapping the QUIC-native QUIC_CHANNEL object.
110  */
111 struct quic_conn_st {
112     /*
113      * QUIC_OBJ is a common header for QUIC APL objects, allowing objects of
114      * these different types to be disambiguated at runtime and providing some
115      * common fields.
116      *
117      * Note: This must come first in the QUIC_CONNECTION structure.
118      */
119     QUIC_OBJ                        obj;
120 
121     SSL                             *tls;
122 
123     /* The QLSO this connection belongs to, if any. */
124     QUIC_LISTENER                   *listener;
125 
126     /* The QDSO this connection belongs to, if any. */
127     QUIC_DOMAIN                     *domain;
128 
129     /* The QUIC engine representing the QUIC event domain. */
130     QUIC_ENGINE                     *engine;
131 
132     /* The QUIC port representing the QUIC listener and socket. */
133     QUIC_PORT                       *port;
134 
135     /*
136      * The QUIC channel providing the core QUIC connection implementation. Note
137      * that this is not instantiated until we actually start trying to do the
138      * handshake. This is to allow us to gather information like whether we are
139      * going to be in client or server mode before committing to instantiating
140      * the channel, since we want to determine the channel arguments based on
141      * that.
142      *
143      * The channel remains available after connection termination until the SSL
144      * object is freed, thus (ch != NULL) iff (started == 1).
145      */
146     QUIC_CHANNEL                    *ch;
147 
148     /*
149      * The mutex used to synchronise access to the QUIC_CHANNEL. We own this but
150      * provide it to the channel.
151      */
152 #if defined(OPENSSL_THREADS)
153     CRYPTO_MUTEX                    *mutex;
154 #endif
155 
156     /*
157      * If we have a default stream attached, this is the internal XSO
158      * object. If there is no default stream, this is NULL.
159      */
160     QUIC_XSO                        *default_xso;
161 
162     /* Initial peer L4 address. */
163     BIO_ADDR                        init_peer_addr;
164 
165 #  ifndef OPENSSL_NO_QUIC_THREAD_ASSIST
166     /* Manages thread for QUIC thread assisted mode. */
167     QUIC_THREAD_ASSIST              thread_assist;
168 #  endif
169 
170     /* Number of XSOs allocated. Includes the default XSO, if any. */
171     size_t                          num_xso;
172 
173     /* Have we started? */
174     unsigned int                    started                 : 1;
175 
176     /*
177      * This is 1 if we were instantiated using a QUIC server method
178      * (for future use).
179      */
180     unsigned int                    as_server               : 1;
181 
182     /*
183      * Has the application called SSL_set_accept_state? We require this to be
184      * congruent with the value of as_server.
185      */
186     unsigned int                    as_server_state         : 1;
187 
188     /* Are we using thread assisted mode? Never changes after init. */
189     unsigned int                    is_thread_assisted      : 1;
190 
191     /* Have we created a default XSO yet? */
192     unsigned int                    default_xso_created     : 1;
193 
194     /*
195      * Pre-TERMINATING shutdown phase in which we are flushing streams.
196      * Monotonically transitions to 1.
197      * New streams cannot be created in this state.
198      */
199     unsigned int                    shutting_down           : 1;
200 
201     /* Have we probed the BIOs for addressing support? */
202     unsigned int                    addressing_probe_done   : 1;
203 
204     /* Are we using addressed mode (BIO_sendmmsg with non-NULL peer)? */
205     unsigned int                    addressed_mode_w        : 1;
206     unsigned int                    addressed_mode_r        : 1;
207 
208     /* Flag to indicate waiting on accept queue */
209     unsigned int                    pending                 : 1;
210 
211     /* Default stream type. Defaults to SSL_DEFAULT_STREAM_MODE_AUTO_BIDI. */
212     uint32_t                        default_stream_mode;
213 
214     /* SSL_set_mode. This is not used directly but inherited by new XSOs. */
215     uint32_t                        default_ssl_mode;
216 
217     /* SSL_set_options. This is not used directly but inherited by new XSOs. */
218     uint64_t                        default_ssl_options;
219 
220     /* SSL_set_incoming_stream_policy. */
221     int                             incoming_stream_policy;
222     uint64_t                        incoming_stream_aec;
223 
224     /*
225      * Last 'normal' error during an app-level I/O operation, used by
226      * SSL_get_error(); used to track data-path errors like SSL_ERROR_WANT_READ
227      * and SSL_ERROR_WANT_WRITE.
228      */
229     int                             last_error;
230 };
231 
232 /*
233  * QUIC listener SSL object (QLSO) type. This implements the API personality
234  * layer for QLSO objects, wrapping the QUIC-native QUIC_PORT object.
235  */
236 struct quic_listener_st {
237     /* QUIC_OBJ common header, including SSL object common header. */
238     QUIC_OBJ                        obj;
239 
240     /* The QDSO this connection belongs to, if any. */
241     QUIC_DOMAIN                     *domain;
242 
243     /* The QUIC engine representing the QUIC event domain. */
244     QUIC_ENGINE                     *engine;
245 
246     /* The QUIC port representing the QUIC listener and socket. */
247     QUIC_PORT                       *port;
248 
249 #if defined(OPENSSL_THREADS)
250     /*
251      * The mutex used to synchronise access to the QUIC_ENGINE. We own this but
252      * provide it to the engine.
253      */
254     CRYPTO_MUTEX                    *mutex;
255 #endif
256 
257     /* Have we started listening yet? */
258     unsigned int                    listening               : 1;
259 };
260 
261 /*
262  * QUIC domain SSL object (QDSO) type. This implements the API personality layer
263  * for QDSO objects, wrapping the QUIC-native QUIC_ENGINE object.
264  */
265 struct quic_domain_st {
266      /* QUIC_OBJ common header, including SSL object common header. */
267     QUIC_OBJ                        obj;
268 
269     /* The QUIC engine representing the QUIC event domain. */
270     QUIC_ENGINE                     *engine;
271 
272 #if defined(OPENSSL_THREADS)
273     /*
274      * The mutex used to synchronise access to the QUIC_ENGINE. We own this but
275      * provide it to the engine.
276      */
277     CRYPTO_MUTEX                    *mutex;
278 #endif
279 };
280 
281 /* Internal calls to the QUIC CSM which come from various places. */
282 int ossl_quic_conn_on_handshake_confirmed(QUIC_CONNECTION *qc);
283 
284 /*
285  * To be called when a protocol violation occurs. The connection is torn down
286  * with the given error code, which should be a OSSL_QUIC_ERR_* value. Reason
287  * string is optional and copied if provided. frame_type should be 0 if not
288  * applicable.
289  */
290 void ossl_quic_conn_raise_protocol_error(QUIC_CONNECTION *qc,
291                                          uint64_t error_code,
292                                          uint64_t frame_type,
293                                          const char *reason);
294 
295 void ossl_quic_conn_on_remote_conn_close(QUIC_CONNECTION *qc,
296                                          OSSL_QUIC_FRAME_CONN_CLOSE *f);
297 
298 #  define OSSL_QUIC_ANY_VERSION 0xFFFFF
299 # endif
300 
301 # define IMPLEMENT_quic_meth_func(version, func_name, q_accept, \
302                                  q_connect, enc_data) \
303 const SSL_METHOD *func_name(void)  \
304         { \
305         static const SSL_METHOD func_name##_data= { \
306                 version, \
307                 0, \
308                 0, \
309                 ossl_quic_new, \
310                 ossl_quic_free, \
311                 ossl_quic_reset, \
312                 ossl_quic_init, \
313                 NULL /* clear */, \
314                 ossl_quic_deinit, \
315                 q_accept, \
316                 q_connect, \
317                 ossl_quic_read, \
318                 ossl_quic_peek, \
319                 ossl_quic_write, \
320                 NULL /* shutdown */, \
321                 NULL /* renegotiate */, \
322                 ossl_quic_renegotiate_check, \
323                 NULL /* read_bytes */, \
324                 NULL /* write_bytes */, \
325                 NULL /* dispatch_alert */, \
326                 ossl_quic_ctrl, \
327                 ossl_quic_ctx_ctrl, \
328                 ossl_quic_get_cipher_by_char, \
329                 NULL /* put_cipher_by_char */, \
330                 ossl_quic_pending, \
331                 ossl_quic_num_ciphers, \
332                 ossl_quic_get_cipher, \
333                 tls1_default_timeout, \
334                 &enc_data, \
335                 ssl_undefined_void_function, \
336                 ossl_quic_callback_ctrl, \
337                 ossl_quic_ctx_callback_ctrl, \
338         }; \
339         return &func_name##_data; \
340         }
341 
342 #endif
343