1#include <vanetza/common/its_aid.hpp>
4#include <vanetza/security/v2/naive_certificate_provider.hpp>
16NaiveCertificateProvider::NaiveCertificateProvider(
const Runtime& rt) :
18 m_own_key_pair(m_crypto_backend.generate_key_pair()),
19 m_own_certificate(generate_authorization_ticket()) { }
24 for (
auto& validity_restriction : m_own_certificate.validity_restriction) {
25 auto start_and_end = boost::get<StartAndEndValidity>(&validity_restriction);
26 auto renewal_deadline = convert_time32(m_runtime.now() + std::chrono::hours(1));
27 if (start_and_end && start_and_end->end_validity < renewal_deadline) {
28 m_own_certificate = generate_authorization_ticket();
33 return m_own_certificate;
36std::list<Certificate> NaiveCertificateProvider::own_chain()
38 static const std::list<Certificate> chain = { aa_certificate() };
45 return m_own_key_pair.private_key;
50 static const ecdsa256::KeyPair aa_key_pair = m_crypto_backend.generate_key_pair();
57 static const ecdsa256::KeyPair root_key_pair = m_crypto_backend.generate_key_pair();
64 static const std::string aa_subject(
"Naive Authorization CA");
65 static const Certificate aa_certificate = generate_aa_certificate(aa_subject);
67 return aa_certificate;
70const Certificate& NaiveCertificateProvider::root_certificate()
72 static const std::string root_subject(
"Naive Root CA");
73 static const Certificate root_certificate = generate_root_certificate(root_subject);
75 return root_certificate;
78Certificate NaiveCertificateProvider::generate_authorization_ticket()
84 certificate.signer_info = calculate_hash(aa_certificate());
87 certificate.subject_info.subject_type = SubjectType::Authorization_Ticket;
94 certificate.
add_permission(aid::DEN, ByteBuffer({ 1, 0xff, 0xff, 0xff}));
102 coordinates.x.assign(m_own_key_pair.public_key.x.begin(), m_own_key_pair.public_key.x.end());
103 coordinates.y.assign(m_own_key_pair.public_key.y.begin(), m_own_key_pair.public_key.y.end());
104 EccPoint ecc_point = coordinates;
106 ecdsa.public_key = ecc_point;
108 verification_key.key = ecdsa;
109 certificate.subject_attributes.push_back(verification_key);
114 start_and_end.start_validity = convert_time32(m_runtime.now() - std::chrono::hours(1));
115 start_and_end.end_validity = convert_time32(m_runtime.now() + std::chrono::hours(23));
116 certificate.validity_restriction.push_back(start_and_end);
118 sign_authorization_ticket(certificate);
123void NaiveCertificateProvider::sign_authorization_ticket(
Certificate& certificate)
127 ByteBuffer data_buffer = convert_for_signing(certificate);
128 certificate.signature = m_crypto_backend.sign_data(aa_key_pair().private_key, data_buffer);
131Certificate NaiveCertificateProvider::generate_aa_certificate(
const std::string& subject_name)
137 certificate.signer_info = calculate_hash(root_certificate());
140 certificate.subject_info.subject_type = SubjectType::Authorization_Authority;
143 std::vector<unsigned char> subject(subject_name.begin(), subject_name.end());
144 certificate.subject_info.subject_name = subject;
158 coordinates.x.assign(aa_key_pair().public_key.x.begin(), aa_key_pair().public_key.x.end());
159 coordinates.y.assign(aa_key_pair().public_key.y.begin(), aa_key_pair().public_key.y.end());
160 EccPoint ecc_point = coordinates;
162 ecdsa.public_key = ecc_point;
164 verification_key.key = ecdsa;
165 certificate.subject_attributes.push_back(verification_key);
170 start_and_end.start_validity = convert_time32(m_runtime.now() - std::chrono::hours(1));
171 start_and_end.end_validity = convert_time32(m_runtime.now() + std::chrono::hours(23));
172 certificate.validity_restriction.push_back(start_and_end);
177 ByteBuffer data_buffer = convert_for_signing(certificate);
178 certificate.signature = m_crypto_backend.sign_data(root_key_pair().private_key, data_buffer);
183Certificate NaiveCertificateProvider::generate_root_certificate(
const std::string& subject_name)
189 certificate.signer_info =
nullptr;
192 certificate.subject_info.subject_type = SubjectType::Root_CA;
195 std::vector<unsigned char> subject(subject_name.begin(), subject_name.end());
196 certificate.subject_info.subject_name = subject;
210 coordinates.x.assign(root_key_pair().public_key.x.begin(), root_key_pair().public_key.x.end());
211 coordinates.y.assign(root_key_pair().public_key.y.begin(), root_key_pair().public_key.y.end());
212 EccPoint ecc_point = coordinates;
214 ecdsa.public_key = ecc_point;
216 verification_key.key = ecdsa;
217 certificate.subject_attributes.push_back(verification_key);
222 start_and_end.start_validity = convert_time32(m_runtime.now() - std::chrono::hours(1));
223 start_and_end.end_validity = convert_time32(m_runtime.now() + std::chrono::hours(365 * 24));
224 certificate.validity_restriction.push_back(start_and_end);
229 ByteBuffer data_buffer = convert_for_signing(certificate);
230 certificate.signature = m_crypto_backend.sign_data(root_key_pair().private_key, data_buffer);
Uncompressed specified in TS 103 097 v1.2.1 in section 4.2.5.
described in TS 103 097 v1.2.1 (2015-06), section 6.1
void add_permission(ItsAid aid)
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