#ifndef HEADER_FIELD_HPP_IHIAKD4K #define HEADER_FIELD_HPP_IHIAKD4K #include #include #include #include #include #include #include #include #include namespace vanetza { namespace security { namespace v2 { /// HeaderFieldType specified in TS 103 097 v1.2.1, section 5.5 enum class HeaderFieldType : uint8_t { Generation_Time = 0, // Time64 Generation_Time_Confidence = 1, // Time64WithStandardDeviation Expiration = 2, // Time32 Generation_Location = 3, // TreeDLocation Request_Unrecognized_Certificate = 4, // std::list Its_Aid = 5, // IntX Signer_Info = 128, // SignerInfo Encryption_Parameters = 129, // EncryptionParameters Recipient_Info = 130, // std::list }; /// HeaderField specified in TS 103 097 v1.2.1, section 5.4 using HeaderField = boost::variant< Time64, Time64WithStandardDeviation, Time32, ThreeDLocation, std::list, IntX, SignerInfo, EncryptionParameter, std::list >; /** * \brief Determines HeaderFieldType to a given HeaderField * \param field * \return type */ HeaderFieldType get_type(const HeaderField& field); /** * \brief Calculates size of a HeaderField * \param field * \return number of octets needed to serialize the HeaderField */ std::size_t get_size(const HeaderField& field); /** * \brief Serializes a HeaderField into a binary archive * \note Serialization of HeaderField lists is provided by template * \param ar to serialize in * \param field to serialize */ void serialize(OutputArchive& ar, const HeaderField& field); /** * \brief Deserializes a list of HeaderFields from a binary archive * \param ar with a serialized list of HeaderFields at the beginning * \param list of HeaderFields to deserialize * \return size of the deserialized list */ size_t deserialize(InputArchive& ar, std::list& list); /** * \brief resolve type for matching HeaderFieldType * * This is kind of the reverse function of get_type(const HeaderField&) */ template struct header_field_type; template<> struct header_field_type { using type = Time64; }; template<> struct header_field_type { using type = Time64WithStandardDeviation; }; template<> struct header_field_type { using type = Time32; }; template<> struct header_field_type { using type = ThreeDLocation; }; template<> struct header_field_type { using type = std::list; }; template<> struct header_field_type { using type = IntX; }; template<> struct header_field_type { using type = SignerInfo; }; template<> struct header_field_type { using type = EncryptionParameter; }; template<> struct header_field_type { using type = std::list; }; } // namespace v2 } // namespace security } // namespace vanetza #endif /* HEADER_FIELD_HPP_IHIAKD4K */