1#include <vanetza/security/pqc/hybrid_certificate_validator.hpp>
2#include <vanetza/security/pqc/hybrid_certificate.hpp>
3#include <vanetza/security/backend.hpp>
4#include <vanetza/security/v3/certificate.hpp>
5#include <vanetza/security/v3/issuer_lookup.hpp>
6#include <vanetza/security/v3/trust_store.hpp>
19 if (policy_verdict != Verdict::Valid) {
20 return policy_verdict;
22 if (!m_issuer_lookup || !m_trust_store || !m_ecc_backend ||
23 (m_verification_policy != VerificationPolicy::ClassicalOnly && !m_pqc_backend)) {
24 return Verdict::Misconfiguration;
26 return chain_is_authentic(certificate) ? Verdict::Valid : Verdict::Untrusted;
31 m_policy_validator.use_runtime(runtime);
36 m_policy_validator.use_position_provider(provider);
41 m_issuer_lookup = lookup;
42 m_policy_validator.use_issuer_lookup(lookup);
47 m_policy_validator.use_location_checker(checker);
52 m_policy_validator.use_revocation_lookup(lookup);
57 m_trust_store = store;
58 m_policy_validator.use_trust_store(store);
65 m_pqc_backend = pqc_backend;
70 m_verification_policy = policy;
75 m_policy_validator.disable_time_checks(disable);
80 m_policy_validator.disable_location_checks(disable);
85 m_policy_validator.disable_chain_consistency_checks(disable);
90 m_policy_validator.disable_region_consistency_checks(disable);
96 if (m_verification_policy == VerificationPolicy::ClassicalOnly) {
100 const auto state = alternative_material_state(subject);
101 if (state == MaterialState::Inconsistent) {
104 if (state == MaterialState::None) {
105 return m_verification_policy == VerificationPolicy::HybridIfPresent;
108 return m_pqc_backend && verify_alternative_certificate(
109 subject, issuer, *m_ecc_backend, *m_pqc_backend);
115 constexpr int maximum_chain_depth = 8;
118 for (
int depth = 0; depth < maximum_chain_depth; ++depth) {
121 if (!root_digest || m_trust_store->lookup(*root_digest).empty()) {
124 return verify_primary_certificate(*subject,
nullptr, *m_ecc_backend) &&
125 alternative_signature_is_accepted(*subject,
nullptr);
129 if (!expected_issuer_digest) {
137 if (!actual_issuer_digest || *actual_issuer_digest != *expected_issuer_digest) {
141 if (!verify_primary_certificate(*subject, issuer, *m_ecc_backend) ||
142 !alternative_signature_is_accepted(*subject, issuer)) {
Verdict valid_for_signing(const v3::CertificateView &, ItsAid) override
bool issuer_is_self() const
boost::optional< HashedId8 > calculate_digest() const
boost::optional< HashedId8 > issuer_digest() const
Verdict valid_for_signing(const CertificateView &, ItsAid) override
virtual const Certificate * find_issuer(const HashedId8 &digest) const =0