ByteBuffer convert_for_signing(const SecuredMessage& message, const std::list<TrailerField>& trailer_fields) { ByteBuffer buf; byte_buffer_sink sink(buf); boost::iostreams::stream_buffer<byte_buffer_sink> stream(sink); OutputArchive ar(stream); const uint8_t protocol_version = message.protocol_version(); ar << protocol_version; serialize(ar, message.header_fields); serialize(ar, message.payload); // Encode the total length, all trailer fields before the signature and the type of the signature // (see TS 103 097 v1.2.1, section 5.6) serialize_length(ar, get_size(trailer_fields)); for (auto& elem : trailer_fields) { TrailerFieldType type = get_type(elem); if (type == TrailerFieldType::Signature) { serialize(ar, type); break; // exclude fields after signature } else { serialize(ar, elem); } } stream.close(); return buf; }
void M2MTLVSerializer::serialize_TILV(uint8_t type, uint16_t id, uint8_t *value, uint32_t value_length, uint8_t *&data, uint32_t &size) { uint8_t *tlv = 0; uint32_t type_length = 1; type += id < 256 ? 0 : ID16; type += value_length < 8 ? value_length : value_length < 256 ? LENGTH8 : value_length < 65536 ? LENGTH16 : LENGTH24; uint8_t *tlv_type = (uint8_t*)malloc(type_length+1); memset(tlv_type,0,type_length+1); *tlv_type = type & 0xFF; uint32_t id_size = 0; uint8_t* id_ptr = serialize_id(id, id_size); uint32_t length_size = 0; uint8_t* length_ptr = serialize_length(value_length, length_size); tlv = (uint8_t*)malloc(size + type_length + id_size + length_size + value_length+1); memset(tlv,0,size + type_length + id_size + length_size + value_length+1); if(data) { memcpy(tlv, data, size); } memcpy(tlv+size, tlv_type, type_length); memcpy(tlv+size+type_length, id_ptr, id_size); memcpy(tlv+size+type_length+id_size, length_ptr, length_size); memcpy(tlv+size+type_length+id_size+length_size, value, value_length); if(tlv_type) { free(tlv_type) ; } if(length_ptr) { free(length_ptr); } if(id_ptr) { free(id_ptr); } if(data) { free(data); data = NULL; } data = tlv; size += type_length + id_size + length_size + value_length; }
void serialize(OutputArchive& ar, const Payload& payload) { serialize(ar, payload.type); serialize_length(ar, size(payload.data, OsiLayer::Network, max_osi_layer())); serialize(ar, payload.data); }