Vanetza
Loading...
Searching...
No Matches
secured_message.hpp
1#ifndef SECURED_MESSAGE_HPP_MO3HBSXG
2#define SECURED_MESSAGE_HPP_MO3HBSXG
3
4#include <vanetza/common/its_aid.hpp>
5#include <vanetza/security/v2/header_field.hpp>
6#include <vanetza/security/v2/trailer_field.hpp>
7#include <vanetza/security/v2/payload.hpp>
8#include <cstdint>
9#include <list>
10
11namespace vanetza
12{
13namespace security
14{
15namespace v2
16{
17
18/// SecuredMessage as specified in TS 103 097 v1.2.1, section 5.1
20{
21 std::list<HeaderField> header_fields;
22 std::list<TrailerField> trailer_fields;
23 Payload payload;
24
25 uint8_t protocol_version() const { return 2; }
26
27 /**
28 * Fetch pointer to first matching header field
29 * \param type HeaderField has to match given type
30 * \return matching HeaderField or nullptr
31 */
32 HeaderField* header_field(HeaderFieldType);
33
34 /**
35 * Fetch read-only pointer to first machting header field
36 * \param type requested header field type
37 * \return matching header field or nullptr
38 */
39 const HeaderField* header_field(HeaderFieldType type) const;
40
41 /**
42 * Fetch pointer to first matching trailer field
43 * \param type TrailerField has to match given type
44 * \return matching TrailerField or nullptr
45 */
46 TrailerField* trailer_field(TrailerFieldType);
47
48 /**
49 * Fetch read-only pointer of first matching trailer field
50 * \param type request trailer field type
51 * \return matching trailer field or nullptr
52 */
53 const TrailerField* trailer_field(TrailerFieldType type) const;
54
55 template<HeaderFieldType T>
56 typename header_field_type<T>::type* header_field()
57 {
58 using field_type = typename header_field_type<T>::type;
59 HeaderField* field = header_field(T);
60 return boost::get<field_type>(field);
61 }
62
63 template<HeaderFieldType T>
64 const typename header_field_type<T>::type* header_field() const
65 {
66 using field_type = typename header_field_type<T>::type;
67 const HeaderField* field = header_field(T);
68 return boost::get<field_type>(field);
69 }
70
71 template<TrailerFieldType T>
72 typename trailer_field_type<T>::type* trailer_field()
73 {
74 using field_type = typename trailer_field_type<T>::type;
75 TrailerField* field = trailer_field(T);
76 return boost::get<field_type>(field);
77 }
78
79 template<TrailerFieldType T>
80 const typename trailer_field_type<T>::type* trailer_field() const
81 {
82 using field_type = typename trailer_field_type<T>::type;
83 const TrailerField* field = trailer_field(T);
84 return boost::get<field_type>(field);
85 }
86};
87
88/**
89 * \brief Calculates size of a SecuredMessage object
90 * \return size_t containing the number of octets needed to serialize the object
91 */
92size_t get_size(const SecuredMessage&);
93
94/**
95 * \brief Serializes a SecuredMessage into a binary archive
96 */
97void serialize(OutputArchive& ar, const SecuredMessage& message);
98
99/**
100 * \brief Deserializes a SecuredMessage from a binary archive
101 * \return size of deserialized SecuredMessage
102 */
103size_t deserialize(InputArchive& ar, SecuredMessage& message);
104
105/**
106 * \brief Create ByteBuffer equivalent of SecuredMessage suitable for signature creation
107 *
108 * ByteBuffer contains message's version, header_fields and payload.
109 * Additionally, the length of trailer fields and the type of the signature is appended.
110 *
111 * \param message
112 * \param trailer_fields only trailer fields up to signature will be included in byte buffer
113 * \return serialized data fields relevant for signature creation
114 */
115ByteBuffer convert_for_signing(const SecuredMessage& message, const std::list<TrailerField>& trailer_fields);
116
117/**
118 * \brief Get ITS-AID from message
119 * \param msg secured message object
120 * \return found ITS-AID or 0
121 */
122ItsAid get_its_aid(const SecuredMessage& msg);
123
124} // namespace v2
125} // namespace security
126} // namespace vanetza
127
128#endif /* SECURED_MESSAGE_HPP_MO3HBSXG */
ChunckPacket is a packet consisting of several memory chunks.
ByteBufferConvertible & operator[](OsiLayer ol)
ChunkPacket & merge(ChunkPacket &packet, OsiLayer from, OsiLayer to)
std::size_t size() const
const ByteBufferConvertible & layer(OsiLayer ol) const
const ByteBufferConvertible & operator[](OsiLayer ol) const
ByteBufferConvertible & layer(OsiLayer ol)
std::size_t size(OsiLayer from, OsiLayer to) const
ChunkPacket extract(OsiLayer from, OsiLayer to)
std::size_t size(OsiLayer from, OsiLayer to) const
buffer_const_range operator[](OsiLayer layer) const
std::size_t size() const
void set_boundary(OsiLayer, unsigned bytes)
const ByteBuffer & buffer() const
CohesivePacket(const ByteBuffer &buffer, OsiLayer layer)
void trim(OsiLayer from, unsigned bytes)
std::size_t size(OsiLayer single_layer) const
value_type operator[](size_type) const
Definition byte_view.cpp:48
byte_view_range(ByteBuffer &&)
Definition byte_view.cpp:37
byte_view_range(const ByteBuffer::const_iterator &, const ByteBuffer::const_iterator &)
Definition byte_view.cpp:27
ByteBuffer::const_pointer data() const
Definition byte_view.cpp:42
void encode(units::Duration)
Definition lifetime.cpp:45
units::Duration decode() const
Definition lifetime.cpp:59
bool after(const Timestamp &other) const
Definition timestamp.cpp:76
bool before(const Timestamp &other) const
Definition timestamp.cpp:71
static CertificateValidity valid()
Create CertificateValidity signalling a valid certificate This method is equivalent to default constr...
CertificateValidity(CertificateInvalidReason reason)
CertificateInvalidReason reason() const
Get reason for certificate invalidity This call is only safe if reason is available,...
static DecapConfirm from(VerifyConfirm &&verify_confirm, const SecuredMessageView &msg_view)
Input data for decapsulating a secured message.
Payload specified in TS 103 097 v1.2.1, section 5.2.
Definition payload.hpp:28
SecuredMessage as specified in TS 103 097 v1.2.1, section 5.1.
HeaderField * header_field(HeaderFieldType)
const TrailerField * trailer_field(TrailerFieldType type) const
const HeaderField * header_field(HeaderFieldType type) const
TrailerField * trailer_field(TrailerFieldType)
resolve type for matching HeaderFieldType
resolve type for matching TrailerFieldType