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