Vanetza
 
Loading...
Searching...
No Matches
sign_header_policy.cpp
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>
7#include <list>
8
9namespace vanetza
10{
11namespace security
12{
13namespace v2
14{
15
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)
18{
19}
20
21std::list<HeaderField> DefaultSignHeaderPolicy::prepare_header(const SignRequest& request, CertificateProvider& certificate_provider)
22{
23 std::list<HeaderField> header_fields;
24
25 header_fields.push_back(convert_time64(m_runtime.now()));
26 header_fields.push_back(IntX(request.its_aid));
27
28 if (request.its_aid == aid::CA) {
29 // section 7.1 in TS 103 097 v1.2.1
30 if (m_chain_requested) {
31 std::list<Certificate> full_chain;
32 full_chain.splice(full_chain.end(), certificate_provider.own_chain());
33 full_chain.push_back(certificate_provider.own_certificate());
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()) });
38 } else {
39 header_fields.push_back(SignerInfo { certificate_provider.own_certificate() });
40 m_cam_next_certificate = m_runtime.now() + std::chrono::seconds(1);
41 }
42
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();
47 }
48
49 m_cert_requested = false;
50 m_chain_requested = false;
51 } else {
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())));
55 } else {
56 header_fields.push_back(ThreeDLocation(position.latitude, position.longitude));
57 }
58 header_fields.push_back(SignerInfo { certificate_provider.own_certificate() });
59 }
60
61 // ensure correct serialization order, see TS 103 097 v1.2.1
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);
65
66 // signer_info must be encoded first in all profiles
67 if (type_a == HeaderFieldType::Signer_Info) {
68 // return false if both are signer_info fields
69 return type_b != HeaderFieldType::Signer_Info;
70 } else if (type_b == HeaderFieldType::Signer_Info) {
71 return false; // "signer info" @ b has precedence over "non-signer info" @ a
72 }
73
74 // all other fields must be encoded in ascending order
75 using enum_int = std::underlying_type<HeaderFieldType>::type;
76 return static_cast<enum_int>(type_a) < static_cast<enum_int>(type_b);
77 });
78
79 return header_fields;
80}
81
82void DefaultSignHeaderPolicy::request_unrecognized_certificate(HashedId8 id)
83{
84 m_unknown_certificates.insert(truncate(id));
85}
86
87void DefaultSignHeaderPolicy::request_certificate()
88{
89 m_cert_requested = true;
90}
91
92void DefaultSignHeaderPolicy::request_certificate_chain()
93{
94 m_chain_requested = true;
95}
96
97} // namespace v2
98} // namespace security
99} // namespace vanetza
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.
Definition: int_x.hpp:21
ThreeDLocation specified in TS 103 097 v1.2.1, section 4.2.19.
Definition: region.hpp:21