1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/public_key.hpp>
3#include <boost/variant/apply_visitor.hpp>
4#include <boost/variant/static_visitor.hpp>
13PublicKeyAlgorithm get_type(
const PublicKey& key)
15 struct public_key_visitor :
public boost::static_visitor<PublicKeyAlgorithm>
17 PublicKeyAlgorithm operator()(
const ecdsa_nistp256_with_sha256& ecdsa)
19 return PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256;
21 PublicKeyAlgorithm operator()(
const ecies_nistp256& ecies)
23 return PublicKeyAlgorithm::ECIES_NISTP256;
27 public_key_visitor visit;
28 return boost::apply_visitor(visit, key);
31void serialize(OutputArchive& ar,
const PublicKey& key)
33 struct public_key_visitor :
public boost::static_visitor<>
35 public_key_visitor(OutputArchive& ar, PublicKeyAlgorithm algo) :
36 m_archive(ar), m_algo(algo)
39 void operator()(
const ecdsa_nistp256_with_sha256& ecdsa)
41 serialize(m_archive, ecdsa.public_key, m_algo);
43 void operator()(
const ecies_nistp256& ecies)
45 serialize(m_archive, ecies.supported_symm_alg);
46 serialize(m_archive, ecies.public_key, m_algo);
48 OutputArchive& m_archive;
49 PublicKeyAlgorithm m_algo;
52 PublicKeyAlgorithm type = get_type(key);
54 public_key_visitor visit(ar, type);
55 boost::apply_visitor(visit, key);
58std::size_t field_size(PublicKeyAlgorithm algo)
62 case PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256:
65 case PublicKeyAlgorithm::ECIES_NISTP256:
72std::size_t field_size(SymmetricAlgorithm algo)
76 case SymmetricAlgorithm::AES128_CCM:
80 throw deserialization_error(
"Unknown SymmetricAlgorithm");
86size_t deserialize(InputArchive& ar, PublicKey& key)
88 PublicKeyAlgorithm type;
89 deserialize(ar, type);
91 case PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256: {
92 ecdsa_nistp256_with_sha256 ecdsa;
93 deserialize(ar, ecdsa.public_key, PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256);
97 case PublicKeyAlgorithm::ECIES_NISTP256: {
99 deserialize(ar, ecies.supported_symm_alg);
100 deserialize(ar, ecies.public_key, PublicKeyAlgorithm::ECIES_NISTP256);
105 throw deserialization_error(
"Unknown PublicKeyAlgorithm");
108 return get_size(key);
111size_t get_size(
const PublicKey& key)
113 size_t size =
sizeof(PublicKeyAlgorithm);
114 struct publicKey_visitor :
public boost::static_visitor<size_t>
116 size_t operator()(ecdsa_nistp256_with_sha256 key)
118 return get_size(key.public_key);
120 size_t operator()(ecies_nistp256 key)
122 return get_size(key.public_key) +
sizeof(key.supported_symm_alg);
125 publicKey_visitor visit;
126 size += boost::apply_visitor(visit, key);