Vanetza
 
Loading...
Searching...
No Matches
header_field.hpp
1#ifndef HEADER_FIELD_HPP_IHIAKD4K
2#define HEADER_FIELD_HPP_IHIAKD4K
3
4#include <vanetza/security/v2/basic_elements.hpp>
5#include <vanetza/security/v2/certificate.hpp>
6#include <vanetza/security/v2/encryption_parameter.hpp>
7#include <vanetza/security/v2/int_x.hpp>
8#include <vanetza/security/v2/recipient_info.hpp>
9#include <vanetza/security/v2/region.hpp>
10#include <vanetza/security/v2/signer_info.hpp>
11#include <boost/variant/variant.hpp>
12#include <list>
13
14namespace vanetza
15{
16namespace security
17{
18namespace v2
19{
20
21/// HeaderFieldType specified in TS 103 097 v1.2.1, section 5.5
22enum class HeaderFieldType : uint8_t
23{
24 Generation_Time = 0, // Time64
25 Generation_Time_Confidence = 1, // Time64WithStandardDeviation
26 Expiration = 2, // Time32
27 Generation_Location = 3, // TreeDLocation
28 Request_Unrecognized_Certificate = 4, // std::list<HashedId3>
29 Its_Aid = 5, // IntX
30 Signer_Info = 128, // SignerInfo
31 Encryption_Parameters = 129, // EncryptionParameters
32 Recipient_Info = 130, // std::list<RecipientInfo>
33};
34
35/// HeaderField specified in TS 103 097 v1.2.1, section 5.4
36using HeaderField = boost::variant<
37 Time64,
38 Time64WithStandardDeviation,
39 Time32,
41 std::list<HashedId3>,
42 IntX,
43 SignerInfo,
44 EncryptionParameter,
45 std::list<RecipientInfo>
46>;
47
48/**
49 * \brief Determines HeaderFieldType to a given HeaderField
50 * \param field
51 * \return type
52 */
53HeaderFieldType get_type(const HeaderField& field);
54
55/**
56 * \brief Calculates size of a HeaderField
57 * \param field
58 * \return number of octets needed to serialize the HeaderField
59 */
60std::size_t get_size(const HeaderField& field);
61
62/**
63 * \brief Serializes a HeaderField into a binary archive
64 * \note Serialization of HeaderField lists is provided by template
65 * \param ar to serialize in
66 * \param field to serialize
67 */
68void serialize(OutputArchive& ar, const HeaderField& field);
69
70/**
71 * \brief Deserializes a list of HeaderFields from a binary archive
72 * \param ar with a serialized list of HeaderFields at the beginning
73 * \param list of HeaderFields to deserialize
74 * \return size of the deserialized list
75 */
76size_t deserialize(InputArchive& ar, std::list<HeaderField>& list);
77
78/**
79 * \brief resolve type for matching HeaderFieldType
80 *
81 * This is kind of the reverse function of get_type(const HeaderField&)
82 */
83template<HeaderFieldType>
85
86template<>
87struct header_field_type<HeaderFieldType::Generation_Time>
88{
89 using type = Time64;
90};
91
92template<>
93struct header_field_type<HeaderFieldType::Generation_Time_Confidence>
94{
96};
97
98template<>
99struct header_field_type<HeaderFieldType::Expiration>
100{
101 using type = Time32;
102};
103
104template<>
105struct header_field_type<HeaderFieldType::Generation_Location>
106{
107 using type = ThreeDLocation;
108};
109
110template<>
111struct header_field_type<HeaderFieldType::Request_Unrecognized_Certificate>
112{
113 using type = std::list<HashedId3>;
114};
115
116template<>
117struct header_field_type<HeaderFieldType::Its_Aid>
118{
119 using type = IntX;
120};
121
122template<>
123struct header_field_type<HeaderFieldType::Signer_Info>
124{
125 using type = SignerInfo;
126};
127
128template<>
129struct header_field_type<HeaderFieldType::Encryption_Parameters>
130{
131 using type = EncryptionParameter;
132};
133
134template<>
135struct header_field_type<HeaderFieldType::Recipient_Info>
136{
137 using type = std::list<RecipientInfo>;
138};
139
140} // namespace v2
141} // namespace security
142} // namespace vanetza
143
144#endif /* HEADER_FIELD_HPP_IHIAKD4K */
IntX specified in TS 103 097 v1.2.1, section 4.2.1.
Definition: int_x.hpp:21
ThreeDLocation specified in TS 103 097 v1.2.1, section 4.2.19.
Definition: region.hpp:21
Time64WithStandardDeviation specified in TS 103 097 v1.2.1, section 4.2.16.
resolve type for matching HeaderFieldType