1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/subject_attribute.hpp>
11SubjectAttributeType get_type(
const SubjectAttribute& sub)
13 struct subject_attribute_visitor :
public boost::static_visitor<SubjectAttributeType>
15 SubjectAttributeType operator()(VerificationKey key)
17 return SubjectAttributeType::Verification_Key;
19 SubjectAttributeType operator()(EncryptionKey key)
21 return SubjectAttributeType::Encryption_Key;
23 SubjectAttributeType operator()(SubjectAssurance assurance)
25 return SubjectAttributeType::Assurance_Level;
27 SubjectAttributeType operator()(std::list<IntX> list)
29 return SubjectAttributeType::ITS_AID_List;
31 SubjectAttributeType operator()(EccPoint ecc)
33 return SubjectAttributeType::Reconstruction_Value;
35 SubjectAttributeType operator()(std::list<ItsAidSsp> list)
37 return SubjectAttributeType::ITS_AID_SSP_List;
41 subject_attribute_visitor visit;
42 return boost::apply_visitor(visit, sub);
45void serialize(OutputArchive& ar,
const ItsAidSsp& its_aid_ssp)
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) {
55size_t deserialize(InputArchive& ar,
ItsAidSsp& its_aid_ssp)
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];
68 ar.fail(InputArchive::ErrorCode::ExcessiveLength);
75 return sizeof(assurance.raw);
78size_t get_size(
const ItsAidSsp& its_aid_ssp)
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());
86size_t get_size(
const SubjectAttribute& sub)
88 size_t size =
sizeof(SubjectAttributeType);
89 struct subject_attribute_visitor :
public boost::static_visitor<size_t>
91 size_t operator()(
const VerificationKey& key)
93 return get_size(key.key);
95 size_t operator()(
const EncryptionKey& key)
97 return get_size(key.key);
99 size_t operator()(
const SubjectAssurance& assurance)
101 return get_size(assurance);
103 size_t operator()(
const std::list<IntX>& list)
105 size_t size = get_size(list);
106 size += length_coding_size(size);
109 size_t operator()(
const EccPoint& ecc)
111 return get_size(ecc);
113 size_t operator()(
const std::list<ItsAidSsp>& list)
115 size_t size = get_size(list);
116 size += length_coding_size(size);
121 subject_attribute_visitor visit;
122 size += boost::apply_visitor(visit, sub);
126void serialize(OutputArchive& ar,
const SubjectAttribute& subjectAttribute)
128 struct subject_attribute_visitor :
public boost::static_visitor<>
130 subject_attribute_visitor(OutputArchive& ar) :
134 void operator()(
const VerificationKey& key)
136 serialize(m_archive, key.key);
138 void operator()(
const EncryptionKey& key)
140 serialize(m_archive, key.key);
142 void operator()(
const SubjectAssurance& assurance)
144 m_archive << assurance.raw;
146 void operator()(
const std::list<IntX>& list)
148 serialize(m_archive, list);
150 void operator()(
const EccPoint& ecc)
153 throw serialization_error(
"unsupported serialization of SubjectAttribute with EccPoint");
155 void operator()(
const std::list<ItsAidSsp>& list)
157 serialize(m_archive, list);
159 OutputArchive& m_archive;
162 SubjectAttributeType type = get_type(subjectAttribute);
164 subject_attribute_visitor visit(ar);
165 boost::apply_visitor(visit, subjectAttribute);
168size_t deserialize(InputArchive& ar, SubjectAttribute& sub)
170 SubjectAttributeType type;
172 deserialize(ar, type);
173 size +=
sizeof(type);
175 case SubjectAttributeType::Assurance_Level: {
178 size += get_size(assurance);
182 case SubjectAttributeType::Verification_Key: {
184 size += deserialize(ar, key.key);
188 case SubjectAttributeType::Encryption_Key: {
190 size += deserialize(ar, key.key);
194 case SubjectAttributeType::ITS_AID_List: {
195 std::list<IntX> intx_list;
196 size_t tmp_size = deserialize(ar, intx_list);
198 size += length_coding_size(tmp_size);
202 case SubjectAttributeType::ITS_AID_SSP_List: {
203 std::list<ItsAidSsp> itsAidSsp_list;
204 size_t tmp_size = deserialize(ar, itsAidSsp_list);
206 size += length_coding_size(tmp_size);
207 sub = itsAidSsp_list;
210 case SubjectAttributeType::Reconstruction_Value:
211 throw deserialization_error(
"unsupported deserialization of SubjectAttribute with EccPoint");
214 throw deserialization_error(
"Unknown SubjectAttributeType");
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.