A TLS connection is often described as using "a cipher suite", as though the suite were a single choice. It is not. A TLS 1.3 connection simultaneously depends on at least four cryptographic decisions that are negotiated by different mechanisms, carried in different handshake fields, and — the point this paper develops — supplied to OpenSSL through different extension paths. The record layer needs an authenticated encryption algorithm. The key schedule needs a hash function, which also fixes the length of every secret derived during the handshake. The key exchange needs a group. The authentication step needs a signature algorithm matched to the certificate presented.
If an engineer wishes to introduce a new algorithm into this arrangement — a national standard block cipher, a curve mandated by a local regulator, a hash function chosen for migration reasons — the question that matters is not whether the algorithm can be implemented. It is whether the algorithm can be made to participate: advertised in the handshake, selected by negotiation, driven through its lifecycle by the TLS state machine, and agreed upon by a peer that was not modified.
OpenSSL 3 offers a mechanism that appears designed for exactly this. The provider interface
allows a loadable module to supply algorithm implementations that the library will select at run
time by name and by property query, without the application calling the module directly and
without OpenSSL being recompiled. The companion study to this paper demonstrated the mechanism
for a digest, showing that an algorithm supplied by a third-party module can be fetched and used
through the ordinary EVP interface.
Extending that result from a digest to a TLS cipher suite is not a matter of repetition. A digest has one consumer and no negotiation. A cipher suite has a peer.
This paper is a design study of the following capability: a provider that supplies a block cipher in an AEAD mode, an elliptic-curve group, and a hash function, such that these algorithms can be used together in a TLS 1.3 connection.
The study covers:
libssl and libcrypto, which
determines what provider code can and cannot reach (Chapter 5);The study does not cover: QUIC, DTLS, TLS 1.2 and earlier, post-quantum key encapsulation as a subject in its own right, hardware security module integration, or certificate path validation. Each is mentioned where it constrains the design, and each is excluded from the detailed treatment.
An engineer who wants a new algorithm in TLS has, in principle, two options: modify OpenSSL, or extend it. The second is preferable for reasons that are practical rather than aesthetic.
A patched OpenSSL must be maintained against a moving upstream. Every security release requires the patch to be rebased, retested and redeployed, and the patched library is no longer the library that distributions ship, package signatures cover, or auditors have reviewed. For a cryptographic library this is a significant operational cost, and it is paid indefinitely.
A provider, by contrast, is a separate shared object with its own lifecycle. It is loaded by configuration, it can be signed and distributed independently, and — critically — the ABI between the core and the provider is a table of function pointers with a negotiated content, not a struct layout. This is the property that makes the FIPS provider's separate validation lifecycle possible, and it is the same property that makes a third-party algorithm module maintainable.
There is a third consideration specific to cryptography. An organisation that must demonstrate which algorithm implementation was used — for compliance, for incident response, or for an audit — benefits from that implementation being a named, versioned, separately hashed artefact rather than a compile-time configuration of a larger library. The provider model makes the answer to "which code computed this ciphertext?" a question with a filename in it.
The contributions of this paper are:
TLS-GROUP capability,
advertising a signature algorithm through TLS-SIGALG, and registering a cipher
suite. They differ in mechanism and in reach, and the difference determines what a design can
achieve without modifying libssl.Cryptographic engineering papers fail their readers most often by mixing three kinds of statement without marking the difference: what the system definitely does, what the author intends it to do, and what would be true if the design were implemented. This paper marks them explicitly, and the reader should rely on the marking.
Verified. The statement was checked against OpenSSL source on the reference
machine, and a file and line reference is given. The trees examined are
openssl-3.5.8 (build tree present on the reference machine) and the pinned
documentation snapshots at openssl-3.5.5 and OpenSSL_1_1_1g stored
beside this paper. A reader can re-check any such statement without network access.
Design. The statement specifies part of the proposed system. It has not been built or executed as part of this study. Statements of this kind are the substance of Chapters 7–15 and are written in the specification voice ("the provider exposes…", "the context holds…") because that is how a specification reads, not because the artefact exists.
Reported. The statement describes the capability as reported by the author of the system this paper documents — namely, that cipher suites combining block cipher, elliptic-curve and hash algorithms can be added through the provider interface and used in TLS communication. Such statements are attributed at the point of use. They were not independently reproduced in this study, because no implementation was available to this study; Chapter 19 gives the test plan that would establish them.
Appendix D collects every load-bearing claim in the paper into a single table with its status and, where applicable, its source reference. A reader with limited time who wants to know what this paper actually establishes should read Chapter 4, then Appendix D.
All verified statements were checked in the following environment:
OpenSSL runtime OpenSSL 3.5.8 25 Aug 2026 (library: OpenSSL 3.5.8) OpenSSL headers 3.5.8 (libcrypto, libssl via pkg-config) Source tree openssl-3.5.8 (unpacked build tree) Documentation openssl-3.5.5 (pinned), OpenSSL_1_1_1g (pinned) Platform Linux x86_64, AlmaLinux 9.8 Compiler gcc (available; no provider was compiled for this study) Default providers default (active)
The absence of a compiled artefact is deliberate and is stated here so that it is not mistaken for an omission. This is a design study; Chapter 20 lists what an implementation phase would need to produce for the design to be considered validated.
Chapters 2–5 establish the ground: what TLS needs, what a provider is, how the two can meet, and where the boundary between the two OpenSSL libraries falls. Chapter 6 states requirements. Chapters 7–15 are the design proper, moving from the provider's overall shape through each algorithm class to negotiation and the key schedule. Chapters 16–19 evaluate the design against interoperability, security, performance and testability. Chapter 20 concludes and states what remains.
Readers already familiar with the provider architecture may begin at Chapter 4. Readers interested only in what is provably true of stock OpenSSL should read Chapters 4 and 5 and Appendix D.