in tls/s2n_security_policies.c [1453:1512]
int s2n_security_policies_init()
{
for (int i = 0; security_policy_selection[i].version != NULL; i++) {
const struct s2n_security_policy *security_policy = security_policy_selection[i].security_policy;
POSIX_ENSURE_REF(security_policy);
const struct s2n_cipher_preferences *cipher_preference = security_policy->cipher_preferences;
POSIX_ENSURE_REF(cipher_preference);
const struct s2n_kem_preferences *kem_preference = security_policy->kem_preferences;
POSIX_ENSURE_REF(kem_preference);
const struct s2n_ecc_preferences *ecc_preference = security_policy->ecc_preferences;
POSIX_ENSURE_REF(ecc_preference);
POSIX_GUARD(s2n_check_ecc_preferences_curves_list(ecc_preference));
const struct s2n_signature_preferences *certificate_signature_preference = security_policy->certificate_signature_preferences;
if (certificate_signature_preference != NULL) {
POSIX_GUARD_RESULT(s2n_validate_certificate_signature_preferences(certificate_signature_preference));
}
if (security_policy != &security_policy_null) {
/* All policies must have at least one ecc curve configured. */
S2N_ERROR_IF(ecc_preference->count == 0, S2N_ERR_INVALID_SECURITY_POLICY);
}
for (int j = 0; j < cipher_preference->count; j++) {
struct s2n_cipher_suite *cipher = cipher_preference->suites[j];
POSIX_ENSURE_REF(cipher);
const uint8_t *iana = cipher->iana_value;
if (cipher->minimum_required_tls_version >= S2N_TLS13) {
security_policy_selection[i].supports_tls13 = 1;
}
/* Sanity check that valid tls13 has minimum tls version set correctly */
S2N_ERROR_IF(s2n_is_valid_tls13_cipher(iana) ^ (cipher->minimum_required_tls_version >= S2N_TLS13),
S2N_ERR_INVALID_SECURITY_POLICY);
if (s2n_cipher_suite_requires_ecc_extension(cipher)) {
security_policy_selection[i].ecc_extension_required = 1;
}
if (s2n_cipher_suite_requires_pq_extension(cipher) && kem_preference->kem_count > 0) {
security_policy_selection[i].pq_kem_extension_required = 1;
}
}
POSIX_GUARD(s2n_validate_kem_preferences(kem_preference, security_policy_selection[i].pq_kem_extension_required));
/* Validate that security rules are correctly applied.
* This should be checked by a unit test, but outside of unit tests we
* check again here to cover the case where the unit tests are not run.
*/
if (!s2n_in_unit_test()) {
struct s2n_security_rule_result result = { 0 };
POSIX_GUARD_RESULT(s2n_security_policy_validate_security_rules(security_policy, &result));
POSIX_ENSURE(!result.found_error, S2N_ERR_INVALID_SECURITY_POLICY);
}
}
return 0;
}