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);