1#include <vanetza/common/its_aid.hpp>
2#include <vanetza/common/position_provider.hpp>
3#include <vanetza/security/sign_service.hpp>
4#include <vanetza/security/v2/certificate.hpp>
5#include <vanetza/security/v2/certificate_provider.hpp>
6#include <vanetza/security/v2/sign_header_policy.hpp>
16DefaultSignHeaderPolicy::DefaultSignHeaderPolicy(
const Runtime& rt, PositionProvider& positioning) :
17 m_runtime(rt), m_positioning(positioning), m_cam_next_certificate(m_runtime.now()), m_cert_requested(false), m_chain_requested(false)
23 std::list<HeaderField> header_fields;
25 header_fields.push_back(convert_time64(m_runtime.now()));
26 header_fields.push_back(
IntX(request.its_aid));
28 if (request.its_aid == aid::CA) {
30 if (m_chain_requested) {
31 std::list<Certificate> full_chain;
32 full_chain.splice(full_chain.end(), certificate_provider.
own_chain());
34 header_fields.push_back(SignerInfo { std::move(full_chain) });
35 m_cam_next_certificate = m_runtime.now() + std::chrono::seconds(1);
36 }
else if (m_runtime.now() < m_cam_next_certificate && !m_cert_requested) {
37 header_fields.push_back(SignerInfo { calculate_hash(certificate_provider.
own_certificate()) });
39 header_fields.push_back(SignerInfo { certificate_provider.
own_certificate() });
40 m_cam_next_certificate = m_runtime.now() + std::chrono::seconds(1);
43 if (m_unknown_certificates.size() > 0) {
44 std::list<HashedId3> unknown_certificates(m_unknown_certificates.begin(), m_unknown_certificates.end());
45 header_fields.push_back(unknown_certificates);
46 m_unknown_certificates.clear();
49 m_cert_requested =
false;
50 m_chain_requested =
false;
52 auto position = m_positioning.position_fix();
53 if (position.altitude) {
54 header_fields.push_back(
ThreeDLocation(position.latitude, position.longitude, to_elevation(position.altitude->value())));
56 header_fields.push_back(
ThreeDLocation(position.latitude, position.longitude));
58 header_fields.push_back(SignerInfo { certificate_provider.
own_certificate() });
62 header_fields.sort([](
const HeaderField& a,
const HeaderField& b) {
63 const HeaderFieldType type_a = get_type(a);
64 const HeaderFieldType type_b = get_type(b);
67 if (type_a == HeaderFieldType::Signer_Info) {
69 return type_b != HeaderFieldType::Signer_Info;
70 }
else if (type_b == HeaderFieldType::Signer_Info) {
75 using enum_int = std::underlying_type<HeaderFieldType>::type;
76 return static_cast<enum_int
>(type_a) <
static_cast<enum_int
>(type_b);
82void DefaultSignHeaderPolicy::request_unrecognized_certificate(HashedId8
id)
84 m_unknown_certificates.insert(truncate(
id));
87void DefaultSignHeaderPolicy::request_certificate()
89 m_cert_requested =
true;
92void DefaultSignHeaderPolicy::request_certificate_chain()
94 m_chain_requested =
true;
virtual const Certificate & own_certificate()=0
virtual std::list< Certificate > own_chain()=0
IntX specified in TS 103 097 v1.2.1, section 4.2.1.
ThreeDLocation specified in TS 103 097 v1.2.1, section 4.2.19.