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