| 1 | /*! |
| 2 | |
| 3 | The below list reflects the support provided with the default crate features. |
| 4 | Items marked with an asterisk `*` can be extended or altered via public |
| 5 | APIs ([`CryptoProvider`] for example). |
| 6 | |
| 7 | [`CryptoProvider`]: crate::crypto::CryptoProvider |
| 8 | |
| 9 | ## Current features |
| 10 | |
| 11 | * TLS1.2 and TLS1.3 |
| 12 | * ECDSA, Ed25519 or RSA server authentication by clients `*` |
| 13 | * ECDSA, Ed25519[^1] or RSA server authentication by servers `*` |
| 14 | * Forward secrecy using ECDHE; with curve25519, nistp256 or nistp384 curves `*` |
| 15 | * Post-quantum hybrid key exchange with [X25519MLKEM768](https://datatracker.ietf.org/doc/draft-ietf-tls-ecdhe-mlkem/) [^2] `*` |
| 16 | * AES128-GCM and AES256-GCM bulk encryption, with safe nonces `*` |
| 17 | * ChaCha20-Poly1305 bulk encryption ([RFC7905](https://tools.ietf.org/html/rfc7905)) `*` |
| 18 | * ALPN support |
| 19 | * SNI support |
| 20 | * Tunable fragment size to make TLS messages match size of underlying transport |
| 21 | * Optional use of vectored IO to minimise system calls |
| 22 | * TLS1.2 session resumption |
| 23 | * TLS1.2 resumption via tickets ([RFC5077](https://tools.ietf.org/html/rfc5077)) |
| 24 | * TLS1.3 resumption via tickets or session storage |
| 25 | * TLS1.3 0-RTT data |
| 26 | * Server and optional client authentication |
| 27 | * Extended master secret support ([RFC7627](https://tools.ietf.org/html/rfc7627)) |
| 28 | * Exporters ([RFC5705](https://tools.ietf.org/html/rfc5705)) |
| 29 | * OCSP stapling by servers |
| 30 | * [RFC7250](https://tools.ietf.org/html/rfc7250) raw public keys for TLS1.3 |
| 31 | * [RFC8879](https://tools.ietf.org/html/rfc8879) certificate compression by clients |
| 32 | and servers `*` |
| 33 | * Client-side Encrypted client hello (ECH) |
| 34 | ([draft-ietf-tls-esni](https://datatracker.ietf.org/doc/draft-ietf-tls-esni/)). |
| 35 | |
| 36 | [^1]: Note that, at the time of writing, Ed25519 does not have wide support |
| 37 | in browsers. It is also not supported by the WebPKI, because the |
| 38 | CA/Browser Forum Baseline Requirements do not support it for publicly |
| 39 | trusted certificates. |
| 40 | [^2]: See [the documentation][crate::manual::_05_defaults#about-the-post-quantum-secure-key-exchange-x25519mlkem768] |
| 41 | |
| 42 | ## Non-features |
| 43 | |
| 44 | For reasons explained in the other sections of this manual, rustls does not |
| 45 | and will not support: |
| 46 | |
| 47 | * SSL1, SSL2, SSL3, TLS1 or TLS1.1 |
| 48 | * RC4 |
| 49 | * DES or triple DES |
| 50 | * EXPORT ciphersuites |
| 51 | * MAC-then-encrypt ciphersuites |
| 52 | * Ciphersuites without forward secrecy |
| 53 | * Renegotiation |
| 54 | * Kerberos |
| 55 | * TLS 1.2 protocol compression |
| 56 | * Discrete-log Diffie-Hellman `*` |
| 57 | * Automatic protocol version downgrade |
| 58 | * Using CA certificates directly to authenticate a server/client (often called "self-signed |
| 59 | certificates"). _Rustls' default certificate verifier does not support using a trust anchor as |
| 60 | both a CA certificate and an end-entity certificate in order to limit complexity and risk in |
| 61 | path building. While dangerous, all authentication can be turned off if required -- |
| 62 | see the [example code](https://github.com/rustls/rustls/blob/v/0.23.23/examples/src/bin/tlsclient-mio.rs#L338)_ `*` |
| 63 | |
| 64 | ### About "custom extensions" |
| 65 | |
| 66 | OpenSSL allows an application to add arbitrary TLS extensions (via |
| 67 | the `SSL_CTX_add_custom_ext` function and associated APIs). We don't |
| 68 | support this, with the following rationale: |
| 69 | |
| 70 | Such an API is limited to extensions that are quite narrow in scope: |
| 71 | they cannot change the meaning of standard messages, or introduce new |
| 72 | messages, or make any changes to the connection's cryptography. |
| 73 | |
| 74 | However, there is no reasonable way to technically limit that API to |
| 75 | that set of extensions. That makes the API pretty unsafe (in the |
| 76 | TLS and cryptography sense, not memory safety sense). This could |
| 77 | cause security or interop failures. |
| 78 | |
| 79 | Instead, we suggest that potential users of that API consider: |
| 80 | |
| 81 | - whether their use can fit in standard extensions such as ALPN, |
| 82 | or [ALPS][alps][^3]. |
| 83 | - if not, whether they can fit in a more general extension, and define |
| 84 | and standardize that in the [IETF TLSWG][tlswg]. |
| 85 | |
| 86 | Note the above is not a guarantee or offer that rustls will implement |
| 87 | any specific extensions that are standardized by the IETF TLSWG. |
| 88 | It is a non-goal of this project to implement absolutely everything. |
| 89 | |
| 90 | For experimentation and pre-standardization testing, we suggest |
| 91 | forking rustls. |
| 92 | |
| 93 | See also: [Go's position on such an API][golang]. |
| 94 | |
| 95 | [alps]: https://datatracker.ietf.org/doc/html/draft-vvv-tls-alps |
| 96 | [golang]: https://github.com/golang/go/issues/51497 |
| 97 | [tlswg]: https://datatracker.ietf.org/wg/tls/charter/ |
| 98 | [^3]: rustls does not currently implement ALPS, but it is something we |
| 99 | would consider once standardised and deployed. |
| 100 | */ |
| 101 | |