Vanetza
Loading...
Searching...
No Matches
hybrid_certificate.hpp
1#pragma once
2
3#include <vanetza/common/byte_buffer.hpp>
4#include <vanetza/security/hash_algorithm.hpp>
5#include <vanetza/security/pqc/fndsa512.hpp>
6#include <boost/optional/optional.hpp>
7
8namespace vanetza
9{
10namespace security
11{
12
13class Backend;
14struct PrivateKey;
15
16namespace v3
17{
18class Certificate;
19class CertificateView;
20} // namespace v3
21
22namespace pqc
23{
24
25/** The two nested certificate signatures used by the experimental profile. */
26enum class SignatureLayer
27{
28 Alternative,
29 Primary,
30};
31
32/** Shape of the optional alternative material carried by a certificate. */
33enum class MaterialState
34{
35 None,
36 Authority,
37 EndEntity,
38 Inconsistent,
39};
40
41boost::optional<PublicKey> get_alternative_public_key(const v3::CertificateView&);
42boost::optional<Signature> get_alternative_signature(const v3::CertificateView&);
43MaterialState alternative_material_state(const v3::CertificateView&);
44
45void set_alternative_public_key(v3::Certificate&, const PublicKey&);
46void set_alternative_signature(v3::Certificate&, const Signature&);
47void clear_alternative_public_key(v3::Certificate&);
48void clear_alternative_signature(v3::Certificate&);
49
50/**
51 * Calculate the certificate signature hash.
52 *
53 * The construction follows the IEEE 1609.2 certificate signature input:
54 * H(H(COER(toBeSigned)) || H(COER(canonical issuer certificate))). For a
55 * self-signed certificate the issuer input is empty. The alternative layer
56 * omits altSignatureValue from toBeSigned; the primary layer includes it.
57 */
58ByteBuffer calculate_certificate_hash(
59 ::vanetza::security::Backend&, HashAlgorithm, const v3::CertificateView& subject,
60 const v3::CertificateView* issuer, SignatureLayer);
61
62/** Sign or verify the outer, classical certificate signature. */
63void sign_primary_certificate(
64 v3::Certificate&, const v3::CertificateView* issuer,
65 ::vanetza::security::Backend&, const ::vanetza::security::PrivateKey& issuer_key);
66bool verify_primary_certificate(
67 const v3::CertificateView&, const v3::CertificateView* issuer,
68 ::vanetza::security::Backend&);
69
70/** Sign or verify the inner FN-DSA-512 certificate signature. */
71void sign_alternative_certificate(
72 v3::Certificate&, const v3::CertificateView* issuer,
73 ::vanetza::security::Backend& hash_backend, Backend&,
74 const PrivateKey& issuer_key);
75bool verify_alternative_certificate(
76 const v3::CertificateView&, const v3::CertificateView* issuer,
77 ::vanetza::security::Backend&, Backend&);
78
79} // namespace pqc
80} // namespace security
81} // namespace vanetza
virtual Signature sign_digest(const PrivateKey &, const ByteBuffer &digest)=0
calculate signature for given digest and private key
virtual bool verify_digest(const PublicKey &public_key, const ByteBuffer &digest, const Signature &sig)=0
try to verify digest using public key and signature
virtual ByteBuffer calculate_hash(HashAlgorithm algo, const ByteBuffer &data)=0
calculate hash value of data
boost::optional< Certificate > canonicalize() const
boost::optional< HashedId8 > calculate_digest() const
boost::optional< HashedId8 > issuer_digest() const