1#include <vanetza/security/exception.hpp>
2#include <vanetza/security/v2/ecc_point.hpp>
3#include <vanetza/security/v2/public_key.hpp>
4#include <boost/variant/apply_visitor.hpp>
5#include <boost/variant/static_visitor.hpp>
15size_t get_size(
const EccPoint& point)
17 size_t size =
sizeof(EccPointType);
18 struct ecc_point_visitor :
public boost::static_visitor<size_t>
22 return coord.x.size();
27 return coord.x.size();
32 return coord.x.size();
37 return coord.x.size() + coord.y.size();
41 ecc_point_visitor visit;
42 boost::apply_visitor(visit, point);
44 size += boost::apply_visitor(visit, point);
48EccPointType get_type(
const EccPoint& point)
50 struct ecc_point_visitor :
public boost::static_visitor<EccPointType>
54 return EccPointType::X_Coordinate_Only;
59 return EccPointType::Compressed_Lsb_Y_0;
64 return EccPointType::Compressed_Lsb_Y_1;
69 return EccPointType::Uncompressed;
73 ecc_point_visitor visit;
74 return boost::apply_visitor(visit, point);
77void serialize(
OutputArchive& ar,
const EccPoint& point, PublicKeyAlgorithm algo)
79 struct ecc_point_visitor :
public boost::static_visitor<>
81 ecc_point_visitor(
OutputArchive& ar, PublicKeyAlgorithm algo) :
82 m_archive(ar), m_algo(algo)
88 assert(coord.x.size() == field_size(m_algo));
89 for (
auto byte : coord.x) {
96 assert(coord.x.size() == field_size(m_algo));
97 for (
auto byte : coord.x) {
104 assert(coord.x.size() == field_size(m_algo));
105 for (
auto byte : coord.x) {
112 assert(coord.x.size() == field_size(m_algo));
113 assert(coord.y.size() == field_size(m_algo));
114 for (
auto byte : coord.x) {
117 for (
auto byte : coord.y) {
123 PublicKeyAlgorithm m_algo;
126 EccPointType type = get_type(point);
128 ecc_point_visitor visit(ar, algo);
129 boost::apply_visitor(visit, point);
132void deserialize(
InputArchive& ar, EccPoint& point, PublicKeyAlgorithm algo)
134 size_t size = field_size(algo);
137 deserialize(ar, type);
139 case EccPointType::X_Coordinate_Only: {
141 for (size_t c = 0; c < size; c++) {
143 coord.x.push_back(elem);
148 case EccPointType::Compressed_Lsb_Y_0: {
150 for (size_t c = 0; c < size; c++) {
152 coord.x.push_back(elem);
157 case EccPointType::Compressed_Lsb_Y_1: {
159 for (size_t c = 0; c < size; c++) {
161 coord.x.push_back(elem);
166 case EccPointType::Uncompressed: {
168 for (size_t c = 0; c < size; c++) {
170 coord.x.push_back(elem);
172 for (size_t c = 0; c < size; c++) {
174 coord.y.push_back(elem);
thrown when a deserialization error occurred
Compressed_Lsb_Y_0 specified in TS 103 097 v1.2.1 in section 4.2.5.
Compressed_Lsb_Y_1 specified in TS 103 097 v1.2.1 in section 4.2.5.
Uncompressed specified in TS 103 097 v1.2.1 in section 4.2.5.
X_Coordinate_Only specified in TS 103 097 v1.2.1 in section 4.2.5.