1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/signature.hpp>
3#include <boost/iostreams/stream.hpp>
13PublicKeyAlgorithm get_type(
const Signature& sig)
15 struct Signature_visitor :
public boost::static_visitor<PublicKeyAlgorithm>
17 PublicKeyAlgorithm operator()(
const EcdsaSignature& sig)
19 return PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256;
22 PublicKeyAlgorithm operator()(
const EcdsaSignatureFuture& sig)
24 return PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256;
27 Signature_visitor visit;
28 return boost::apply_visitor(visit, sig.some_ecdsa);
31size_t get_size(
const EcdsaSignature& sig)
33 size_t size = sig.s.size();
34 size += get_size(sig.R);
38size_t get_size(
const EcdsaSignatureFuture& sig)
45 size_t size =
sizeof(PublicKeyAlgorithm);
46 struct Signature_visitor :
public boost::static_visitor<size_t>
48 size_t operator()(
const EcdsaSignature& sig)
53 size_t operator()(
const EcdsaSignatureFuture& sig)
58 Signature_visitor visit;
59 size += boost::apply_visitor(visit, sig.some_ecdsa);
63void serialize(OutputArchive& ar,
const Signature& sig)
65 struct signature_visitor :
public boost::static_visitor<>
67 signature_visitor(OutputArchive& ar) : m_archive(ar) {}
69 void operator()(
const EcdsaSignature& sig)
71 serialize(m_archive, sig);
74 void operator()(
const EcdsaSignatureFuture& sig)
76 serialize(m_archive, sig);
79 OutputArchive& m_archive;
82 PublicKeyAlgorithm algo = get_type(sig);
84 signature_visitor visitor(ar);
85 boost::apply_visitor(visitor, sig.some_ecdsa);
88void serialize(OutputArchive& ar,
const EcdsaSignature& sig)
90 const PublicKeyAlgorithm algo = PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256;
91 assert(field_size(algo) == sig.s.size());
93 serialize(ar, sig.R, algo);
94 for (
auto&
byte : sig.s) {
99void serialize(OutputArchive& ar,
const EcdsaSignatureFuture& sig)
101 auto& ecdsa = sig.get();
102 serialize(ar, ecdsa);
105size_t deserialize(InputArchive& ar, EcdsaSignature& sig,
const PublicKeyAlgorithm& algo)
109 deserialize(ar, point, algo);
110 for (
size_t i = 0; i < field_size(algo); i++) {
117 return get_size(sig);
120size_t deserialize(InputArchive& ar,
Signature& sig)
122 PublicKeyAlgorithm algo;
124 deserialize(ar, algo);
125 size +=
sizeof(algo);
127 case PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256: {
128 EcdsaSignature signature;
129 size += deserialize(ar, signature, algo);
134 throw deserialization_error(
"Unknown PublicKeyAlgorithm");
139boost::optional<EcdsaSignature> extract_ecdsa_signature(
const Signature& sig)
141 struct signature_visitor :
public boost::static_visitor<const EcdsaSignature*>
143 const EcdsaSignature* operator()(
const EcdsaSignature& sig)
148 const EcdsaSignature* operator()(
const EcdsaSignatureFuture& sig)
154 signature_visitor visitor;
155 const EcdsaSignature* ecdsa = boost::apply_visitor(visitor, sig.some_ecdsa);
156 return boost::optional<EcdsaSignature>(ecdsa !=
nullptr, *ecdsa);