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;
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 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];
68size_t get_size(
const SubjectAssurance& assurance)
70 return sizeof(assurance.raw);
73size_t get_size(
const ItsAidSsp& its_aid_ssp)
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());
81size_t get_size(
const SubjectAttribute& sub)
83 size_t size =
sizeof(SubjectAttributeType);
84 struct subject_attribute_visitor :
public boost::static_visitor<size_t>
86 size_t operator()(
const VerificationKey& key)
88 return get_size(key.key);
92 return get_size(key.key);
94 size_t operator()(
const SubjectAssurance& assurance)
96 return get_size(assurance);
98 size_t operator()(
const std::list<IntX>& list)
100 size_t size = get_size(list);
101 size += length_coding_size(size);
104 size_t operator()(
const EccPoint& ecc)
106 return get_size(ecc);
108 size_t operator()(
const std::list<ItsAidSsp>& list)
110 size_t size = get_size(list);
111 size += length_coding_size(size);
116 subject_attribute_visitor visit;
117 size += boost::apply_visitor(visit, sub);
121void serialize(OutputArchive& ar,
const SubjectAttribute& subjectAttribute)
123 struct subject_attribute_visitor :
public boost::static_visitor<>
125 subject_attribute_visitor(OutputArchive& ar) :
129 void operator()(
const VerificationKey& key)
131 serialize(m_archive, key.key);
135 serialize(m_archive, key.key);
137 void operator()(
const SubjectAssurance& assurance)
139 m_archive << assurance.raw;
141 void operator()(
const std::list<IntX>& list)
143 serialize(m_archive, list);
145 void operator()(
const EccPoint& ecc)
148 throw serialization_error(
"unsupported serialization of SubjectAttribute with EccPoint");
150 void operator()(
const std::list<ItsAidSsp>& list)
152 serialize(m_archive, list);
154 OutputArchive& m_archive;
157 SubjectAttributeType type = get_type(subjectAttribute);
159 subject_attribute_visitor visit(ar);
160 boost::apply_visitor(visit, subjectAttribute);
163size_t deserialize(InputArchive& ar, SubjectAttribute& sub)
165 SubjectAttributeType type;
167 deserialize(ar, type);
168 size +=
sizeof(type);
170 case SubjectAttributeType::Assurance_Level: {
171 SubjectAssurance assurance;
173 size += get_size(assurance);
177 case SubjectAttributeType::Verification_Key: {
179 size += deserialize(ar, key.key);
183 case SubjectAttributeType::Encryption_Key: {
185 size += deserialize(ar, key.key);
189 case SubjectAttributeType::ITS_AID_List: {
190 std::list<IntX> intx_list;
191 size_t tmp_size = deserialize(ar, intx_list);
193 size += length_coding_size(tmp_size);
197 case SubjectAttributeType::ITS_AID_SSP_List: {
198 std::list<ItsAidSsp> itsAidSsp_list;
199 size_t tmp_size = deserialize(ar, itsAidSsp_list);
201 size += length_coding_size(tmp_size);
202 sub = itsAidSsp_list;
205 case SubjectAttributeType::Reconstruction_Value:
206 throw deserialization_error(
"unsupported deserialization of SubjectAttribute with EccPoint");
209 throw deserialization_error(
"Unknown SubjectAttributeType");