Vanetza
 
Loading...
Searching...
No Matches
trailer_field.cpp
1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/trailer_field.hpp>
3#include <boost/variant/get.hpp>
4#include <cassert>
5
6namespace vanetza
7{
8namespace security
9{
10namespace v2
11{
12
13TrailerFieldType get_type(const TrailerField& field)
14{
15 struct trailerFieldVisitor : public boost::static_visitor<TrailerFieldType>
16 {
17 TrailerFieldType operator()(const Signature& sig)
18 {
19 return TrailerFieldType::Signature;
20 }
21 };
22 trailerFieldVisitor visit;
23 return boost::apply_visitor(visit, field);
24}
25
26size_t get_size(const TrailerField& field)
27{
28 size_t size = sizeof(TrailerFieldType);
29 struct trailerFieldVisitor : public boost::static_visitor<size_t>
30 {
31 size_t operator()(const Signature& sig)
32 {
33 return get_size(sig);
34 }
35 };
36 trailerFieldVisitor visit;
37 size += boost::apply_visitor(visit, field);
38 return size;
39}
40
41void serialize(OutputArchive& ar, const TrailerField& field)
42{
43 struct trailer_visitor : public boost::static_visitor<>
44 {
45 trailer_visitor(OutputArchive& ar) :
46 m_archive(ar)
47 {
48 }
49 void operator()(const Signature& sig)
50 {
51 serialize(m_archive, sig);
52 }
53 OutputArchive& m_archive;
54 };
55 TrailerFieldType type = get_type(field);
56 serialize(ar, type);
57 trailer_visitor visitor(ar);
58 boost::apply_visitor(visitor, field);
59}
60
61size_t deserialize(InputArchive& ar, TrailerField& field)
62{
63 size_t size = 0;
64 TrailerFieldType type;
65 deserialize(ar, type);
66 size += sizeof(TrailerFieldType);
67 switch (type) {
68 case TrailerFieldType::Signature: {
69 Signature sig;
70 size += deserialize(ar, sig);
71 field = sig;
72 break;
73 }
74 default:
75 throw deserialization_error("Unknown TrailerFieldType");
76 }
77 return size;
78}
79
80boost::optional<ByteBuffer> extract_signature_buffer(const TrailerField& trailer_field)
81{
82 assert(TrailerFieldType::Signature == get_type(trailer_field));
83 assert(PublicKeyAlgorithm::ECDSA_NISTP256_With_SHA256 == get_type(boost::get<Signature>(trailer_field)));
84
85 return extract_signature_buffer(boost::get<Signature>(trailer_field));
86}
87
88} // namespace v2
89} // namespace security
90} // namespace vanetza