Vanetza
Loading...
Searching...
No Matches
naive_certificate_provider.cpp
1#include <vanetza/common/its_aid.hpp>
2//#include <vanetza/security/v2/basic_elements.hpp>
3//#include <vanetza/security/v2/ecc_point.hpp>
4#include <vanetza/security/v2/naive_certificate_provider.hpp>
5//#include <vanetza/security/v2/payload.hpp>
6//#include <vanetza/security/v2/secured_message.hpp>
7//#include <vanetza/security/v2/signature.hpp>
8
9namespace vanetza
10{
11namespace security
12{
13namespace v2
14{
15
16NaiveCertificateProvider::NaiveCertificateProvider(const Runtime& rt) :
17 m_crypto_backend(create_backend("default")),
18 m_runtime(rt),
19 m_own_key_pair(m_crypto_backend->generate_key_pair()),
20 m_own_certificate(generate_authorization_ticket()) { }
21
23{
24 // renew certificate if necessary
25 for (auto& validity_restriction : m_own_certificate.validity_restriction) {
26 auto start_and_end = boost::get<StartAndEndValidity>(&validity_restriction);
27 auto renewal_deadline = convert_time32(m_runtime.now() + std::chrono::hours(1));
28 if (start_and_end && start_and_end->end_validity < renewal_deadline) {
29 m_own_certificate = generate_authorization_ticket();
30 break;
31 }
32 }
33
34 return m_own_certificate;
35}
36
38{
39 static const std::list<Certificate> chain = { aa_certificate() };
40
41 return chain;
42}
43
45{
46 return m_own_key_pair.private_key;
47}
48
50{
51 static const ecdsa256::KeyPair aa_key_pair = m_crypto_backend->generate_key_pair();
52
53 return aa_key_pair;
54}
55
57{
58 static const ecdsa256::KeyPair root_key_pair = m_crypto_backend->generate_key_pair();
59
60 return root_key_pair;
61}
62
64{
65 static const std::string aa_subject("Naive Authorization CA");
66 static const Certificate aa_certificate = generate_aa_certificate(aa_subject);
67
68 return aa_certificate;
69}
70
72{
73 static const std::string root_subject("Naive Root CA");
74 static const Certificate root_certificate = generate_root_certificate(root_subject);
75
76 return root_certificate;
77}
78
80{
81 // create certificate
82 Certificate certificate;
83
84 // section 6.1 in TS 103 097 v1.2.1
85 certificate.signer_info = calculate_hash(aa_certificate());
86
87 // section 6.3 in TS 103 097 v1.2.1
88 certificate.subject_info.subject_type = SubjectType::Authorization_Ticket;
89 // section 7.4.2 in TS 103 097 v1.2.1, subject_name implicit empty
90
91 // set assurance level
92 certificate.subject_attributes.push_back(SubjectAssurance(0x00));
93
94 certificate.add_permission(aid::CA, ByteBuffer({ 1, 0, 0 }));
95 certificate.add_permission(aid::DEN, ByteBuffer({ 1, 0xff, 0xff, 0xff}));
96 certificate.add_permission(aid::GN_MGMT, ByteBuffer({})); // required for beacons
97 certificate.add_permission(aid::IPV6_ROUTING, ByteBuffer({})); // required for routing tests
98
99 // section 7.4.1 in TS 103 097 v1.2.1
100 // set subject attributes
101 // set the verification_key
102 Uncompressed coordinates;
103 coordinates.x.assign(m_own_key_pair.public_key.x.begin(), m_own_key_pair.public_key.x.end());
104 coordinates.y.assign(m_own_key_pair.public_key.y.begin(), m_own_key_pair.public_key.y.end());
105 EccPoint ecc_point = coordinates;
107 ecdsa.public_key = ecc_point;
108 VerificationKey verification_key;
109 verification_key.key = ecdsa;
110 certificate.subject_attributes.push_back(verification_key);
111
112 // section 6.7 in TS 103 097 v1.2.1
113 // set validity restriction
114 StartAndEndValidity start_and_end;
115 start_and_end.start_validity = convert_time32(m_runtime.now() - std::chrono::hours(1));
116 start_and_end.end_validity = convert_time32(m_runtime.now() + std::chrono::hours(23));
117 certificate.validity_restriction.push_back(start_and_end);
118
120
121 return certificate;
122}
123
125{
126 sort(certificate);
127
128 ByteBuffer data_buffer = convert_for_signing(certificate);
129 certificate.signature = m_crypto_backend->sign_data(aa_key_pair().private_key, data_buffer);
130}
131
133{
134 // create certificate
135 Certificate certificate;
136
137 // section 6.1 in TS 103 097 v1.2.1
138 certificate.signer_info = calculate_hash(root_certificate());
139
140 // section 6.3 in TS 103 097 v1.2.1
141 certificate.subject_info.subject_type = SubjectType::Authorization_Authority;
142
143 // section 7.4.2 in TS 103 097 v1.2.1
144 std::vector<unsigned char> subject(subject_name.begin(), subject_name.end());
145 certificate.subject_info.subject_name = subject;
146
147 // section 6.6 in TS 103 097 v1.2.1 - levels currently undefined
148 certificate.subject_attributes.push_back(SubjectAssurance(0x00));
149
150 certificate.add_permission(aid::CA);
151 certificate.add_permission(aid::DEN);
152 certificate.add_permission(aid::GN_MGMT); // required for beacons
153 certificate.add_permission(aid::IPV6_ROUTING); // required for routing tests
154
155 // section 7.4.1 in TS 103 097 v1.2.1
156 // set subject attributes
157 // set the verification_key
158 Uncompressed coordinates;
159 coordinates.x.assign(aa_key_pair().public_key.x.begin(), aa_key_pair().public_key.x.end());
160 coordinates.y.assign(aa_key_pair().public_key.y.begin(), aa_key_pair().public_key.y.end());
161 EccPoint ecc_point = coordinates;
163 ecdsa.public_key = ecc_point;
164 VerificationKey verification_key;
165 verification_key.key = ecdsa;
166 certificate.subject_attributes.push_back(verification_key);
167
168 // section 6.7 in TS 103 097 v1.2.1
169 // set validity restriction
170 StartAndEndValidity start_and_end;
171 start_and_end.start_validity = convert_time32(m_runtime.now() - std::chrono::hours(1));
172 start_and_end.end_validity = convert_time32(m_runtime.now() + std::chrono::hours(23));
173 certificate.validity_restriction.push_back(start_and_end);
174
175 sort(certificate);
176
177 // set signature
178 ByteBuffer data_buffer = convert_for_signing(certificate);
179 certificate.signature = m_crypto_backend->sign_data(root_key_pair().private_key, data_buffer);
180
181 return certificate;
182}
183
185{
186 // create certificate
187 Certificate certificate;
188
189 // section 6.1 in TS 103 097 v1.2.1
190 certificate.signer_info = nullptr; /* self */
191
192 // section 6.3 in TS 103 097 v1.2.1
193 certificate.subject_info.subject_type = SubjectType::Root_CA;
194
195 // section 7.4.2 in TS 103 097 v1.2.1
196 std::vector<unsigned char> subject(subject_name.begin(), subject_name.end());
197 certificate.subject_info.subject_name = subject;
198
199 // section 6.6 in TS 103 097 v1.2.1 - levels currently undefined
200 certificate.subject_attributes.push_back(SubjectAssurance(0x00));
201
202 certificate.add_permission(aid::CA);
203 certificate.add_permission(aid::DEN);
204 certificate.add_permission(aid::GN_MGMT); // required for beacons
205 certificate.add_permission(aid::IPV6_ROUTING); // required for routing tests
206
207 // section 7.4.1 in TS 103 097 v1.2.1
208 // set subject attributes
209 // set the verification_key
210 Uncompressed coordinates;
211 coordinates.x.assign(root_key_pair().public_key.x.begin(), root_key_pair().public_key.x.end());
212 coordinates.y.assign(root_key_pair().public_key.y.begin(), root_key_pair().public_key.y.end());
213 EccPoint ecc_point = coordinates;
215 ecdsa.public_key = ecc_point;
216 VerificationKey verification_key;
217 verification_key.key = ecdsa;
218 certificate.subject_attributes.push_back(verification_key);
219
220 // section 6.7 in TS 103 097 v1.2.1
221 // set validity restriction
222 StartAndEndValidity start_and_end;
223 start_and_end.start_validity = convert_time32(m_runtime.now() - std::chrono::hours(1));
224 start_and_end.end_validity = convert_time32(m_runtime.now() + std::chrono::hours(365 * 24));
225 certificate.validity_restriction.push_back(start_and_end);
226
227 sort(certificate);
228
229 // set signature
230 ByteBuffer data_buffer = convert_for_signing(certificate);
231 certificate.signature = m_crypto_backend->sign_data(root_key_pair().private_key, data_buffer);
232
233 return certificate;
234}
235
236} // namespace v2
237} // namespace security
238} // namespace vanetza
const Certificate & own_certificate() override
get own certificate for signing
Certificate generate_authorization_ticket()
generate an authorization ticket
const ecdsa256::KeyPair & aa_key_pair()
get root key (same for all instances)
void sign_authorization_ticket(Certificate &certificate)
sign an authorization ticket
const ecdsa256::KeyPair & root_key_pair()
get root key (same for all instances)
Certificate generate_aa_certificate(const std::string &subject_name)
generate a authorization authority certificate
const ecdsa256::PrivateKey & own_private_key() override
get own private key
const Certificate & aa_certificate()
get ticket signer certificate (same for all instances)
const Certificate & root_certificate()
get root certificate (same for all instances)
Certificate generate_root_certificate(const std::string &subject_name)
generate a root certificate
Uncompressed specified in TS 103 097 v1.2.1 in section 4.2.5.
Definition ecc_point.hpp:36
described in TS 103 097 v1.2.1 (2015-06), section 6.1
void add_permission(ItsAid aid, const ByteBuffer &ssp)
SubjectAssurance specified in TS 103 097 v1.2.1 in section 6.6 and 7.4.1.
VerificationKey specified in TS 103 097 v1.2.1, section 6.4.
ecdsa_nistp256_with_sha256 specified in TS 103 097 v1.2.1, section 4.2.4