#ifndef COMPONENTS_CERTIFICATE_TRANSPARENCY_CHROME_CT_POLICY_ENFORCER_H_
#define COMPONENTS_CERTIFICATE_TRANSPARENCY_CHROME_CT_POLICY_ENFORCER_H_
#include <map>
#include <optional>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
#include "base/component_export.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/time/clock.h"
#include "base/time/time.h"
#include "net/cert/ct_policy_enforcer.h"
#include "services/network/public/mojom/ct_log_info.mojom.h"
namespace certificate_transparency {
struct COMPONENT_EXPORT(CERTIFICATE_TRANSPARENCY) OperatorHistoryEntry {
std::string current_operator;
std::vector<std::pair<std::string, base::Time>> previous_operators;
OperatorHistoryEntry();
~OperatorHistoryEntry();
OperatorHistoryEntry(const OperatorHistoryEntry& other);
};
struct COMPONENT_EXPORT(CERTIFICATE_TRANSPARENCY) LogInfo {
OperatorHistoryEntry operator_history;
network::mojom::CTLogInfo::LogType log_type;
};
class COMPONENT_EXPORT(CERTIFICATE_TRANSPARENCY) ChromeCTPolicyEnforcer
: public net::CTPolicyEnforcer {
public:
ChromeCTPolicyEnforcer(
base::Time log_list_date,
std::vector<std::pair<std::string, base::Time>> disqualified_logs,
std::map<std::string, LogInfo> log_info,
bool enforce_one_rfc6962_ct_policy);
net::ct::CTPolicyCompliance CheckCompliance(
net::X509Certificate* cert,
const net::ct::SCTList& verified_scts,
base::Time current_time,
const net::NetLogWithSource& net_log) const override;
std::optional<base::Time> GetLogDisqualificationTime(
std::string_view log_id) const override;
bool IsCtEnabled() const override;
const std::vector<std::pair<std::string, base::Time>>&
disqualified_logs_for_testing() {
return disqualified_logs_;
}
const std::map<std::string, LogInfo>& log_info_for_testing() const {
return log_info_;
}
protected:
~ChromeCTPolicyEnforcer() override;
private:
FRIEND_TEST_ALL_PREFIXES(ChromeCTPolicyEnforcerTest,
IsLogDisqualifiedTimestamp);
FRIEND_TEST_ALL_PREFIXES(ChromeCTPolicyEnforcerTest,
IsLogDisqualifiedReturnsFalseOnUnknownLog);
bool IsLogDisqualified(std::string_view log_id,
base::Time current_time,
base::Time* disqualification_date) const;
bool IsLogDataTimely(base::Time current_time) const;
net::ct::CTPolicyCompliance CheckCTPolicyCompliance(
const net::X509Certificate& cert,
const net::ct::SCTList& verified_scts,
base::Time current_time) const;
std::string GetOperatorForLog(const std::string& log_id,
base::Time timestamp) const;
network::mojom::CTLogInfo::LogType GetLogType(
const std::string& log_id) const;
const std::vector<std::pair<std::string, base::Time>> disqualified_logs_;
const std::map<std::string, LogInfo> log_info_;
const base::Time log_list_date_;
const bool enforce_one_rfc6962_ct_policy_;
};
}
#endif