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 static const std::uintmax_t buf_size_limit = 1024;
60 const std::uintmax_t buf_size = deserialize_length(ar);
61 if (buf_size <= buf_size_limit) {
62 its_aid_ssp.service_specific_permissions.resize(buf_size);
63 size += buf_size + length_coding_size(buf_size);
64 for (std::uintmax_t i = 0; i < buf_size; ++i) {
65 ar >> its_aid_ssp.service_specific_permissions[i];
66 }
67 } else {
68 ar.fail(InputArchive::ErrorCode::ExcessiveLength);
69 }
70 return size;
71}
72
73size_t get_size(const SubjectAssurance& assurance)
74{
75 return sizeof(assurance.raw);
76}
77
78size_t get_size(const ItsAidSsp& its_aid_ssp)
79{
80 size_t size = get_size(its_aid_ssp.its_aid);
81 size += its_aid_ssp.service_specific_permissions.size();
82 size += length_coding_size(its_aid_ssp.service_specific_permissions.size());
83 return size;
84}
85
86size_t get_size(const SubjectAttribute& sub)
87{
88 size_t size = sizeof(SubjectAttributeType);
89 struct subject_attribute_visitor : public boost::static_visitor<size_t>
90 {
91 size_t operator()(const VerificationKey& key)
92 {
93 return get_size(key.key);
94 }
95 size_t operator()(const EncryptionKey& key)
96 {
97 return get_size(key.key);
98 }
99 size_t operator()(const SubjectAssurance& assurance)
100 {
101 return get_size(assurance);
102 }
103 size_t operator()(const std::list<IntX>& list)
104 {
105 size_t size = get_size(list);
106 size += length_coding_size(size);
107 return size;
108 }
109 size_t operator()(const EccPoint& ecc)
110 {
111 return get_size(ecc);
112 }
113 size_t operator()(const std::list<ItsAidSsp>& list)
114 {
115 size_t size = get_size(list);
116 size += length_coding_size(size);
117 return size;
118 }
119 };
120
121 subject_attribute_visitor visit;
122 size += boost::apply_visitor(visit, sub);
123 return size;
124}
125
126void serialize(OutputArchive& ar, const SubjectAttribute& subjectAttribute)
127{
128 struct subject_attribute_visitor : public boost::static_visitor<>
129 {
130 subject_attribute_visitor(OutputArchive& ar) :
131 m_archive(ar)
132 {
133 }
134 void operator()(const VerificationKey& key)
135 {
136 serialize(m_archive, key.key);
137 }
138 void operator()(const EncryptionKey& key)
139 {
140 serialize(m_archive, key.key);
141 }
142 void operator()(const SubjectAssurance& assurance)
143 {
144 m_archive << assurance.raw;
145 }
146 void operator()(const std::list<IntX>& list)
147 {
148 serialize(m_archive, list);
149 }
150 void operator()(const EccPoint& ecc)
151 {
152 // TODO: specification of corresponding public key algorithm is missing
153 throw serialization_error("unsupported serialization of SubjectAttribute with EccPoint");
154 }
155 void operator()(const std::list<ItsAidSsp>& list)
156 {
157 serialize(m_archive, list);
158 }
159 OutputArchive& m_archive;
160 };
161
162 SubjectAttributeType type = get_type(subjectAttribute);
163 serialize(ar, type);
164 subject_attribute_visitor visit(ar);
165 boost::apply_visitor(visit, subjectAttribute);
166}
167
168size_t deserialize(InputArchive& ar, SubjectAttribute& sub)
169{
170 SubjectAttributeType type;
171 size_t size = 0;
172 deserialize(ar, type);
173 size += sizeof(type);
174 switch (type) {
175 case SubjectAttributeType::Assurance_Level: {
176 SubjectAssurance assurance;
177 ar >> assurance.raw;
178 size += get_size(assurance);
179 sub = assurance;
180 break;
181 }
182 case SubjectAttributeType::Verification_Key: {
183 VerificationKey key;
184 size += deserialize(ar, key.key);
185 sub = key;
186 break;
187 }
188 case SubjectAttributeType::Encryption_Key: {
189 EncryptionKey key;
190 size += deserialize(ar, key.key);
191 sub = key;
192 break;
193 }
194 case SubjectAttributeType::ITS_AID_List: {
195 std::list<IntX> intx_list;
196 size_t tmp_size = deserialize(ar, intx_list);
197 size += tmp_size;
198 size += length_coding_size(tmp_size);
199 sub = intx_list;
200 break;
201 }
202 case SubjectAttributeType::ITS_AID_SSP_List: {
203 std::list<ItsAidSsp> itsAidSsp_list;
204 size_t tmp_size = deserialize(ar, itsAidSsp_list);
205 size += tmp_size;
206 size += length_coding_size(tmp_size);
207 sub = itsAidSsp_list;
208 break;
209 }
210 case SubjectAttributeType::Reconstruction_Value:
211 throw deserialization_error("unsupported deserialization of SubjectAttribute with EccPoint");
212 break;
213 default:
214 throw deserialization_error("Unknown SubjectAttributeType");
215 }
216
217 return size;
218}
219
220} // namespace v2
221} // namespace security
222} // namespace vanetza
EncryptionKey specified in TS 103 097 v1.2.1, section 6.4.
ItsAidSsp specified in TS 103 097 v1.2.1, section 6.9.
SubjectAssurance specified in TS 103 097 v1.2.1 in section 6.6 and 7.4.1.
VerificationKey specified in TS 103 097 v1.2.1, section 6.4.