| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713 |
- .\" -*- mode: troff; coding: utf-8 -*-
- .\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
- .\"
- .\" Standard preamble:
- .\" ========================================================================
- .de Sp \" Vertical space (when we can't use .PP)
- .if t .sp .5v
- .if n .sp
- ..
- .de Vb \" Begin verbatim text
- .ft CW
- .nf
- .ne \\$1
- ..
- .de Ve \" End verbatim text
- .ft R
- .fi
- ..
- .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
- .ie n \{\
- . ds C` ""
- . ds C' ""
- 'br\}
- .el\{\
- . ds C`
- . ds C'
- 'br\}
- .\"
- .\" Escape single quotes in literal strings from groff's Unicode transform.
- .ie \n(.g .ds Aq \(aq
- .el .ds Aq '
- .\"
- .\" If the F register is >0, we'll generate index entries on stderr for
- .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
- .\" entries marked with X<> in POD. Of course, you'll have to process the
- .\" output yourself in some meaningful fashion.
- .\"
- .\" Avoid warning from groff about undefined register 'F'.
- .de IX
- ..
- .nr rF 0
- .if \n(.g .if rF .nr rF 1
- .if (\n(rF:(\n(.g==0)) \{\
- . if \nF \{\
- . de IX
- . tm Index:\\$1\t\\n%\t"\\$2"
- ..
- . if !\nF==2 \{\
- . nr % 0
- . nr F 2
- . \}
- . \}
- .\}
- .rr rF
- .\" ========================================================================
- .\"
- .IX Title "OPENSSL-QUIC 7ossl"
- .TH OPENSSL-QUIC 7ossl 2025-01-17 3.4.0 OpenSSL
- .\" For nroff, turn off justification. Always turn off hyphenation; it makes
- .\" way too many mistakes in technical documents.
- .if n .ad l
- .nh
- .SH NAME
- openssl\-quic \- OpenSSL QUIC
- .SH DESCRIPTION
- .IX Header "DESCRIPTION"
- OpenSSL 3.2 and later features support for the QUIC transport protocol.
- Currently, only client connectivity is supported. This man page describes the
- usage of QUIC client functionality for both existing and new applications.
- .PP
- QUIC functionality uses the standard SSL API. A QUIC connection is represented
- by an SSL object in the same way that a TLS connection is. Only minimal changes
- are needed to existing applications making use of the libssl APIs to make use of
- QUIC client functionality. To make use of QUIC, use the SSL method
- \&\fBOSSL_QUIC_client_method\fR\|(3) or \fBOSSL_QUIC_client_thread_method\fR\|(3) with
- \&\fBSSL_CTX_new\fR\|(3).
- .PP
- When a QUIC connection is created, by default, it operates in default stream
- mode, which is intended to provide compatibility with existing non-QUIC
- application usage patterns. In this mode, the connection has a single
- stream associated with it. Calls to \fBSSL_read\fR\|(3) and
- \&\fBSSL_write\fR\|(3) on the QUIC connection SSL object read and write from that
- stream. Whether the stream is client-initiated or server-initiated from a QUIC
- perspective depends on whether \fBSSL_read\fR\|(3) or \fBSSL_write\fR\|(3) is called
- first. See the MODES OF OPERATION section for more information.
- .PP
- The default stream mode is intended for compatibility with existing
- applications. New applications using QUIC are recommended to disable default
- stream mode and use the multi-stream API; see the MODES OF OPERATION section and
- the RECOMMENDATIONS FOR NEW APPLICATIONS section for more information.
- .PP
- The remainder of this man page discusses, in order:
- .IP \(bu 4
- Default stream mode versus multi-stream mode;
- .IP \(bu 4
- The changes to existing libssl APIs which are driven by QUIC-related implementation
- requirements, which existing applications should bear in mind;
- .IP \(bu 4
- Aspects which must be considered by existing applications when adopting QUIC,
- including potential changes which may be needed.
- .IP \(bu 4
- Recommended usage approaches for new applications.
- .IP \(bu 4
- New, QUIC-specific APIs.
- .SH "MODES OF OPERATION"
- .IX Header "MODES OF OPERATION"
- .SS "Default Stream Mode"
- .IX Subsection "Default Stream Mode"
- A QUIC client connection can be used in either default stream mode or
- multi-stream mode. By default, a newly created QUIC connection SSL object uses
- default stream mode.
- .PP
- In default stream mode, a stream is implicitly created and bound to the QUIC
- connection SSL object; \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3) calls to the QUIC
- connection SSL object work by default and are mapped to that stream.
- .PP
- When default stream mode is used, any API function which can be called on a QUIC
- stream SSL object can also be called on a QUIC connection SSL object, in which
- case it affects the default stream bound to the connection.
- .PP
- The identity of a QUIC stream, including its stream ID, varies depending on
- whether a stream is client-initiated or server-initiated. In default stream
- mode, if a client application calls \fBSSL_read\fR\|(3) first before any call to
- \&\fBSSL_write\fR\|(3) on the connection, it is assumed that the application protocol
- is using a server-initiated stream, and the \fBSSL_read\fR\|(3) call will not
- complete (either blocking, or failing appropriately if nonblocking mode is
- configured) until the server initiates a stream. Conversely, if the client
- application calls \fBSSL_write\fR\|(3) before any call to \fBSSL_read\fR\|(3) on the
- connection, it is assumed that a client-initiated stream is to be used
- and such a stream is created automatically.
- .PP
- Default stream mode is intended to aid compatibility with legacy applications.
- New applications adopting QUIC should use multi-stream mode, described below,
- and avoid use of the default stream functionality.
- .PP
- It is possible to use additional streams in default stream mode using
- \&\fBSSL_new_stream\fR\|(3) and \fBSSL_accept_stream\fR\|(3); note that the default incoming
- stream policy will need to be changed using \fBSSL_set_incoming_stream_policy\fR\|(3)
- in order to use \fBSSL_accept_stream\fR\|(3) in this case. However, applications
- using additional streams are strongly recommended to use multi-stream mode
- instead.
- .PP
- Calling \fBSSL_new_stream\fR\|(3) or \fBSSL_accept_stream\fR\|(3) before a default stream
- has been associated with the QUIC connection SSL object will inhibit future
- creation of a default stream.
- .SS "Multi-Stream Mode"
- .IX Subsection "Multi-Stream Mode"
- The recommended usage mode for new applications adopting QUIC is multi-stream
- mode, in which no default stream is attached to the QUIC connection SSL object
- and attempts to call \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3) on the QUIC connection
- SSL object fail. Instead, an application calls \fBSSL_new_stream\fR\|(3) or
- \&\fBSSL_accept_stream\fR\|(3) to create individual stream SSL objects for sending and
- receiving application data using \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3).
- .PP
- To use multi-stream mode, call \fBSSL_set_default_stream_mode\fR\|(3) with an
- argument of \fBSSL_DEFAULT_STREAM_MODE_NONE\fR; this function must be called prior
- to initiating the connection. The default stream mode cannot be changed after
- initiating a connection.
- .PP
- When multi-stream mode is used, meaning that no default stream is associated
- with the connection, calls to API functions which are defined as operating on a
- QUIC stream fail if called on the QUIC connection SSL object. For example, calls
- such as \fBSSL_write\fR\|(3) or \fBSSL_get_stream_id\fR\|(3) will fail.
- .SH "CHANGES TO EXISTING APIS"
- .IX Header "CHANGES TO EXISTING APIS"
- Most SSL APIs, such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3), function as they do
- for TLS connections and do not have changed semantics, with some exceptions. The
- changes to the semantics of existing APIs are as follows:
- .IP \(bu 4
- Since QUIC uses UDP, \fBSSL_set_bio\fR\|(3), \fBSSL_set0_rbio\fR\|(3) and
- \&\fBSSL_set0_wbio\fR\|(3) function as before, but must now receive a BIO with datagram
- semantics. There are broadly four options for applications to use as a network
- BIO:
- .RS 4
- .IP \(bu 4
- \&\fBBIO_s_datagram\fR\|(3), recommended for most applications, replaces
- \&\fBBIO_s_socket\fR\|(3) and provides a UDP socket.
- .IP \(bu 4
- \&\fBBIO_s_dgram_pair\fR\|(3) provides BIO pair-like functionality but with datagram
- semantics, and is recommended for existing applications which use a BIO pair or
- memory BIO to manage libssl's communication with the network.
- .IP \(bu 4
- \&\fBBIO_s_dgram_mem\fR\|(3) provides a simple memory BIO-like interface but with
- datagram semantics. Unlike \fBBIO_s_dgram_pair\fR\|(3), it is unidirectional.
- .IP \(bu 4
- An application may also choose to implement a custom BIO. The new
- \&\fBBIO_sendmmsg\fR\|(3) and \fBBIO_recvmmsg\fR\|(3) APIs must be supported.
- .RE
- .RS 4
- .RE
- .IP \(bu 4
- \&\fBSSL_set_fd\fR\|(3), \fBSSL_set_rfd\fR\|(3) and \fBSSL_set_wfd\fR\|(3) traditionally
- instantiate a \fBBIO_s_socket\fR\|(3). For QUIC, these functions instead instantiate
- a \fBBIO_s_datagram\fR\|(3). This is equivalent to instantiating a
- \&\fBBIO_s_datagram\fR\|(3) and using \fBSSL_set0_rbio\fR\|(3) and \fBSSL_set0_wbio\fR\|(3).
- .IP \(bu 4
- Traditionally, whether the application-level I/O APIs (such as \fBSSL_read\fR\|(3)
- and \fBSSL_write\fR\|(3) operated in a blocking fashion was directly correlated with
- whether the underlying network socket was configured in a blocking fashion. This
- is no longer the case; applications must explicitly configure the desired
- application-level blocking mode using \fBSSL_set_blocking_mode\fR\|(3). See
- \&\fBSSL_set_blocking_mode\fR\|(3) for details.
- .IP \(bu 4
- Network-level I/O must always be performed in a nonblocking manner. The
- application can still enjoy blocking semantics for calls to application-level
- I/O functions such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3), but the underlying
- network BIO provided to QUIC (such as a \fBBIO_s_datagram\fR\|(3)) must be configured
- in nonblocking mode. For application-level blocking functionality, see
- \&\fBSSL_set_blocking_mode\fR\|(3).
- .IP \(bu 4
- \&\fBBIO_new_ssl_connect\fR\|(3) has been changed to automatically use a
- \&\fBBIO_s_datagram\fR\|(3) when used with QUIC, therefore applications which use this
- do not need to change the BIO they use.
- .IP \(bu 4
- \&\fBBIO_new_buffer_ssl_connect\fR\|(3) cannot be used with QUIC and applications must
- change to use \fBBIO_new_ssl_connect\fR\|(3) instead.
- .IP \(bu 4
- \&\fBSSL_shutdown\fR\|(3) has significant changes in relation to how QUIC connections
- must be shut down. In particular, applications should be advised that the full
- RFC-conformant QUIC shutdown process may take an extended amount of time. This
- may not be suitable for short-lived processes which should exit immediately
- after their usage of a QUIC connection is completed. A rapid shutdown mode
- is available for such applications. For details, see \fBSSL_shutdown\fR\|(3).
- .IP \(bu 4
- \&\fBSSL_want\fR\|(3), \fBSSL_want_read\fR\|(3) and \fBSSL_want_write\fR\|(3) no longer reflect
- the I/O state of the network BIO passed to the QUIC SSL object, but instead
- reflect the flow control state of the QUIC stream associated with the SSL
- object.
- .Sp
- When used in nonblocking mode, \fBSSL_ERROR_WANT_READ\fR indicates that the
- receive part of a QUIC stream does not currently have any more data available to
- be read, and \fBSSL_ERROR_WANT_WRITE\fR indicates that the stream's internal buffer
- is full.
- .Sp
- To determine if the QUIC implementation currently wishes to be informed of
- incoming network datagrams, use the new function \fBSSL_net_read_desired\fR\|(3);
- likewise, to determine if the QUIC implementation currently wishes to be
- informed when it is possible to transmit network datagrams, use the new function
- \&\fBSSL_net_write_desired\fR\|(3). Only applications which wish to manage their own event
- loops need to use these functions; see \fBAPPLICATION-DRIVEN EVENT LOOPS\fR for
- further discussion.
- .IP \(bu 4
- The use of ALPN is mandatory when using QUIC. Attempts to connect without
- configuring ALPN will fail. For information on how to configure ALPN, see
- \&\fBSSL_set_alpn_protos\fR\|(3).
- .IP \(bu 4
- Whether QUIC operates in a client or server mode is determined by the
- \&\fBSSL_METHOD\fR used, rather than by calls to \fBSSL_set_connect_state\fR\|(3) or
- \&\fBSSL_set_accept_state\fR\|(3). It is not necessary to call either of
- \&\fBSSL_set_connect_state\fR\|(3) or \fBSSL_set_accept_state\fR\|(3) before connecting, but
- if either of these are called, the function called must be congruent with the
- \&\fBSSL_METHOD\fR being used. Currently, only client mode is supported.
- .IP \(bu 4
- The \fBSSL_set_min_proto_version\fR\|(3) and \fBSSL_set_max_proto_version\fR\|(3) APIs are
- not used and the values passed to them are ignored, as OpenSSL QUIC currently
- always uses TLS 1.3.
- .IP \(bu 4
- The following libssl functionality is not available when used with QUIC.
- .RS 4
- .IP \(bu 4
- Async functionality
- .IP \(bu 4
- \&\fBSSL_MODE_AUTO_RETRY\fR
- .IP \(bu 4
- Record Padding and Fragmentation (\fBSSL_set_block_padding\fR\|(3), etc.)
- .IP \(bu 4
- \&\fBSSL_stateless\fR\|(3) support
- .IP \(bu 4
- SRTP functionality
- .IP \(bu 4
- TLSv1.3 Early Data
- .IP \(bu 4
- TLS Next Protocol Negotiation cannot be used and is superseded by ALPN, which
- must be used instead. The use of ALPN is mandatory with QUIC.
- .IP \(bu 4
- Post-Handshake Client Authentication is not available as QUIC prohibits its use.
- .IP \(bu 4
- QUIC requires the use of TLSv1.3 or later, therefore functionality only relevant
- to older TLS versions is not available.
- .IP \(bu 4
- Some cipher suites which are generally available for TLSv1.3 are not available
- for QUIC, such as \fBTLS_AES_128_CCM_8_SHA256\fR. Your application may need to
- adjust the list of acceptable cipher suites it passes to libssl.
- .IP \(bu 4
- CCM mode is not currently supported.
- .RE
- .RS 4
- .Sp
- The following libssl functionality is also not available when used with QUIC,
- but calls to the relevant functions are treated as no-ops:
- .IP \(bu 4
- Readahead (\fBSSL_set_read_ahead\fR\|(3), etc.)
- .RE
- .RS 4
- .RE
- .SH "CONSIDERATIONS FOR EXISTING APPLICATIONS"
- .IX Header "CONSIDERATIONS FOR EXISTING APPLICATIONS"
- Existing applications seeking to adopt QUIC should apply the following list to
- determine what changes they will need to make:
- .IP \(bu 4
- An application wishing to use QUIC must use \fBOSSL_QUIC_client_method\fR\|(3) or
- \&\fBOSSL_QUIC_client_thread_method\fR\|(3) as its SSL method. For more information
- on the differences between these two methods, see \fBTHREAD ASSISTED MODE\fR.
- .IP \(bu 4
- Determine how to provide QUIC with network access. Determine which of the below
- apply for your application:
- .RS 4
- .IP \(bu 4
- Your application uses \fBBIO_s_socket\fR\|(3) to construct a BIO which is passed to
- the SSL object to provide it with network access.
- .Sp
- Changes needed: Change your application to use \fBBIO_s_datagram\fR\|(3) instead when
- using QUIC. The socket must be configured in nonblocking mode. You may or may
- not need to use \fBSSL_set1_initial_peer_addr\fR\|(3) to set the initial peer
- address; see the \fBQUIC-SPECIFIC APIS\fR section for details.
- .IP \(bu 4
- Your application uses \fBBIO_new_ssl_connect\fR\|(3) to
- construct a BIO which is passed to the SSL object to provide it with network
- access.
- .Sp
- Changes needed: No changes needed. Use of QUIC is detected automatically and a
- datagram socket is created instead of a normal TCP socket.
- .IP \(bu 4
- Your application uses any other I/O strategy in this list but combines it with a
- \&\fBBIO_f_buffer\fR\|(3), for example using \fBBIO_push\fR\|(3).
- .Sp
- Changes needed: Disable the usage of \fBBIO_f_buffer\fR\|(3) when using QUIC. Usage
- of such a buffer is incompatible with QUIC as QUIC requires datagram semantics
- in its interaction with the network.
- .IP \(bu 4
- Your application uses a BIO pair to cause the SSL object to read and write
- network traffic to a memory buffer. Your application manages the transmission
- and reception of buffered data itself in a way unknown to libssl.
- .Sp
- Changes needed: Switch from using a conventional BIO pair to using
- \&\fBBIO_s_dgram_pair\fR\|(3) instead, which has the necessary datagram semantics. You
- will need to modify your application to transmit and receive using a UDP socket
- and to use datagram semantics when interacting with the \fBBIO_s_dgram_pair\fR\|(3)
- instance.
- .IP \(bu 4
- Your application uses a custom BIO method to provide the SSL object with network
- access.
- .Sp
- Changes needed: The custom BIO must be re-architected to have datagram
- semantics. \fBBIO_sendmmsg\fR\|(3) and \fBBIO_recvmmsg\fR\|(3) must be implemented. These
- calls must operate in a nonblocking fashion. Optionally, implement the
- \&\fBBIO_get_rpoll_descriptor\fR\|(3) and \fBBIO_get_wpoll_descriptor\fR\|(3) methods if
- desired. Implementing these methods is required if blocking semantics at the SSL
- API level are desired.
- .RE
- .RS 4
- .RE
- .IP \(bu 4
- An application must explicitly configure whether it wishes to use the SSL APIs
- in blocking mode or not. Traditionally, an SSL object has automatically operated
- in blocking or nonblocking mode based on whether the underlying network BIO
- operates in blocking or nonblocking mode. QUIC requires the use of a
- nonblocking network BIO, therefore the blocking mode at the application level
- must be explicitly configured by the application using the new
- \&\fBSSL_set_blocking_mode\fR\|(3) API. The default mode is blocking. If an application
- wishes to use the SSL object APIs at application level in a nonblocking manner,
- it must add a call to \fBSSL_set_blocking_mode\fR\|(3) to disable blocking mode.
- .IP \(bu 4
- If your application does not choose to use thread assisted mode, it must ensure
- that it calls an I/O function on the SSL object (for example, \fBSSL_read\fR\|(3) or
- \&\fBSSL_write\fR\|(3)), or the new function \fBSSL_handle_events\fR\|(3), regularly. If the
- SSL object is used in blocking mode, an ongoing blocking call to an I/O function
- satisfies this requirement. This is required to ensure that timer events
- required by QUIC are handled in a timely fashion.
- .Sp
- Most applications will service the SSL object by calling \fBSSL_read\fR\|(3) or
- \&\fBSSL_write\fR\|(3) regularly. If an application does not do this, it should ensure
- that \fBSSL_handle_events\fR\|(3) is called regularly.
- .Sp
- \&\fBSSL_get_event_timeout\fR\|(3) can be used to determine when
- \&\fBSSL_handle_events\fR\|(3) must next be called.
- .Sp
- If the SSL object is being used with an underlying network BIO which is pollable
- (such as \fBBIO_s_datagram\fR\|(3)), the application can use
- \&\fBSSL_get_rpoll_descriptor\fR\|(3), \fBSSL_get_wpoll_descriptor\fR\|(3) to obtain
- resources which can be used to determine when \fBSSL_handle_events\fR\|(3) should be
- called due to network I/O.
- .Sp
- Applications which use thread assisted mode do not need to be concerned
- with this requirement, as the QUIC implementation ensures timeout events
- are handled in a timely manner. See \fBTHREAD ASSISTED MODE\fR for details.
- .IP \(bu 4
- Ensure that your usage of \fBSSL_want\fR\|(3), \fBSSL_want_read\fR\|(3) and
- \&\fBSSL_want_write\fR\|(3) reflects the API changes described in \fBCHANGES TO EXISTING
- APIS\fR. In particular, you should use these APIs to determine the ability of a
- QUIC stream to receive or provide application data, not to to determine if
- network I/O is required.
- .IP \(bu 4
- Evaluate your application's use of \fBSSL_shutdown\fR\|(3) in light of the changes
- discussed in \fBCHANGES TO EXISTING APIS\fR. Depending on whether your application
- wishes to prioritise RFC conformance or rapid shutdown, consider using the new
- \&\fBSSL_shutdown_ex\fR\|(3) API instead. See \fBQUIC-SPECIFIC APIS\fR for details.
- .SH "RECOMMENDED USAGE IN NEW APPLICATIONS"
- .IX Header "RECOMMENDED USAGE IN NEW APPLICATIONS"
- The recommended usage in new applications varies depending on three independent
- design decisions:
- .IP \(bu 4
- Whether the application will use blocking or nonblocking I/O at the application
- level (configured using \fBSSL_set_blocking_mode\fR\|(3)).
- .Sp
- If the application does nonblocking I/O at the application level it can choose
- to manage its own polling and event loop; see \fBAPPLICATION-DRIVEN EVENT LOOPS\fR.
- .IP \(bu 4
- Whether the application intends to give the QUIC implementation direct access to
- a network socket (e.g. via \fBBIO_s_datagram\fR\|(3)) or whether it intends to buffer
- transmitted and received datagrams via a \fBBIO_s_dgram_pair\fR\|(3) or custom BIO.
- .Sp
- The former is preferred where possible as it reduces latency to the network,
- which enables QUIC to achieve higher performance and more accurate connection
- round trip time (RTT) estimation.
- .IP \(bu 4
- Whether thread assisted mode will be used (see \fBTHREAD ASSISTED MODE\fR).
- .PP
- Simple demos for QUIC usage under these various scenarios can be found at
- <https://github.com/openssl/openssl/tree/master/doc/designs/ddd>.
- .PP
- Applications which wish to implement QUIC-specific protocols should be aware of
- the APIs listed under \fBQUIC-SPECIFIC APIS\fR which provide access to
- QUIC-specific functionality. For example, \fBSSL_stream_conclude\fR\|(3) can be used
- to indicate the end of the sending part of a stream, and \fBSSL_shutdown_ex\fR\|(3)
- can be used to provide a QUIC application error code when closing a connection.
- .PP
- Regardless of the design decisions chosen above, it is recommended that new
- applications avoid use of the default stream mode and use the multi-stream API
- by calling \fBSSL_set_default_stream_mode\fR\|(3); see the MODES OF OPERATION section
- for details.
- .SH "QUIC-SPECIFIC APIS"
- .IX Header "QUIC-SPECIFIC APIS"
- This section details new APIs which are directly or indirectly related to QUIC.
- For details on the operation of each API, see the referenced man pages.
- .PP
- The following SSL APIs are new but relevant to both QUIC and DTLS:
- .IP \fBSSL_get_event_timeout\fR\|(3) 4
- .IX Item "SSL_get_event_timeout"
- Determines when the QUIC implementation should next be woken up via a call to
- \&\fBSSL_handle_events\fR\|(3) (or another I/O function such as \fBSSL_read\fR\|(3) or
- \&\fBSSL_write\fR\|(3)), if ever.
- .Sp
- This can also be used with DTLS and supersedes \fBDTLSv1_get_timeout\fR\|(3) for new
- usage.
- .IP \fBSSL_handle_events\fR\|(3) 4
- .IX Item "SSL_handle_events"
- This is a non-specific I/O operation which makes a best effort attempt to
- perform any pending I/O or timeout processing. It can be used to advance the
- QUIC state machine by processing incoming network traffic, generating outgoing
- network traffic and handling any expired timeout events. Most other I/O
- functions on an SSL object, such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3)
- implicitly perform event handling on the SSL object, so calling this function is
- only needed if no other I/O function is to be called.
- .Sp
- This can also be used with DTLS and supersedes \fBDTLSv1_handle_timeout\fR\|(3) for
- new usage.
- .PP
- The following SSL APIs are specific to QUIC:
- .IP "\fBSSL_set_blocking_mode\fR\|(3), \fBSSL_get_blocking_mode\fR\|(3)" 4
- .IX Item "SSL_set_blocking_mode, SSL_get_blocking_mode"
- Configures whether blocking semantics are used at the application level. This
- determines whether calls to functions such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3)
- will block.
- .IP "\fBSSL_get_rpoll_descriptor\fR\|(3), \fBSSL_get_wpoll_descriptor\fR\|(3)" 4
- .IX Item "SSL_get_rpoll_descriptor, SSL_get_wpoll_descriptor"
- These functions facilitate operation in nonblocking mode.
- .Sp
- When an SSL object is being used with an underlying network read BIO which
- supports polling, \fBSSL_get_rpoll_descriptor\fR\|(3) outputs an OS resource which
- can be used to synchronise on network readability events which should result in
- a call to \fBSSL_handle_events\fR\|(3). \fBSSL_get_wpoll_descriptor\fR\|(3) works in an
- analogous fashion for the underlying network write BIO.
- .Sp
- The poll descriptors provided by these functions need only be used when
- \&\fBSSL_net_read_desired\fR\|(3) and \fBSSL_net_write_desired\fR\|(3) return 1, respectively.
- .IP "\fBSSL_net_read_desired\fR\|(3), \fBSSL_net_write_desired\fR\|(3)" 4
- .IX Item "SSL_net_read_desired, SSL_net_write_desired"
- These functions facilitate operation in nonblocking mode and are used in
- conjunction with \fBSSL_get_rpoll_descriptor\fR\|(3) and
- \&\fBSSL_get_wpoll_descriptor\fR\|(3) respectively. They determine whether the
- respective poll descriptor is currently relevant for the purposes of polling.
- .IP \fBSSL_set1_initial_peer_addr\fR\|(3) 4
- .IX Item "SSL_set1_initial_peer_addr"
- This function can be used to set the initial peer address for an outgoing QUIC
- connection. This function must be used in the general case when creating an
- outgoing QUIC connection; however, the correct initial peer address can be
- autodetected in some cases. See \fBSSL_set1_initial_peer_addr\fR\|(3) for details.
- .IP \fBSSL_shutdown_ex\fR\|(3) 4
- .IX Item "SSL_shutdown_ex"
- This augments \fBSSL_shutdown\fR\|(3) by allowing an application error code to be
- specified. It also allows a client to decide how quickly it wants a shutdown to
- be performed, potentially by trading off strict RFC compliance.
- .IP \fBSSL_stream_conclude\fR\|(3) 4
- .IX Item "SSL_stream_conclude"
- This allows an application to indicate the normal end of the sending part of a
- QUIC stream. This corresponds to the FIN flag in the QUIC RFC. The receiving
- part of a stream remains usable.
- .IP \fBSSL_stream_reset\fR\|(3) 4
- .IX Item "SSL_stream_reset"
- This allows an application to indicate the non-normal termination of the sending
- part of a stream. This corresponds to the RESET_STREAM frame in the QUIC RFC.
- .IP "\fBSSL_get_stream_write_state\fR\|(3) and \fBSSL_get_stream_read_state\fR\|(3)" 4
- .IX Item "SSL_get_stream_write_state and SSL_get_stream_read_state"
- This allows an application to determine the current stream states for the
- sending and receiving parts of a stream respectively.
- .IP "\fBSSL_get_stream_write_error_code\fR\|(3) and \fBSSL_get_stream_read_error_code\fR\|(3)" 4
- .IX Item "SSL_get_stream_write_error_code and SSL_get_stream_read_error_code"
- This allows an application to determine the application error code which was
- signalled by a peer which has performed a non-normal stream termination of the
- respective sending or receiving part of a stream, if any.
- .IP \fBSSL_get_conn_close_info\fR\|(3) 4
- .IX Item "SSL_get_conn_close_info"
- This allows an application to determine the error code which was signalled when
- the local or remote endpoint terminated the QUIC connection.
- .IP \fBSSL_get0_connection\fR\|(3) 4
- .IX Item "SSL_get0_connection"
- Gets the QUIC connection SSL object from a QUIC stream SSL object.
- .IP \fBSSL_is_connection\fR\|(3) 4
- .IX Item "SSL_is_connection"
- Returns 1 if a SSL object is not a QUIC stream SSL object.
- .IP \fBSSL_get_stream_type\fR\|(3) 4
- .IX Item "SSL_get_stream_type"
- Provides information on the kind of QUIC stream which is attached
- to the SSL object.
- .IP \fBSSL_get_stream_id\fR\|(3) 4
- .IX Item "SSL_get_stream_id"
- Returns the QUIC stream ID which the QUIC protocol has associated with a QUIC
- stream.
- .IP \fBSSL_new_stream\fR\|(3) 4
- .IX Item "SSL_new_stream"
- Creates a new QUIC stream SSL object representing a new, locally-initiated QUIC
- stream.
- .IP \fBSSL_accept_stream\fR\|(3) 4
- .IX Item "SSL_accept_stream"
- Potentially yields a new QUIC stream SSL object representing a new
- remotely-initiated QUIC stream, blocking until one is available if the
- connection is configured to do so.
- .IP \fBSSL_get_accept_stream_queue_len\fR\|(3) 4
- .IX Item "SSL_get_accept_stream_queue_len"
- Provides information on the number of pending remotely-initiated streams.
- .IP \fBSSL_set_incoming_stream_policy\fR\|(3) 4
- .IX Item "SSL_set_incoming_stream_policy"
- Configures how incoming, remotely-initiated streams are handled. The incoming
- stream policy can be used to automatically reject streams created by the peer,
- or allow them to be handled using \fBSSL_accept_stream\fR\|(3).
- .IP \fBSSL_set_default_stream_mode\fR\|(3) 4
- .IX Item "SSL_set_default_stream_mode"
- Used to configure or disable default stream mode; see the MODES OF OPERATION
- section for details.
- .PP
- The following BIO APIs are not specific to QUIC but have been added to
- facilitate QUIC-specific requirements and are closely associated with its use:
- .IP \fBBIO_s_dgram_pair\fR\|(3) 4
- .IX Item "BIO_s_dgram_pair"
- This is a new BIO method which is similar to a conventional BIO pair but
- provides datagram semantics.
- .IP "\fBBIO_get_rpoll_descriptor\fR\|(3), \fBBIO_get_wpoll_descriptor\fR\|(3)" 4
- .IX Item "BIO_get_rpoll_descriptor, BIO_get_wpoll_descriptor"
- This is a new BIO API which allows a BIO to expose a poll descriptor. This API
- is used to implement the corresponding SSL APIs \fBSSL_get_rpoll_descriptor\fR\|(3)
- and \fBSSL_get_wpoll_descriptor\fR\|(3).
- .IP "\fBBIO_sendmmsg\fR\|(3), \fBBIO_recvmmsg\fR\|(3)" 4
- .IX Item "BIO_sendmmsg, BIO_recvmmsg"
- This is a new BIO API which can be implemented by BIOs which implement datagram
- semantics. It is implemented by \fBBIO_s_datagram\fR\|(3) and \fBBIO_s_dgram_pair\fR\|(3).
- It is used by the QUIC implementation to send and receive UDP datagrams.
- .IP "\fBBIO_dgram_set_no_trunc\fR\|(3), \fBBIO_dgram_get_no_trunc\fR\|(3)" 4
- .IX Item "BIO_dgram_set_no_trunc, BIO_dgram_get_no_trunc"
- By default, \fBBIO_s_dgram_pair\fR\|(3) has semantics comparable to those of Berkeley
- sockets being used with datagram semantics. This allows an alternative mode
- to be enabled in which datagrams will not be silently truncated if they are
- too large.
- .IP "\fBBIO_dgram_set_caps\fR\|(3), \fBBIO_dgram_get_caps\fR\|(3)" 4
- .IX Item "BIO_dgram_set_caps, BIO_dgram_get_caps"
- These functions are used to allow the user of one end of a
- \&\fBBIO_s_dgram_pair\fR\|(3) to indicate its capabilities to the other end of a
- \&\fBBIO_s_dgram_pair\fR\|(3). In particular, this allows an application to inform the
- QUIC implementation of whether it is prepared to handle local and/or peer
- addresses in transmitted datagrams and to provide the applicable information in
- received datagrams.
- .IP "\fBBIO_dgram_get_local_addr_cap\fR\|(3), \fBBIO_dgram_set_local_addr_enable\fR\|(3), \fBBIO_dgram_get_local_addr_enable\fR\|(3)" 4
- .IX Item "BIO_dgram_get_local_addr_cap, BIO_dgram_set_local_addr_enable, BIO_dgram_get_local_addr_enable"
- Local addressing support refers to the ability of a BIO with datagram semantics
- to allow a source address to be specified on transmission and to report the
- destination address on reception. These functions can be used to determine if a
- BIO can support local addressing and to enable local addressing support if it
- can.
- .IP \fBBIO_err_is_non_fatal\fR\|(3) 4
- .IX Item "BIO_err_is_non_fatal"
- This is used to determine if an error while calling \fBBIO_sendmmsg\fR\|(3) or
- \&\fBBIO_recvmmsg\fR\|(3) is ephemeral in nature, such as "would block" errors.
- .SH "THREAD ASSISTED MODE"
- .IX Header "THREAD ASSISTED MODE"
- The optional thread assisted mode can be used with
- \&\fBOSSL_QUIC_client_thread_method\fR\|(3). In this mode, a background thread is
- created automatically. The OpenSSL QUIC implementation then takes responsibility
- for ensuring that timeout events are handled on a timely basis even if no SSL
- I/O function such as \fBSSL_read\fR\|(3) or \fBSSL_write\fR\|(3) is called by the
- application for a long time.
- .PP
- All necessary locking is handled automatically internally, but the thread safety
- guarantees for the public SSL API are unchanged. Therefore, an application must
- still do its own locking if it wishes to make concurrent use of the public SSL
- APIs.
- .PP
- Because this method relies on threads, it is not available on platforms where
- threading support is not available or not supported by OpenSSL. However, it
- does provide the simplest mode of usage for an application.
- .PP
- The implementation may or may not use a common thread or thread pool to service
- multiple SSL objects in the same \fBSSL_CTX\fR.
- .SH "APPLICATION-DRIVEN EVENT LOOPS"
- .IX Header "APPLICATION-DRIVEN EVENT LOOPS"
- OpenSSL's QUIC implementation is designed to facilitate applications which wish
- to use the SSL APIs in a blocking fashion, but is also designed to facilitate
- applications which wish to use the SSL APIs in a nonblocking fashion and manage
- their own event loops and polling directly. This is useful when it is desirable
- to host OpenSSL's QUIC implementation on top of an application's existing
- nonblocking I/O infrastructure.
- .PP
- This is supported via the concept of poll descriptors; see
- \&\fBBIO_get_rpoll_descriptor\fR\|(3) for details. Broadly, a \fBBIO_POLL_DESCRIPTOR\fR is
- a structure which expresses some kind of OS resource which can be used to
- synchronise on I/O events. The QUIC implementation provides a
- \&\fBBIO_POLL_DESCRIPTOR\fR based on the poll descriptor provided by the underlying
- network BIO. This is typically an OS socket handle, though custom BIOs could
- choose to implement their own custom poll descriptor format.
- .PP
- Broadly, an application which wishes to manage its own event loop should
- interact with the SSL object as follows:
- .IP \(bu 4
- It should provide read and write BIOs with nonblocking datagram semantics to
- the SSL object using \fBSSL_set0_rbio\fR\|(3) and \fBSSL_set0_wbio\fR\|(3). This could be
- a BIO abstracting a network socket such as \fBBIO_s_datagram\fR\|(3), or a BIO
- abstracting some kind of memory buffer such as \fBBIO_s_dgram_pair\fR\|(3). Use of a
- custom BIO is also possible.
- .IP \(bu 4
- It should configure the SSL object into nonblocking mode by calling
- \&\fBSSL_set_blocking_mode\fR\|(3).
- .IP \(bu 4
- It should configure the SSL object as desired, set an initial peer as needed
- using \fBSSL_set1_initial_peer_addr\fR\|(3), and trigger the connection process by
- calling \fBSSL_connect\fR\|(3).
- .IP \(bu 4
- If the network read and write BIOs provided were pollable (for example,
- a \fBBIO_s_datagram\fR\|(3), or a custom BIO which implements
- \&\fBBIO_get_rpoll_descriptor\fR\|(3) and \fBBIO_get_wpoll_descriptor\fR\|(3)), it should
- perform the following steps repeatedly:
- .RS 4
- .IP \(bu 4
- The application should call \fBSSL_get_rpoll_descriptor\fR\|(3) and
- \&\fBSSL_get_wpoll_descriptor\fR\|(3) to identify OS resources which can be used for
- synchronisation.
- .IP \(bu 4
- It should call \fBSSL_net_read_desired\fR\|(3) and \fBSSL_net_write_desired\fR\|(3) to determine
- whether the QUIC implementation is currently interested in readability and
- writability events on the underlying network BIO which was provided, and call
- \&\fBSSL_get_event_timeout\fR\|(3) to determine if any timeout event will become
- applicable in the future.
- .IP \(bu 4
- It should wait until one of the following events occurs:
- .RS 4
- .IP \(bu 4
- The poll descriptor returned by \fBSSL_get_rpoll_descriptor\fR\|(3) becomes readable
- (if \fBSSL_net_read_desired\fR\|(3) returned 1);
- .IP \(bu 4
- The poll descriptor returned by \fBSSL_get_wpoll_descriptor\fR\|(3) becomes writable
- (if \fBSSL_net_write_desired\fR\|(3) returned 1);
- .IP \(bu 4
- The timeout returned by \fBSSL_get_event_timeout\fR\|(3) (if any) expires.
- .RE
- .RS 4
- .Sp
- Once any of these events occurs, \fBSSL_handle_events\fR\|(3) should be called.
- .RE
- .RE
- .RS 4
- .RE
- .IP \(bu 4
- If the network read and write BIOs provided were not pollable (for example, in
- the case of \fBBIO_s_dgram_pair\fR\|(3)), the application is responsible for managing
- and synchronising network I/O. It should call \fBSSL_handle_events\fR\|(3) after it
- writes data to a \fBBIO_s_dgram_pair\fR\|(3) or otherwise takes action so that the
- QUIC implementation can read new datagrams via a call to \fBBIO_recvmmsg\fR\|(3) on
- the underlying network BIO. The QUIC implementation may output datagrams via a
- call to \fBBIO_sendmmsg\fR\|(3) and the application is responsible for ensuring these
- are transmitted.
- .Sp
- The application must call \fBSSL_get_event_timeout\fR\|(3) after every call to
- \&\fBSSL_handle_events\fR\|(3) (or another I/O function on the SSL object), and ensure
- that a call to \fBSSL_handle_events\fR\|(3) is performed after the specified timeout
- (if any).
- .SH "SEE ALSO"
- .IX Header "SEE ALSO"
- \&\fBSSL_handle_events\fR\|(3), \fBSSL_get_event_timeout\fR\|(3),
- \&\fBSSL_net_read_desired\fR\|(3), \fBSSL_net_write_desired\fR\|(3),
- \&\fBSSL_get_rpoll_descriptor\fR\|(3), \fBSSL_get_wpoll_descriptor\fR\|(3),
- \&\fBSSL_set_blocking_mode\fR\|(3), \fBSSL_shutdown_ex\fR\|(3),
- \&\fBSSL_set1_initial_peer_addr\fR\|(3), \fBSSL_stream_conclude\fR\|(3),
- \&\fBSSL_stream_reset\fR\|(3), \fBSSL_get_stream_read_state\fR\|(3),
- \&\fBSSL_get_stream_read_error_code\fR\|(3), \fBSSL_get_conn_close_info\fR\|(3),
- \&\fBSSL_get0_connection\fR\|(3), \fBSSL_get_stream_type\fR\|(3), \fBSSL_get_stream_id\fR\|(3),
- \&\fBSSL_new_stream\fR\|(3), \fBSSL_accept_stream\fR\|(3),
- \&\fBSSL_set_incoming_stream_policy\fR\|(3), \fBSSL_set_default_stream_mode\fR\|(3)
- .SH COPYRIGHT
- .IX Header "COPYRIGHT"
- Copyright 2022\-2023 The OpenSSL Project Authors. All Rights Reserved.
- .PP
- Licensed under the Apache License 2.0 (the "License"). You may not use
- this file except in compliance with the License. You can obtain a copy
- in the file LICENSE in the source distribution or at
- <https://www.openssl.org/source/license.html>.
|