Vanetza
 
Loading...
Searching...
No Matches
extended_pdu.hpp
1#ifndef EXTENDED_PDU_HPP_TL2WFH9W
2#define EXTENDED_PDU_HPP_TL2WFH9W
3
4#include <vanetza/geonet/basic_header.hpp>
5#include <vanetza/geonet/common_header.hpp>
6#include <vanetza/geonet/pdu.hpp>
7#include <vanetza/geonet/serialization.hpp>
8#include <vanetza/common/byte_buffer.hpp>
9#include <vanetza/common/byte_buffer_sink.hpp>
10#include <vanetza/security/secured_message.hpp>
11#include <boost/iostreams/stream.hpp>
12#include <boost/optional/optional.hpp>
13#include <memory>
14
15namespace vanetza
16{
17namespace geonet
18{
19
20template<class HEADER> class ExtendedPduConstRefs;
21
22template<class HEADER>
23class ExtendedPdu : public Pdu
24{
25public:
26 using SecuredMessage = security::SecuredMessage;
27 using ExtendedHeader = HEADER;
28
29 ExtendedPdu() = default;
30 ExtendedPdu(const ExtendedPdu& pdu) :
31 m_basic(pdu.m_basic), m_common(pdu.m_common), m_extended(pdu.m_extended),
32 m_secured(pdu.m_secured) {}
33 ExtendedPdu& operator=(const ExtendedPdu&) = default;
34 ExtendedPdu(const MIB& mib) : m_basic(mib), m_common(mib) {}
35 ExtendedPdu(const DataRequest& request, const MIB& mib) :
36 m_basic(request, mib), m_common(request, mib) {}
37 ExtendedPdu(const BasicHeader& basic, const CommonHeader& common, const HEADER& extended) :
38 m_basic(basic), m_common(common), m_extended(extended) {}
39 ExtendedPdu(const BasicHeader& basic, const CommonHeader& common, const HEADER& extended,
40 const SecuredMessage& secured) :
41 m_basic(basic), m_common(common), m_extended(extended), m_secured(secured) {}
43 m_basic(pdu.basic()), m_common(pdu.common()), m_extended(pdu.extended()),
44 m_secured(pdu.secured() ? boost::make_optional(*pdu.secured()) : boost::none) {}
45
46 BasicHeader& basic() override { return m_basic; }
47 const BasicHeader& basic() const override { return m_basic; }
48 CommonHeader& common() override { return m_common; }
49 const CommonHeader& common() const override { return m_common; }
50 HeaderConstRefVariant extended_variant() const override { return m_extended; }
51 HEADER& extended() { return m_extended; }
52 const HEADER& extended() const { return m_extended; }
53 SecuredMessage* secured() override { return m_secured.get_ptr(); }
54 const SecuredMessage* secured() const override { return m_secured.get_ptr(); }
55 void secured(const SecuredMessage& smsg) override
56 {
57 m_secured = smsg;
58 }
59
60 std::unique_ptr<Pdu> clone() const override
61 {
62 return std::unique_ptr<ExtendedPdu> { new ExtendedPdu(*this) };
63 }
64
65private:
66 BasicHeader m_basic;
67 CommonHeader m_common;
68 HEADER m_extended;
69 boost::optional<SecuredMessage> m_secured;
70};
71
72template<class HEADER>
74{
75public:
76 using SecuredMessage = security::SecuredMessage;
77 using ExtendedHeader = HEADER;
78
79 ExtendedPduConstRefs(const BasicHeader& basic, const CommonHeader& common, const HEADER& extended) :
80 mr_basic(basic), mr_common(common), mr_extended(extended), mp_secured(nullptr) {}
81 ExtendedPduConstRefs(const BasicHeader& basic, const CommonHeader& common, const HEADER& extended,
82 const SecuredMessage* secured) :
83 mr_basic(basic), mr_common(common), mr_extended(extended), mp_secured(secured) {}
84
85 const BasicHeader& basic() const override { return mr_basic; }
86 const CommonHeader& common() const override { return mr_common; }
87 HeaderConstRefVariant extended_variant() const override { return mr_extended; }
88 const HEADER& extended() const { return mr_extended; }
89 const SecuredMessage* secured() const override { return mp_secured; }
90
91 std::unique_ptr<Pdu> clone() const override
92 {
93 return std::unique_ptr<ExtendedPdu<HEADER>> {
94 mp_secured ?
95 new ExtendedPdu<HEADER>(mr_basic, mr_common, mr_extended, *mp_secured) :
96 new ExtendedPdu<HEADER>(mr_basic, mr_common, mr_extended)
97 };
98 }
99
100private:
101 const BasicHeader& mr_basic;
102 const CommonHeader& mr_common;
103 const HEADER& mr_extended;
104 const SecuredMessage* mp_secured;
105};
106
107/**
108 * \brief Serialize relevant header parts for signing
109 * Uses common and extended headers.
110 * \param pdu containing GN headers
111 * \return binary form of relevant header parts
112 */
113template<class HEADER>
114ByteBuffer convert_for_signing(const ExtendedPdu<HEADER>& pdu)
115{
116 ByteBuffer buf;
117 byte_buffer_sink sink(buf);
118
119 boost::iostreams::stream_buffer<byte_buffer_sink> stream(sink);
120 OutputArchive ar(stream);
121
122 serialize(pdu.common(), ar);
123 serialize(pdu.extended(), ar);
124
125 stream.close();
126 return buf;
127}
128
129} // namespace geonet
130} // namespace vanetza
131
132#endif /* EXTENDED_PDU_HPP_TL2WFH9W */
BasicHeader specified in ETSI EN 302 636-4-1 v1.2.1, section 8.6.