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>
20 size_t operator()(X_Coordinate_Only coord)
22 return coord.x.size();
24 size_t operator()(Compressed_Lsb_Y_0 coord)
26 return coord.x.size();
28 size_t operator()(Compressed_Lsb_Y_1 coord)
30 return coord.x.size();
32 size_t operator()(Uncompressed coord)
34 return coord.x.size() + coord.y.size();
38 ecc_point_visitor visit;
39 boost::apply_visitor(visit, point);
41 size += boost::apply_visitor(visit, point);
45EccPointType get_type(
const EccPoint& point)
47 struct ecc_point_visitor :
public boost::static_visitor<EccPointType>
49 EccPointType operator()(X_Coordinate_Only coord)
51 return EccPointType::X_Coordinate_Only;
53 EccPointType operator()(Compressed_Lsb_Y_0 coord)
55 return EccPointType::Compressed_Lsb_Y_0;
57 EccPointType operator()(Compressed_Lsb_Y_1 coord)
59 return EccPointType::Compressed_Lsb_Y_1;
61 EccPointType operator()(Uncompressed coord)
63 return EccPointType::Uncompressed;
67 ecc_point_visitor visit;
68 return boost::apply_visitor(visit, point);
71void serialize(OutputArchive& ar,
const EccPoint& point, PublicKeyAlgorithm algo)
73 struct ecc_point_visitor :
public boost::static_visitor<>
75 ecc_point_visitor(OutputArchive& ar, PublicKeyAlgorithm algo) :
76 m_archive(ar), m_algo(algo)
79 void operator()(X_Coordinate_Only coord)
81 assert(coord.x.size() == field_size(m_algo));
82 for (
auto byte : coord.x) {
86 void operator()(Compressed_Lsb_Y_0 coord)
88 assert(coord.x.size() == field_size(m_algo));
89 for (
auto byte : coord.x) {
93 void operator()(Compressed_Lsb_Y_1 coord)
95 assert(coord.x.size() == field_size(m_algo));
96 for (
auto byte : coord.x) {
100 void operator()(Uncompressed coord)
102 assert(coord.x.size() == field_size(m_algo));
103 assert(coord.y.size() == field_size(m_algo));
104 for (
auto byte : coord.x) {
107 for (
auto byte : coord.y) {
111 OutputArchive& m_archive;
112 PublicKeyAlgorithm m_algo;
115 EccPointType type = get_type(point);
117 ecc_point_visitor visit(ar, algo);
118 boost::apply_visitor(visit, point);
121void deserialize(InputArchive& ar, EccPoint& point, PublicKeyAlgorithm algo)
123 size_t size = field_size(algo);
126 deserialize(ar, type);
128 case EccPointType::X_Coordinate_Only: {
129 X_Coordinate_Only coord;
130 for (
size_t c = 0; c < size; c++) {
132 coord.x.push_back(elem);
137 case EccPointType::Compressed_Lsb_Y_0: {
138 Compressed_Lsb_Y_0 coord;
139 for (
size_t c = 0; c < size; c++) {
141 coord.x.push_back(elem);
146 case EccPointType::Compressed_Lsb_Y_1: {
147 Compressed_Lsb_Y_1 coord;
148 for (
size_t c = 0; c < size; c++) {
150 coord.x.push_back(elem);
155 case EccPointType::Uncompressed: {
157 for (
size_t c = 0; c < size; c++) {
159 coord.x.push_back(elem);
161 for (
size_t c = 0; c < size; c++) {
163 coord.y.push_back(elem);
169 throw deserialization_error(
"Unknown EccPointType");