blob: e891057507f7cb4f8b96c9ad42cc8f96e3e7b506 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/cert/require_ct_delegate.h"
namespace net {
// static
ct::CTRequirementsStatus RequireCTDelegate::CheckCTRequirements(
const RequireCTDelegate* delegate,
std::string_view host,
bool is_issued_by_known_root,
const std::vector<SHA256HashValue>& public_key_hashes,
const X509Certificate* validated_certificate_chain,
ct::CTPolicyCompliance policy_compliance) {
// CT is not required if the certificate does not chain to a publicly
// trusted root certificate.
if (!is_issued_by_known_root) {
return ct::CTRequirementsStatus::CT_NOT_REQUIRED;
}
// A connection is considered compliant if it has sufficient SCTs or if the
// build is outdated. Other statuses are not considered compliant; this
// includes COMPLIANCE_DETAILS_NOT_AVAILABLE because compliance must have been
// evaluated in order to determine that the connection is compliant.
bool complies =
(policy_compliance ==
ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS ||
policy_compliance == ct::CTPolicyCompliance::CT_POLICY_BUILD_NOT_TIMELY);
CTRequirementLevel ct_required = CTRequirementLevel::NOT_REQUIRED;
if (delegate) {
// Allow the delegate to override the CT requirement state.
ct_required = delegate->IsCTRequiredForHost(
host, validated_certificate_chain, public_key_hashes);
}
switch (ct_required) {
case CTRequirementLevel::REQUIRED:
return complies ? ct::CTRequirementsStatus::CT_REQUIREMENTS_MET
: ct::CTRequirementsStatus::CT_REQUIREMENTS_NOT_MET;
case CTRequirementLevel::NOT_REQUIRED:
return ct::CTRequirementsStatus::CT_NOT_REQUIRED;
}
}
} // namespace net