--- /dev/null
+/* Here are the TLS1.3 ciphers. Note that we don't have XCIPHER instances
+ * here, since we don't want to ever fake them.
+ *
+ * This matches Firefox's list:
+ * https://searchfox.org/mozilla-central/source/security/nss/lib/ssl/ssl3con.c#100
+ */
+#ifdef TLS1_3_RFC_AES_128_GCM_SHA256
+ CIPHER(0x1301, TLS1_3_RFC_AES_128_GCM_SHA256)
+#endif
+#ifdef TLS1_3_RFC_CHACHA20_POLY1305_SHA256
+ CIPHER(0x1303, TLS1_3_RFC_CHACHA20_POLY1305_SHA256)
+#endif
+#ifdef TLS1_3_RFC_AES_256_GCM_SHA384
+ CIPHER(0x1302, TLS1_3_RFC_AES_256_GCM_SHA384)
+#endif
# ADD_C_FILE: INSERT HEADERS HERE.
noinst_HEADERS += \
src/lib/tls/ciphers.inc \
+ src/lib/tls/ciphers_v13.inc \
src/lib/tls/buffers_tls.h \
src/lib/tls/nss_countbytes.h \
src/lib/tls/tortls.h \
* of any cipher we say. */
"!SSLv2"
;
+static char CLIENT_CIPHER_LIST_TLSv13[] =
+#ifndef COCCI
+#include "lib/tls/ciphers_v13.inc"
+#endif
+ ""
+ ;
#undef CIPHER
#undef XCIPHER
}
#endif /* defined(SSL_CTRL_SET_MAX_PROTO_VERSION) */
- if (!SSL_set_cipher_list(result->ssl,
- isServer ? SERVER_CIPHER_LIST : CLIENT_CIPHER_LIST)) {
+ /* Contrary to SSL_set_cipher_list(), TLSv1.3 SSL_set_ciphersuites() does NOT
+ * accept the final ':' so we have to strip it out. */
+ size_t TLSv13len = strlen(CLIENT_CIPHER_LIST_TLSv13);
+ if (TLSv13len && CLIENT_CIPHER_LIST_TLSv13[TLSv13len - 1] == ':') {
+ CLIENT_CIPHER_LIST_TLSv13[TLSv13len - 1] = '\0';
+ }
+
+ const bool tls12_ciphers_ok = SSL_set_cipher_list(
+ result->ssl, isServer ? SERVER_CIPHER_LIST : CLIENT_CIPHER_LIST);
+ bool tls13_ciphers_ok = true;
+#ifdef HAVE_SSL_SET_CIPHERSUITES
+ if (!isServer) {
+ tls13_ciphers_ok =
+ SSL_set_ciphersuites(result->ssl, CLIENT_CIPHER_LIST_TLSv13);
+ }
+#endif
+
+ if (!tls12_ciphers_ok || !tls13_ciphers_ok) {
tls_log_errors(NULL, LOG_WARN, LD_NET, "setting ciphers");
#ifdef SSL_set_tlsext_host_name
SSL_set_tlsext_host_name(result->ssl, NULL);