1#include <vanetza/security/v2/certificate_cache.hpp>
11CertificateCache::CertificateCache(
const Runtime& rt) : m_runtime(rt)
17 const HashedId8
id = calculate_hash(certificate);
20 std::list<Certificate> certs = lookup(
id, certificate.subject_info.subject_type);
24 const auto binary_insert = convert_for_signing(certificate);
25 for (
auto& cert : certs) {
26 const auto binary_found = convert_for_signing(cert);
27 if (binary_insert == binary_found) {
33 Clock::duration lifetime = Clock::duration::zero();
34 if (certificate.subject_info.subject_type == SubjectType::Authorization_Ticket) {
38 lifetime = std::chrono::seconds(2);
39 }
else if (certificate.subject_info.subject_type == SubjectType::Authorization_Authority) {
43 lifetime = std::chrono::seconds(3600);
46 if (lifetime > Clock::duration::zero()) {
48 entry.certificate = certificate;
49 map_type::iterator stored = m_certificates.emplace(
id, entry);
50 heap_type::handle_type& handle = stored->second.handle;
51 handle = m_expiries.push(
Expiry { m_runtime.now() + lifetime, stored });
55std::list<Certificate> CertificateCache::lookup(
const HashedId8&
id, SubjectType type)
59 using iterator = std::multimap<HashedId8, CachedCertificate>::iterator;
60 std::pair<iterator, iterator> range = m_certificates.equal_range(
id);
62 std::list<Certificate> matches;
63 for (
auto item = range.first; item != range.second; ++item) {
66 auto subject_type = cert.subject_info.subject_type;
67 if (subject_type != type) {
71 matches.push_back(cert);
74 if (subject_type == SubjectType::Authorization_Ticket) {
75 refresh(item->second.handle, std::chrono::seconds(2));
76 }
else if (subject_type == SubjectType::Authorization_Authority) {
77 refresh(item->second.handle, std::chrono::seconds(3600));
84void CertificateCache::drop_expired()
86 while (!m_expiries.empty() && is_expired(m_expiries.top())) {
87 m_certificates.erase(m_expiries.top().certificate);
92bool CertificateCache::is_expired(
const Expiry& expiry)
const
94 return m_runtime.now() > expiry;
97void CertificateCache::refresh(heap_type::handle_type& handle, Clock::duration lifetime)
99 static_cast<Clock::time_point&
>(*handle) = m_runtime.now() + lifetime;
100 m_expiries.update(handle);
103CertificateCache::Expiry::Expiry(Clock::time_point expiry, map_type::iterator it) :
104 Clock::time_point(expiry), certificate(it)
described in TS 103 097 v1.2.1 (2015-06), section 6.1