Beispiel #1
0
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;
}
Beispiel #3
0
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);
}