103 certificate->issuer.present= Vanetza_Security_IssuerIdentifier_PR_sha256AndDigest;
105 if (maybe_aa_cert_digest) {
106 const HashedId8& aa_cert_digest = *maybe_aa_cert_digest;
107 OCTET_STRING_fromBuf(
108 &(certificate->issuer.choice.sha256AndDigest),
109 reinterpret_cast<
const char *>(aa_cert_digest.data()),
110 aa_cert_digest.size()
115 certificate->toBeSigned.id.present = Vanetza_Security_CertificateId_PR_none;
116 std::vector<uint8_t> craciId(3, 0);
117 OCTET_STRING_fromBuf(
118 &certificate->toBeSigned.cracaId,
119 reinterpret_cast<
const char*>(craciId.data()),
122 certificate->version = 3;
123 certificate->toBeSigned.crlSeries = 0;
126 certificate.add_permission(aid::CA, ByteBuffer({ 1, 0, 0 }));
127 certificate.add_permission(aid::DEN, ByteBuffer({ 1, 0xff, 0xff, 0xff}));
128 certificate.add_permission(aid::GN_MGMT, ByteBuffer({}));
129 certificate.add_permission(aid::IPV6_ROUTING, ByteBuffer({}));
135 coordinates.x.assign(m_own_key_pair.public_key.x.begin(), m_own_key_pair.public_key.x.end());
136 coordinates.y.assign(m_own_key_pair.public_key.y.begin(), m_own_key_pair.public_key.y.end());
137 certificate->toBeSigned.verifyKeyIndicator.present = Vanetza_Security_VerificationKeyIndicator_PR_verificationKey;
138 certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.present = Vanetza_Security_PublicVerificationKey_PR_ecdsaNistP256;
139 certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.choice.ecdsaNistP256.present = Vanetza_Security_EccP256CurvePoint_PR_uncompressedP256;
140 OCTET_STRING_fromBuf(
141 &certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.choice.ecdsaNistP256.choice.uncompressedP256.x,
142 reinterpret_cast<
const char*>(coordinates.x.data()),
145 OCTET_STRING_fromBuf(
146 &certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.choice.ecdsaNistP256.choice.uncompressedP256.y,
147 reinterpret_cast<
const char*>(coordinates.y.data()),
155 certificate->toBeSigned.validityPeriod.start = v2::convert_time32(m_runtime.now() - std::chrono::hours(1));;
156 certificate->toBeSigned.validityPeriod.duration.present = Vanetza_Security_Duration_PR_hours;
157 certificate->toBeSigned.validityPeriod.duration.choice.hours = 23;
177 aa_certificate->issuer.present= Vanetza_Security_IssuerIdentifier_PR_sha256AndDigest;
179 if (maybe_root_cert_digest) {
180 const HashedId8& root_cert_digest = *maybe_root_cert_digest;
181 OCTET_STRING_fromBuf(
182 &(aa_certificate->issuer.choice.sha256AndDigest),
183 reinterpret_cast<
const char *>(root_cert_digest.data()),
184 root_cert_digest.size()
188 aa_certificate->toBeSigned.id.present = Vanetza_Security_CertificateId_PR_name;
189 OCTET_STRING_fromBuf(&aa_certificate->toBeSigned.id.choice.name, name.data(), name.size());
192 static const std::array<
char, 3> craciId { 0, 0, 0 };
193 OCTET_STRING_fromBuf(&aa_certificate->toBeSigned.cracaId, craciId.data(), craciId.size());
194 aa_certificate->version = 3;
195 aa_certificate->toBeSigned.crlSeries = 0;
201 asn1::PsidGroupPermissions* cert_permission_message = asn1::allocate<asn1::PsidGroupPermissions>();
202 cert_permission_message->subjectPermissions.present = Vanetza_Security_SubjectPermissions_PR_explicit;
203 add_psid_group_permission(cert_permission_message,aid::CA,{0x01, 0xff, 0xfc}, {0xff, 0x00, 0x03});
204 add_psid_group_permission(cert_permission_message,aid::DEN,{0x01, 0xff, 0xff, 0xff}, {0xff, 0x00, 0x00, 0x00});
205 add_psid_group_permission(cert_permission_message,aid::TLM,{0x01, 0xe0}, {0xff, 0x1f});
206 add_psid_group_permission(cert_permission_message,aid::RLT,{0x01, 0xc0}, {0xff,0x3f});
207 add_psid_group_permission(cert_permission_message,aid::IVI,{0x01, 0xff, 0xff,0xff,0xff,0xf8}, {0xff,0x00,0x00,0x00,0x00,0x07});
208 add_psid_group_permission(cert_permission_message,aid::TLC_R,{0x02, 0xff, 0xff,0xe0}, {0xff, 0x00, 0x00, 0x1f});
209 add_psid_group_permission(cert_permission_message,aid::GN_MGMT,{0x00}, {0xff});
210 aa_certificate.add_cert_permission(cert_permission_message);
215 auto coordinates = compress_public_key(m_own_key_pair.public_key);
216 aa_certificate->toBeSigned.verifyKeyIndicator.present = Vanetza_Security_VerificationKeyIndicator_PR_verificationKey;
217 aa_certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.present = Vanetza_Security_PublicVerificationKey_PR_ecdsaNistP256;
218 boost::apply_visitor(assign_compressed_ecc_point(&aa_certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.choice.ecdsaNistP256), coordinates);
220 aa_certificate->toBeSigned.validityPeriod.start = v2::convert_time32(m_runtime.now() - std::chrono::hours(1));;
221 aa_certificate->toBeSigned.validityPeriod.duration.present = Vanetza_Security_Duration_PR_years;
222 aa_certificate->toBeSigned.validityPeriod.duration.choice.hours = 4;
225 encryption_key.x.assign(m_own_key_pair.public_key.x.begin(), m_own_key_pair.public_key.x.end());
226 encryption_key.y.assign(m_own_key_pair.public_key.y.begin(), m_own_key_pair.public_key.y.end());
227 aa_certificate->toBeSigned.encryptionKey = asn1::allocate<asn1::PublicEncryptionKey>();
228 aa_certificate->toBeSigned.encryptionKey->publicKey.present = Vanetza_Security_BasePublicEncryptionKey_PR_eciesNistP256;
229 aa_certificate->toBeSigned.encryptionKey->publicKey.choice.eciesNistP256.present = Vanetza_Security_EccP256CurvePoint_PR_uncompressedP256;
230 OCTET_STRING_fromBuf(
231 &aa_certificate->toBeSigned.encryptionKey->publicKey.choice.eciesNistP256.choice.uncompressedP256.x,
232 reinterpret_cast<
const char*>(encryption_key.x.data()),
233 encryption_key.x.size()
235 OCTET_STRING_fromBuf(
236 &aa_certificate->toBeSigned.encryptionKey->publicKey.choice.eciesNistP256.choice.uncompressedP256.y,
237 reinterpret_cast<
const char*>(encryption_key.y.data()),
238 encryption_key.y.size()
244 return aa_certificate;
252 root_certificate->issuer.present = Vanetza_Security_IssuerIdentifier_PR_self;
253 root_certificate->toBeSigned.id.present = Vanetza_Security_CertificateId_PR_name;
254 OCTET_STRING_fromBuf(&root_certificate->toBeSigned.id.choice.name, name.data(), name.size());
257 static const std::array<
char, 3> craciId = { 0, 0, 0 };
258 OCTET_STRING_fromBuf(&root_certificate->toBeSigned.cracaId, craciId.data(), craciId.size());
259 root_certificate->version = 3;
260 root_certificate->toBeSigned.crlSeries = 0;
263 root_certificate.add_permission(aid::CRL, ByteBuffer({0x01}));
264 root_certificate.add_permission(aid::CTL, ByteBuffer({0x018}));
270 auto cert_permission = asn1::allocate<asn1::PsidGroupPermissions>();
271 cert_permission->subjectPermissions.present = Vanetza_Security_SubjectPermissions_PR_explicit;
272 add_psid_group_permission(cert_permission,aid::SCR,{0x01, 0x3e}, {0xff, 0xc1});
273 root_certificate.add_cert_permission(cert_permission);
275 auto cert_permission_message = asn1::allocate<asn1::PsidGroupPermissions>();
276 cert_permission_message->subjectPermissions.present = Vanetza_Security_SubjectPermissions_PR_explicit;
277 add_psid_group_permission(cert_permission_message,aid::CA,{0x01, 0xff, 0xfc}, {0xff, 0x00, 0x03});
278 add_psid_group_permission(cert_permission_message,aid::DEN,{0x01, 0xff, 0xff, 0xff}, {0xff, 0x00, 0x00, 0x00});
279 add_psid_group_permission(cert_permission_message,aid::TLM,{0x01, 0xe0}, {0xff, 0x1f});
280 add_psid_group_permission(cert_permission_message,aid::RLT,{0x01, 0xc0}, {0xff,0x3f});
281 add_psid_group_permission(cert_permission_message,aid::IVI,{0x01, 0xff, 0xff,0xff,0xff,0xf8}, {0xff,0x00,0x00,0x00,0x00,0x07});
282 add_psid_group_permission(cert_permission_message,aid::TLC_R,{0x02, 0xff, 0xff,0xe0}, {0xff, 0x00, 0x00, 0x1f});
283 add_psid_group_permission(cert_permission_message,aid::GN_MGMT,{0x00}, {0xff});
284 root_certificate.add_cert_permission(cert_permission_message);
289 EccPoint coordinates = compress_public_key(m_own_key_pair.public_key);
290 root_certificate->toBeSigned.verifyKeyIndicator.present = Vanetza_Security_VerificationKeyIndicator_PR_verificationKey;
291 root_certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.present = Vanetza_Security_PublicVerificationKey_PR_ecdsaNistP256;
292 boost::apply_visitor(assign_compressed_ecc_point(&root_certificate->toBeSigned.verifyKeyIndicator.choice.verificationKey.choice.ecdsaNistP256), coordinates);
293 root_certificate->toBeSigned.validityPeriod.start = v2::convert_time32(m_runtime.now() - std::chrono::hours(1));;
294 root_certificate->toBeSigned.validityPeriod.duration.present = Vanetza_Security_Duration_PR_years;
295 root_certificate->toBeSigned.validityPeriod.duration.choice.hours = 4;
299 return root_certificate;