123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- /*
- * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License").
- * You may not use this file except in compliance with the License.
- * A copy of the License is located at
- *
- * http://aws.amazon.com/apache2.0
- *
- * or in the "license" file accompanying this file. This file is distributed
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
- #include "tls/s2n_tls13.h"
- #include "api/s2n.h"
- #include "crypto/s2n_rsa_pss.h"
- #include "crypto/s2n_rsa_signing.h"
- #include "tls/s2n_tls.h"
- bool s2n_use_default_tls13_config_flag = false;
- bool s2n_use_default_tls13_config()
- {
- return s2n_use_default_tls13_config_flag;
- }
- bool s2n_is_tls13_fully_supported()
- {
- /* Older versions of Openssl (eg 1.0.2) do not support RSA PSS, which is required for TLS 1.3. */
- return s2n_is_rsa_pss_signing_supported() && s2n_is_rsa_pss_certs_supported();
- }
- int s2n_get_highest_fully_supported_tls_version()
- {
- return s2n_is_tls13_fully_supported() ? S2N_TLS13 : S2N_TLS12;
- }
- /* Allow TLS1.3 to be negotiated, and use the default TLS1.3 security policy.
- * This is NOT the default behavior, and this method is deprecated.
- *
- * Please consider using the default behavior and configuring
- * TLS1.2/TLS1.3 via explicit security policy instead.
- */
- int s2n_enable_tls13()
- {
- return s2n_enable_tls13_in_test();
- }
- /* Allow TLS1.3 to be negotiated, and use the default TLS1.3 security policy.
- * This is NOT the default behavior, and this method is deprecated.
- *
- * Please consider using the default behavior and configuring
- * TLS1.2/TLS1.3 via explicit security policy instead.
- */
- int s2n_enable_tls13_in_test()
- {
- s2n_highest_protocol_version = S2N_TLS13;
- s2n_use_default_tls13_config_flag = true;
- return S2N_SUCCESS;
- }
- /* Do NOT allow TLS1.3 to be negotiated, regardless of security policy.
- * This is NOT the default behavior, and this method is deprecated.
- *
- * Please consider using the default behavior and configuring
- * TLS1.2/TLS1.3 via explicit security policy instead.
- */
- int s2n_disable_tls13_in_test()
- {
- POSIX_ENSURE(s2n_in_unit_test(), S2N_ERR_NOT_IN_UNIT_TEST);
- s2n_highest_protocol_version = S2N_TLS12;
- s2n_use_default_tls13_config_flag = false;
- return S2N_SUCCESS;
- }
- /* Reset S2N to the default protocol version behavior.
- *
- * This method is intended for use in existing unit tests when the APIs
- * to enable/disable TLS1.3 have already been called.
- */
- int s2n_reset_tls13_in_test()
- {
- POSIX_ENSURE(s2n_in_unit_test(), S2N_ERR_NOT_IN_UNIT_TEST);
- s2n_highest_protocol_version = S2N_TLS13;
- s2n_use_default_tls13_config_flag = false;
- return S2N_SUCCESS;
- }
- /* Returns whether a uint16 iana value is a valid TLS 1.3 cipher suite */
- bool s2n_is_valid_tls13_cipher(const uint8_t version[2])
- {
- /* Valid TLS 1.3 Ciphers are
- * 0x1301, 0x1302, 0x1303, 0x1304, 0x1305.
- * (https://tools.ietf.org/html/rfc8446#appendix-B.4)
- */
- return version[0] == 0x13 && version[1] >= 0x01 && version[1] <= 0x05;
- }
- /* Use middlebox compatibility mode for TLS1.3 by default.
- * For now, only disable it when QUIC support is enabled.
- */
- bool s2n_is_middlebox_compat_enabled(struct s2n_connection *conn)
- {
- return s2n_connection_get_protocol_version(conn) >= S2N_TLS13
- && !s2n_connection_is_quic_enabled(conn);
- }
- S2N_RESULT s2n_connection_validate_tls13_support(struct s2n_connection *conn)
- {
- RESULT_ENSURE_REF(conn);
- /* If the underlying libcrypto supports all features of TLS1.3
- * (including RSA-PSS, which is unsupported by some libraries),
- * then we can always support TLS1.3.
- */
- if (s2n_is_tls13_fully_supported()) {
- return S2N_RESULT_OK;
- }
- /*
- * If the underlying libcrypto doesn't support all features...
- */
- /* There are some TLS servers in the wild that will choose options not offered by the client.
- * So a server might choose to use RSA-PSS even if even if the client does not advertise support for RSA-PSS.
- * Therefore, only servers can perform TLS1.3 without full feature support.
- */
- RESULT_ENSURE(conn->mode == S2N_SERVER, S2N_ERR_RSA_PSS_NOT_SUPPORTED);
- /* RSA signatures must use RSA-PSS in TLS1.3.
- * So RSA-PSS is required for TLS1.3 servers if an RSA certificate is used.
- */
- RESULT_ENSURE(!conn->config->is_rsa_cert_configured, S2N_ERR_RSA_PSS_NOT_SUPPORTED);
- /* RSA-PSS is also required for TLS1.3 servers if client auth is requested, because the
- * client might offer an RSA certificate.
- */
- s2n_cert_auth_type client_auth_status = S2N_CERT_AUTH_NONE;
- RESULT_GUARD_POSIX(s2n_connection_get_client_auth_type(conn, &client_auth_status));
- RESULT_ENSURE(client_auth_status == S2N_CERT_AUTH_NONE, S2N_ERR_RSA_PSS_NOT_SUPPORTED);
- return S2N_RESULT_OK;
- }
- bool s2n_connection_supports_tls13(struct s2n_connection *conn)
- {
- return s2n_result_is_ok(s2n_connection_validate_tls13_support(conn));
- }
|