203 lines
8.8 KiB
Markdown
203 lines
8.8 KiB
Markdown
|
QUIC Requirements
|
|||
|
=================
|
|||
|
|
|||
|
There have been various sources of requirements for the OpenSSL QUIC
|
|||
|
implementation. The following sections summarise the requirements obtained from
|
|||
|
each of these sources.
|
|||
|
|
|||
|
Original OMC Requirements
|
|||
|
-------------------------
|
|||
|
|
|||
|
The OMC have specified an initial set of requirements for QUIC as well as other
|
|||
|
requirements for the coming releases. The remainder of this section summarises
|
|||
|
the OMC requirements that were originally
|
|||
|
[posted](https://mta.openssl.org/pipermail/openssl-project/2021-October/002764.html)
|
|||
|
and that were specific to QUIC
|
|||
|
|
|||
|
* The focus for the next releases is QUIC, with the objective of providing a
|
|||
|
fully functional QUIC implementation over a series of releases (2-3).
|
|||
|
|
|||
|
* The current libssl record layer includes support for TLS, DTLS and KTLS. QUIC
|
|||
|
will introduce another variant and there may be more over time. The OMC requires
|
|||
|
a pluggable record layer interface to be implemented to enable this to be less
|
|||
|
intrusive, more maintainable, and to harmonize the existing record layer
|
|||
|
interactions between TLS, DTLS, KTLS and the planned QUIC protocols. The pluggable
|
|||
|
record layer interface will be internal only for MVP and be public in a future
|
|||
|
release.
|
|||
|
|
|||
|
* The application must have the ability to be in control of the event loop without
|
|||
|
requiring callbacks to process the various events. An application must also have
|
|||
|
the ability to operate in “blocking” mode.
|
|||
|
|
|||
|
* The QUIC implementation must include at least one congestion control algorithm.
|
|||
|
The fully functional release will provide the ability to plug in more
|
|||
|
implementations (via a provider).
|
|||
|
|
|||
|
* The minimum viable product (MVP) for the next release is a pluggable record
|
|||
|
layer interface and a single stream QUIC client in the form of s_client that
|
|||
|
does not require significant API changes. In the MVP, interoperability should be
|
|||
|
prioritized over strict standards compliance.
|
|||
|
|
|||
|
* The MVP will not contain a library API for an HTTP/3 implementation (it is a
|
|||
|
non-goal of the initial release). Our expectation is that other libraries will
|
|||
|
be able to use OpenSSL to build an HTTP/3 client on top of OpenSSL for the
|
|||
|
initial release.
|
|||
|
|
|||
|
* Once we have a fully functional QUIC implementation (in a subsequent release),
|
|||
|
it should be possible for external libraries to be able to use the pluggable
|
|||
|
record layer interface and it should offer a stable ABI (via a provider).
|
|||
|
|
|||
|
* The next major release number is intended to be reserved for the fully
|
|||
|
functional QUIC release (this does not imply we expect API breakage to occur as
|
|||
|
part of this activity - we can change major release numbers even if APIs remain
|
|||
|
compatible).
|
|||
|
|
|||
|
* PR#8797 will not be merged and compatibility with the APIs proposed in that PR
|
|||
|
is a non-goal.
|
|||
|
|
|||
|
* We do not plan to place protocol versions themselves in separate providers at
|
|||
|
this stage.
|
|||
|
|
|||
|
* For the MVP a single interop target (i.e. the server implementation list):
|
|||
|
|
|||
|
1. [Cloudfare](https://cloudflare-quic.com/)
|
|||
|
|
|||
|
* Testing against other implementations is not a release requirement for the MVP.
|
|||
|
|
|||
|
### Non-QUIC OpenSSL Requirements
|
|||
|
|
|||
|
In addition to the QUIC requirements, the OMC also required that:
|
|||
|
|
|||
|
* The objective is to have shorter release timeframes, with releases occurring
|
|||
|
every six months.
|
|||
|
|
|||
|
* The platform policy, covering the primary and secondary platforms, should be
|
|||
|
followed. (Note that this includes testing of primary and secondary platforms
|
|||
|
on project CI)
|
|||
|
|
|||
|
OMC Blog post requirements
|
|||
|
--------------------------
|
|||
|
|
|||
|
The OMC additionally published a
|
|||
|
[blog post](https://www.openssl.org/blog/blog/2021/11/25/openssl-update/) which
|
|||
|
also contained some requirements regarding QUIC. Statements from that blog post
|
|||
|
have been extracted, paraphrased and summarised here as requirements:
|
|||
|
|
|||
|
* The objective is to have APIs that allow applications to support any of our
|
|||
|
existing (or future) security protocols and to select between them with minimal
|
|||
|
effort.
|
|||
|
|
|||
|
* In TLS/DTLS each connection represents a single stream and each connection is
|
|||
|
treated separately by our APIs. In the context of QUIC, APIs to be able to
|
|||
|
handle a collection of streams will be necessary for many applications. With the
|
|||
|
objective of being able to select which security protocol is used, APIs that
|
|||
|
encompass that capability for all protocols will need to be added.
|
|||
|
|
|||
|
* The majority of existing applications operate using a single connection (i.e.
|
|||
|
effectively they are single stream in nature) and this fundamental context of
|
|||
|
usage needs to remain simple.
|
|||
|
|
|||
|
* We need to enable the majority of our existing user’s applications to be able
|
|||
|
to work in a QUIC environment while expanding our APIs to enable future
|
|||
|
application usage to support the full capabilities of QUIC.
|
|||
|
|
|||
|
* We will end up with interfaces that allow other QUIC implementations
|
|||
|
(outside of OpenSSL) to be able to use the TLS stack within OpenSSL – however
|
|||
|
that is not the initial focus of the work.
|
|||
|
|
|||
|
* A long term supported core API for external QUIC library implementation usage
|
|||
|
in a future OpenSSL release will be provided.
|
|||
|
|
|||
|
* Make it easy for our users to communicate securely, flexibly and performantly
|
|||
|
using whatever security protocol is most appropriate for the task at hand.
|
|||
|
|
|||
|
* We will provide unified, consistent APIs to our users that work for all types
|
|||
|
of applications ranging from simple single stream clients up to optimised high
|
|||
|
performance servers
|
|||
|
|
|||
|
Additional OTC analysis
|
|||
|
-----------------------
|
|||
|
|
|||
|
An OTC document provided the following analysis.
|
|||
|
|
|||
|
There are different types of application that we need to cater for:
|
|||
|
|
|||
|
* Simple clients that just do basic SSL_read/SSL_write or BIO_read/BIO_write
|
|||
|
interactions. We want to be able to enable them to transfer to using single
|
|||
|
stream QUIC easily. (MVP)
|
|||
|
|
|||
|
* Simple servers that just do basic SSL_read/SSL_write or BIO_read/BIO_write
|
|||
|
interactions. We want to be able to enable them to transfer to using single
|
|||
|
stream QUIC easily. More likely to want to do multi-stream.
|
|||
|
|
|||
|
* High performance applications (primarily server based) using existing libssl
|
|||
|
APIs; using custom network interaction BIOs in order to get the best performance
|
|||
|
at a network level as well as OS interactions (IO handling, thread handling,
|
|||
|
using fibres). Would prefer to use the existing APIs - they don’t want to throw
|
|||
|
away what they’ve got. Where QUIC necessitates a change they would be willing to
|
|||
|
make minor changes.
|
|||
|
|
|||
|
* New applications. Would be willing to use new APIs to achieve their goals.
|
|||
|
|
|||
|
Other requirements
|
|||
|
------------------
|
|||
|
|
|||
|
The following section summarises requirements obtained from other sources and
|
|||
|
discussions.
|
|||
|
|
|||
|
* The differences between QUIC, TLS, DTLS etc, should be minimised at an API
|
|||
|
level - the structure of the application should be the same. At runtime
|
|||
|
applications should be able to pick whatever protocol they want to use
|
|||
|
|
|||
|
* It shouldn’t be harder to do single stream just because multi stream as a
|
|||
|
concept exists.
|
|||
|
|
|||
|
* It shouldn’t be harder to do TLS just because you have the ability to do DTLS
|
|||
|
or QUIC.
|
|||
|
|
|||
|
* Application authors will need good documentation, demos, examples etc.
|
|||
|
|
|||
|
* QUIC performance should be comparable (in some future release - not MVP) with
|
|||
|
other major implementations and measured by a) handshakes per second
|
|||
|
b) application data throughput (bytes per second) for a single stream/connection
|
|||
|
|
|||
|
* The internal architecture should allow for the fact that we may want to
|
|||
|
support "single copy" APIs in the future:
|
|||
|
|
|||
|
A single copy API would make it possible for application data being sent or
|
|||
|
received via QUIC to only be copied from one buffer to another once. The
|
|||
|
"single" copy allowed is to allow for the implicit copy in an encrypt or decrypt
|
|||
|
operation.
|
|||
|
|
|||
|
Single copy for sending data occurs when the application supplies a buffer of
|
|||
|
data to be sent. No copies of that data are made until it is encrypted. Once
|
|||
|
encrypted no further copies of the encrypted data are made until it is provided
|
|||
|
to the kernel for sending via a system call.
|
|||
|
|
|||
|
Single copy for receiving data occurs when a library supplied buffer is filled
|
|||
|
by the kernel via a system call from the socket. No further copies of that data
|
|||
|
are made until it is decrypted. It is decrypted directly into a buffer made
|
|||
|
available to (or supplied by) the application with no further internal copies
|
|||
|
made.
|
|||
|
|
|||
|
MVP Requirements (3.2)
|
|||
|
----------------------
|
|||
|
|
|||
|
This section summarises those requirements from the above that are specific to
|
|||
|
the MVP.
|
|||
|
|
|||
|
* a pluggable record layer (not public for MVP)
|
|||
|
|
|||
|
* a single stream QUIC client in the form of s_client that does not require
|
|||
|
significant API changes.
|
|||
|
|
|||
|
* interoperability should be prioritized over strict standards compliance.
|
|||
|
|
|||
|
* Single interop target for testing (cloudflare)
|
|||
|
|
|||
|
* Testing against other implementations is not a release requirement for the MVP.
|
|||
|
|
|||
|
* Support simple clients that just do basic SSL_read/SSL_write or BIO_read/BIO_write
|
|||
|
interactions. We want to be able to enable them to transfer to using single
|
|||
|
stream QUIC easily. (MVP)
|