#pragma once #include #include #include #include namespace vanetza { namespace security { namespace v3 { /** * CertificateCache stores validated v1.3.1 certificates for later lookup. * Required for checking messages' signatures containing only a certificate digest. */ class CertificateCache { public: /** * Lookup certificate based on given digest * \param digest certificate digest * \return certificate matching digest */ const Certificate* lookup(const HashedId8& digest) const; const Certificate* lookup(const HashedId3& digest) const; /** * Store a (pre-validated) certificate in cache * \param cert certificate */ void store(Certificate cert); size_t size() const { return m_storage.size(); } /** * Announce a station with a given certificate digest. * \param digest certificate digest * \return true if digest was not known before */ bool announce(const HashedId8& digest); /** * Test if a certificate digest is already known, i.e. either * its certificate is stored or at least the digest has been announced. * \param digest certificate digest * \return true if digest is known */ bool is_known(const HashedId8& digest) const; private: using CertificateMap = std::unordered_map; using ShortDigestMap = std::unordered_map; // TODO add bounded capacity and automatic removal of expired certificates CertificateMap m_storage; ShortDigestMap m_short_digests; std::unordered_set m_digests; }; } // namespace v3 } // namespace security } // namespace vanetza