Vanetza
 
Loading...
Searching...
No Matches
subject_attribute.cpp
1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/subject_attribute.hpp>
3
4namespace vanetza
5{
6namespace security
7{
8namespace v2
9{
10
11SubjectAttributeType get_type(const SubjectAttribute& sub)
12{
13 struct subject_attribute_visitor : public boost::static_visitor<SubjectAttributeType>
14 {
15 SubjectAttributeType operator()(VerificationKey key)
16 {
17 return SubjectAttributeType::Verification_Key;
18 }
19 SubjectAttributeType operator()(EncryptionKey key)
20 {
21 return SubjectAttributeType::Encryption_Key;
22 }
23 SubjectAttributeType operator()(SubjectAssurance assurance)
24 {
25 return SubjectAttributeType::Assurance_Level;
26 }
27 SubjectAttributeType operator()(std::list<IntX> list)
28 {
29 return SubjectAttributeType::ITS_AID_List;
30 }
31 SubjectAttributeType operator()(EccPoint ecc)
32 {
33 return SubjectAttributeType::Reconstruction_Value;
34 }
35 SubjectAttributeType operator()(std::list<ItsAidSsp> list)
36 {
37 return SubjectAttributeType::ITS_AID_SSP_List;
38 }
39 };
40
41 subject_attribute_visitor visit;
42 return boost::apply_visitor(visit, sub);
43}
44
45void serialize(OutputArchive& ar, const ItsAidSsp& its_aid_ssp)
46{
47 serialize(ar, its_aid_ssp.its_aid);
48 size_t size = its_aid_ssp.service_specific_permissions.size();
49 serialize_length(ar, size);
50 for (auto& byte : its_aid_ssp.service_specific_permissions) {
51 ar << byte;
52 }
53}
54
55size_t deserialize(InputArchive& ar, ItsAidSsp& its_aid_ssp)
56{
57 size_t size = 0;
58 size += deserialize(ar, its_aid_ssp.its_aid);
59 const std::uintmax_t buf_size = deserialize_length(ar);
60 its_aid_ssp.service_specific_permissions.resize(buf_size);
61 size += buf_size + length_coding_size(buf_size);
62 for (std::uintmax_t i = 0; i < buf_size; ++i) {
63 ar >> its_aid_ssp.service_specific_permissions[i];
64 }
65 return size;
66}
67
68size_t get_size(const SubjectAssurance& assurance)
69{
70 return sizeof(assurance.raw);
71}
72
73size_t get_size(const ItsAidSsp& its_aid_ssp)
74{
75 size_t size = get_size(its_aid_ssp.its_aid);
76 size += its_aid_ssp.service_specific_permissions.size();
77 size += length_coding_size(its_aid_ssp.service_specific_permissions.size());
78 return size;
79}
80
81size_t get_size(const SubjectAttribute& sub)
82{
83 size_t size = sizeof(SubjectAttributeType);
84 struct subject_attribute_visitor : public boost::static_visitor<size_t>
85 {
86 size_t operator()(const VerificationKey& key)
87 {
88 return get_size(key.key);
89 }
90 size_t operator()(const EncryptionKey& key)
91 {
92 return get_size(key.key);
93 }
94 size_t operator()(const SubjectAssurance& assurance)
95 {
96 return get_size(assurance);
97 }
98 size_t operator()(const std::list<IntX>& list)
99 {
100 size_t size = get_size(list);
101 size += length_coding_size(size);
102 return size;
103 }
104 size_t operator()(const EccPoint& ecc)
105 {
106 return get_size(ecc);
107 }
108 size_t operator()(const std::list<ItsAidSsp>& list)
109 {
110 size_t size = get_size(list);
111 size += length_coding_size(size);
112 return size;
113 }
114 };
115
116 subject_attribute_visitor visit;
117 size += boost::apply_visitor(visit, sub);
118 return size;
119}
120
121void serialize(OutputArchive& ar, const SubjectAttribute& subjectAttribute)
122{
123 struct subject_attribute_visitor : public boost::static_visitor<>
124 {
125 subject_attribute_visitor(OutputArchive& ar) :
126 m_archive(ar)
127 {
128 }
129 void operator()(const VerificationKey& key)
130 {
131 serialize(m_archive, key.key);
132 }
133 void operator()(const EncryptionKey& key)
134 {
135 serialize(m_archive, key.key);
136 }
137 void operator()(const SubjectAssurance& assurance)
138 {
139 m_archive << assurance.raw;
140 }
141 void operator()(const std::list<IntX>& list)
142 {
143 serialize(m_archive, list);
144 }
145 void operator()(const EccPoint& ecc)
146 {
147 // TODO: specification of corresponding public key algorithm is missing
148 throw serialization_error("unsupported serialization of SubjectAttribute with EccPoint");
149 }
150 void operator()(const std::list<ItsAidSsp>& list)
151 {
152 serialize(m_archive, list);
153 }
154 OutputArchive& m_archive;
155 };
156
157 SubjectAttributeType type = get_type(subjectAttribute);
158 serialize(ar, type);
159 subject_attribute_visitor visit(ar);
160 boost::apply_visitor(visit, subjectAttribute);
161}
162
163size_t deserialize(InputArchive& ar, SubjectAttribute& sub)
164{
165 SubjectAttributeType type;
166 size_t size = 0;
167 deserialize(ar, type);
168 size += sizeof(type);
169 switch (type) {
170 case SubjectAttributeType::Assurance_Level: {
171 SubjectAssurance assurance;
172 ar >> assurance.raw;
173 size += get_size(assurance);
174 sub = assurance;
175 break;
176 }
177 case SubjectAttributeType::Verification_Key: {
178 VerificationKey key;
179 size += deserialize(ar, key.key);
180 sub = key;
181 break;
182 }
183 case SubjectAttributeType::Encryption_Key: {
184 EncryptionKey key;
185 size += deserialize(ar, key.key);
186 sub = key;
187 break;
188 }
189 case SubjectAttributeType::ITS_AID_List: {
190 std::list<IntX> intx_list;
191 size_t tmp_size = deserialize(ar, intx_list);
192 size += tmp_size;
193 size += length_coding_size(tmp_size);
194 sub = intx_list;
195 break;
196 }
197 case SubjectAttributeType::ITS_AID_SSP_List: {
198 std::list<ItsAidSsp> itsAidSsp_list;
199 size_t tmp_size = deserialize(ar, itsAidSsp_list);
200 size += tmp_size;
201 size += length_coding_size(tmp_size);
202 sub = itsAidSsp_list;
203 break;
204 }
205 case SubjectAttributeType::Reconstruction_Value:
206 throw deserialization_error("unsupported deserialization of SubjectAttribute with EccPoint");
207 break;
208 default:
209 throw deserialization_error("Unknown SubjectAttributeType");
210 }
211
212 return size;
213}
214
215} // namespace v2
216} // namespace security
217} // namespace vanetza