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_SSL_H 11 # define OSSL_QUIC_SSL_H 12 13 # include <openssl/ssl.h> 14 # include <openssl/bio.h> 15 # include "internal/quic_record_rx.h" /* OSSL_QRX */ 16 # include "internal/quic_ackm.h" /* OSSL_ACKM */ 17 # include "internal/quic_channel.h" /* QUIC_CHANNEL */ 18 19 # ifndef OPENSSL_NO_QUIC 20 21 __owur SSL *ossl_quic_new(SSL_CTX *ctx); 22 __owur int ossl_quic_init(SSL *s); 23 void ossl_quic_deinit(SSL *s); 24 void ossl_quic_free(SSL *s); 25 int ossl_quic_reset(SSL *s); 26 int ossl_quic_clear(SSL *s); 27 __owur int ossl_quic_accept(SSL *s); 28 __owur int ossl_quic_connect(SSL *s); 29 __owur int ossl_quic_read(SSL *s, void *buf, size_t len, size_t *readbytes); 30 __owur int ossl_quic_peek(SSL *s, void *buf, size_t len, size_t *readbytes); 31 __owur int ossl_quic_write_flags(SSL *s, const void *buf, size_t len, 32 uint64_t flags, size_t *written); 33 __owur int ossl_quic_write(SSL *s, const void *buf, size_t len, size_t *written); 34 __owur long ossl_quic_ctrl(SSL *s, int cmd, long larg, void *parg); 35 __owur long ossl_quic_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); 36 __owur long ossl_quic_callback_ctrl(SSL *s, int cmd, void (*fp) (void)); 37 __owur long ossl_quic_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp) (void)); 38 __owur size_t ossl_quic_pending(const SSL *s); 39 __owur int ossl_quic_key_update(SSL *s, int update_type); 40 __owur int ossl_quic_get_key_update_type(const SSL *s); 41 __owur const SSL_CIPHER *ossl_quic_get_cipher_by_char(const unsigned char *p); 42 __owur int ossl_quic_num_ciphers(void); 43 __owur const SSL_CIPHER *ossl_quic_get_cipher(unsigned int u); 44 int ossl_quic_renegotiate_check(SSL *ssl, int initok); 45 46 typedef struct quic_conn_st QUIC_CONNECTION; 47 typedef struct quic_xso_st QUIC_XSO; 48 49 int ossl_quic_do_handshake(SSL *s); 50 void ossl_quic_set_connect_state(SSL *s); 51 void ossl_quic_set_accept_state(SSL *s); 52 53 __owur int ossl_quic_has_pending(const SSL *s); 54 __owur int ossl_quic_handle_events(SSL *s); 55 __owur int ossl_quic_get_event_timeout(SSL *s, struct timeval *tv, 56 int *is_infinite); 57 OSSL_TIME ossl_quic_get_event_deadline(SSL *s); 58 __owur int ossl_quic_get_rpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *d); 59 __owur int ossl_quic_get_wpoll_descriptor(SSL *s, BIO_POLL_DESCRIPTOR *d); 60 __owur int ossl_quic_get_net_read_desired(SSL *s); 61 __owur int ossl_quic_get_net_write_desired(SSL *s); 62 __owur int ossl_quic_get_error(const SSL *s, int i); 63 __owur int ossl_quic_want(const SSL *s); 64 __owur int ossl_quic_conn_get_blocking_mode(const SSL *s); 65 __owur int ossl_quic_conn_set_blocking_mode(SSL *s, int blocking); 66 __owur int ossl_quic_conn_shutdown(SSL *s, uint64_t flags, 67 const SSL_SHUTDOWN_EX_ARGS *args, 68 size_t args_len); 69 __owur int ossl_quic_conn_stream_conclude(SSL *s); 70 void ossl_quic_conn_set0_net_rbio(SSL *s, BIO *net_wbio); 71 void ossl_quic_conn_set0_net_wbio(SSL *s, BIO *net_wbio); 72 BIO *ossl_quic_conn_get_net_rbio(const SSL *s); 73 BIO *ossl_quic_conn_get_net_wbio(const SSL *s); 74 __owur int ossl_quic_conn_set_initial_peer_addr(SSL *s, 75 const BIO_ADDR *peer_addr); 76 __owur SSL *ossl_quic_conn_stream_new(SSL *s, uint64_t flags); 77 __owur SSL *ossl_quic_get0_connection(SSL *s); 78 __owur int ossl_quic_get_stream_type(SSL *s); 79 __owur uint64_t ossl_quic_get_stream_id(SSL *s); 80 __owur int ossl_quic_is_stream_local(SSL *s); 81 __owur int ossl_quic_set_default_stream_mode(SSL *s, uint32_t mode); 82 __owur SSL *ossl_quic_detach_stream(SSL *s); 83 __owur int ossl_quic_attach_stream(SSL *conn, SSL *stream); 84 __owur int ossl_quic_set_incoming_stream_policy(SSL *s, int policy, 85 uint64_t aec); 86 __owur SSL *ossl_quic_accept_stream(SSL *s, uint64_t flags); 87 __owur size_t ossl_quic_get_accept_stream_queue_len(SSL *s); 88 __owur int ossl_quic_get_value_uint(SSL *s, uint32_t class_, uint32_t id, 89 uint64_t *value); 90 __owur int ossl_quic_set_value_uint(SSL *s, uint32_t class_, uint32_t id, 91 uint64_t value); 92 93 __owur int ossl_quic_stream_reset(SSL *ssl, 94 const SSL_STREAM_RESET_ARGS *args, 95 size_t args_len); 96 97 __owur int ossl_quic_get_stream_read_state(SSL *ssl); 98 __owur int ossl_quic_get_stream_write_state(SSL *ssl); 99 __owur int ossl_quic_get_stream_read_error_code(SSL *ssl, 100 uint64_t *app_error_code); 101 __owur int ossl_quic_get_stream_write_error_code(SSL *ssl, 102 uint64_t *app_error_code); 103 __owur int ossl_quic_get_conn_close_info(SSL *ssl, 104 SSL_CONN_CLOSE_INFO *info, 105 size_t info_len); 106 107 uint64_t ossl_quic_set_options(SSL *s, uint64_t opts); 108 uint64_t ossl_quic_clear_options(SSL *s, uint64_t opts); 109 uint64_t ossl_quic_get_options(const SSL *s); 110 111 /* Modifies write buffer size for a stream. */ 112 __owur int ossl_quic_set_write_buffer_size(SSL *s, size_t size); 113 114 /* 115 * Used to override ossl_time_now() for debug purposes. While this may be 116 * overridden at any time, expect strange results if you change it after 117 * connecting. 118 */ 119 int ossl_quic_conn_set_override_now_cb(SSL *s, 120 OSSL_TIME (*now_cb)(void *arg), 121 void *now_cb_arg); 122 123 /* 124 * Condvar waiting in the assist thread doesn't support time faking as it relies 125 * on the OS's notion of time, thus this is used in test code to force a 126 * spurious wakeup instead. 127 */ 128 void ossl_quic_conn_force_assist_thread_wake(SSL *s); 129 130 /* For use by tests only. */ 131 QUIC_CHANNEL *ossl_quic_conn_get_channel(SSL *s); 132 133 int ossl_quic_has_pending(const SSL *s); 134 int ossl_quic_get_shutdown(const SSL *s); 135 136 /* 137 * Set qlog diagnostic title. String is copied internally on success and need 138 * not remain allocated. Only has any effect if logging has not already begun. 139 * For use by tests only. Setting this on a context affects any QCSO created 140 * after this is called but does not affect QCSOs already created from a 141 * context. 142 */ 143 int ossl_quic_set_diag_title(SSL_CTX *ctx, const char *title); 144 145 /* APIs used by the polling infrastructure */ 146 int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, int do_tick, 147 uint64_t *revents); 148 149 # endif 150 151 #endif 152