]> git.ipfire.org Git - thirdparty/openssl.git/blob - ssl/quic/quic_local.h
QUIC APL: Refactor stream-related code into QUIC_XSO object
[thirdparty/openssl.git] / ssl / quic / quic_local.h
1 /*
2 * Copyright 2022 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 (QCSO) 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 /* Is this stream in blocking mode? */
45 unsigned int blocking : 1;
46
47 /*
48 * This state tracks SSL_write all-or-nothing (AON) write semantics
49 * emulation.
50 *
51 * Example chronology:
52 *
53 * t=0: aon_write_in_progress=0
54 * t=1: SSL_write(ssl, b1, l1) called;
55 * too big to enqueue into sstream at once, SSL_ERROR_WANT_WRITE;
56 * aon_write_in_progress=1; aon_buf_base=b1; aon_buf_len=l1;
57 * aon_buf_pos < l1 (depends on how much room was in sstream);
58 * t=2: SSL_write(ssl, b2, l2);
59 * b2 must equal b1 (validated unless ACCEPT_MOVING_WRITE_BUFFER)
60 * l2 must equal l1 (always validated)
61 * append into sstream from [b2 + aon_buf_pos, b2 + aon_buf_len)
62 * if done, aon_write_in_progess=0
63 *
64 */
65 /* Is an AON write in progress? */
66 unsigned int aon_write_in_progress : 1;
67 /*
68 * The base buffer pointer the caller passed us for the initial AON write
69 * call. We use this for validation purposes unless
70 * ACCEPT_MOVING_WRITE_BUFFER is enabled.
71 *
72 * NOTE: We never dereference this, as the caller might pass a different
73 * (but identical) buffer if using ACCEPT_MOVING_WRITE_BUFFER. It is for
74 * validation by pointer comparison only.
75 */
76 const unsigned char *aon_buf_base;
77 /* The total length of the AON buffer being sent, in bytes. */
78 size_t aon_buf_len;
79 /*
80 * The position in the AON buffer up to which we have successfully sent data
81 * so far.
82 */
83 size_t aon_buf_pos;
84
85 /* SSL_set_mode */
86 uint32_t ssl_mode;
87 };
88
89 struct quic_conn_st {
90 /*
91 * ssl_st is a common header for ordinary SSL objects, QUIC connection
92 * objects and QUIC stream objects, allowing objects of these different
93 * types to be disambiguated at runtime and providing some common fields.
94 *
95 * Note: This must come first in the QUIC_CONNECTION structure.
96 */
97 struct ssl_st ssl;
98
99 SSL *tls;
100
101 /*
102 * The QUIC channel providing the core QUIC connection implementation. Note
103 * that this is not instantiated until we actually start trying to do the
104 * handshake. This is to allow us to gather information like whether we are
105 * going to be in client or server mode before committing to instantiating
106 * the channel, since we want to determine the channel arguments based on
107 * that.
108 *
109 * The channel remains available after connection termination until the SSL
110 * object is freed, thus (ch != NULL) iff (started == 1).
111 */
112 QUIC_CHANNEL *ch;
113
114 /*
115 * The mutex used to synchronise access to the QUIC_CHANNEL. We own this but
116 * provide it to the channel.
117 */
118 CRYPTO_MUTEX *mutex;
119
120 /*
121 * If we have a default stream attached, this is the internal XSO
122 * object. If there is no default stream, this is NULL.
123 */
124 QUIC_XSO *default_xso;
125
126 /* The network read and write BIOs. */
127 BIO *net_rbio, *net_wbio;
128
129 /* Initial peer L4 address. */
130 BIO_ADDR init_peer_addr;
131
132 # ifndef OPENSSL_NO_QUIC_THREAD_ASSIST
133 /* Manages thread for QUIC thread assisted mode. */
134 QUIC_THREAD_ASSIST thread_assist;
135 # endif
136
137 /* If non-NULL, used instead of ossl_time_now(). Used for testing. */
138 OSSL_TIME (*override_now_cb)(void *arg);
139 void *override_now_cb_arg;
140
141 /* Have we started? */
142 unsigned int started : 1;
143
144 /* Can the read and write network BIOs support blocking? */
145 unsigned int can_poll_net_rbio : 1;
146 unsigned int can_poll_net_wbio : 1;
147
148 /*
149 * This is 1 if we were instantiated using a QUIC server method
150 * (for future use).
151 */
152 unsigned int as_server : 1;
153
154 /*
155 * Has the application called SSL_set_accept_state? We require this to be
156 * congruent with the value of as_server.
157 */
158 unsigned int as_server_state : 1;
159
160 /* Are we using thread assisted mode? Never changes after init. */
161 unsigned int is_thread_assisted : 1;
162
163 /* Do connection-level operations (e.g. handshakes) run in blocking mode? */
164 unsigned int blocking : 1;
165
166 /* Do newly created streams start in blocking mode? Inherited by new XSOs. */
167 unsigned int default_blocking : 1;
168
169 /* SSL_set_mode. This is not used directly but inherited by new XSOs. */
170 uint32_t default_ssl_mode;
171
172 /*
173 * Last 'normal' error during an app-level I/O operation, used by
174 * SSL_get_error(); used to track data-path errors like SSL_ERROR_WANT_READ
175 * and SSL_ERROR_WANT_WRITE.
176 */
177 int last_error;
178 };
179
180 /* Internal calls to the QUIC CSM which come from various places. */
181 int ossl_quic_conn_on_handshake_confirmed(QUIC_CONNECTION *qc);
182
183 /*
184 * To be called when a protocol violation occurs. The connection is torn down
185 * with the given error code, which should be a QUIC_ERR_* value. Reason string
186 * is optional and copied if provided. frame_type should be 0 if not applicable.
187 */
188 void ossl_quic_conn_raise_protocol_error(QUIC_CONNECTION *qc,
189 uint64_t error_code,
190 uint64_t frame_type,
191 const char *reason);
192
193 void ossl_quic_conn_on_remote_conn_close(QUIC_CONNECTION *qc,
194 OSSL_QUIC_FRAME_CONN_CLOSE *f);
195
196 # define OSSL_QUIC_ANY_VERSION 0xFFFFF
197
198 # define QUIC_CONNECTION_FROM_SSL_int(ssl, c) \
199 ((ssl) == NULL ? NULL \
200 : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
201 ? (c QUIC_CONNECTION *)(ssl) \
202 : NULL))
203
204 # define QUIC_XSO_FROM_SSL_int(ssl, c) \
205 ((ssl) == NULL \
206 ? NULL \
207 : (((ssl)->type == SSL_TYPE_QUIC_XSO \
208 ? (c QUIC_XSO *)(ssl) \
209 : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
210 ? (c QUIC_XSO *)((QUIC_CONNECTION *)(ssl))->default_xso \
211 : NULL))))
212
213 # define SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, c) \
214 ((ssl) == NULL ? NULL \
215 : ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
216 ? (c SSL_CONNECTION *)((c QUIC_CONNECTION *)(ssl))->tls \
217 : NULL))
218
219 # define IS_QUIC(ssl) ((ssl) != NULL \
220 && ((ssl)->type == SSL_TYPE_QUIC_CONNECTION \
221 || (ssl)->type == SSL_TYPE_QUIC_XSO))
222 # else
223 # define QUIC_CONNECTION_FROM_SSL_int(ssl, c) NULL
224 # define QUIC_XSO_FROM_SSL_int(ssl, c) NULL
225 # define SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, c) NULL
226 # define IS_QUIC(ssl) 0
227 # endif
228
229 # define QUIC_CONNECTION_FROM_SSL(ssl) \
230 QUIC_CONNECTION_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
231 # define QUIC_CONNECTION_FROM_CONST_SSL(ssl) \
232 QUIC_CONNECTION_FROM_SSL_int(ssl, const)
233 # define QUIC_XSO_FROM_SSL(ssl) \
234 QUIC_XSO_FROM_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
235 # define QUIC_XSO_FROM_CONST_SSL(ssl) \
236 QUIC_XSO_FROM_SSL_int(ssl, const)
237 # define SSL_CONNECTION_FROM_QUIC_SSL(ssl) \
238 SSL_CONNECTION_FROM_QUIC_SSL_int(ssl, SSL_CONNECTION_NO_CONST)
239 # define SSL_CONNECTION_FROM_CONST_QUIC_SSL(ssl) \
240 SSL_CONNECTION_FROM_CONST_QUIC_SSL_int(ssl, const)
241
242 # define IMPLEMENT_quic_meth_func(version, func_name, q_accept, \
243 q_connect, enc_data) \
244 const SSL_METHOD *func_name(void) \
245 { \
246 static const SSL_METHOD func_name##_data= { \
247 version, \
248 0, \
249 0, \
250 ossl_quic_new, \
251 ossl_quic_free, \
252 ossl_quic_reset, \
253 ossl_quic_init, \
254 ossl_quic_clear, \
255 ossl_quic_deinit, \
256 q_accept, \
257 q_connect, \
258 ossl_quic_read, \
259 ossl_quic_peek, \
260 ossl_quic_write, \
261 NULL /* shutdown */, \
262 NULL /* renegotiate */, \
263 ossl_quic_renegotiate_check, \
264 NULL /* read_bytes */, \
265 NULL /* write_bytes */, \
266 NULL /* dispatch_alert */, \
267 ossl_quic_ctrl, \
268 ossl_quic_ctx_ctrl, \
269 NULL /* get_cipher_by_char */, \
270 NULL /* put_cipher_by_char */, \
271 ossl_quic_pending, \
272 ossl_quic_num_ciphers, \
273 ossl_quic_get_cipher, \
274 tls1_default_timeout, \
275 &enc_data, \
276 ssl_undefined_void_function, \
277 ossl_quic_callback_ctrl, \
278 ossl_quic_ctx_callback_ctrl, \
279 }; \
280 return &func_name##_data; \
281 }
282
283 #endif