Newer
Older
eh->tsbHeader().srcPosVector().timestamp__().set_long_long_val(static_cast<unsigned int>(base_time::get_instance().get_its_current_time_mod_ms()));
loggers::get_instance().log_msg("geonetworking_layer::build_geonetworking_pdu: tsb: ", *_tsb_packet);
// Encode GeoNetworking PDU
OCTETSTRING os;
_codec.encode(*_tsb_packet, os);
data = os;
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
} else if (header_type.compare("uni") == 0) {
ExtendedHeader* eh = static_cast<ExtendedHeader *>(_uni_packet->gnPacket().packet().extendedHeader().get_opt_value());
if (eh == nullptr) {
loggers::get_instance().error("geonetworking_layer::build_geonetworking_pdu: Wrong cast");
return -1;
}
// Update NextHeader
it = params.find(params::next_header);
if (next_header.compare("btpB") == 0) {
_uni_packet->gnPacket().packet().commonHeader().nextHeader() = NextHeader::e__btpB;
} else { // Default btp is btpA
_uni_packet->gnPacket().packet().commonHeader().nextHeader() = NextHeader::e__btpA;
}
// Update sequence number
eh->geoUnicastHeader().seqNumber() = _sequence_number++;
// Update payload
_uni_packet->gnPacket().packet().commonHeader().plLength() = data.lengthof();
_uni_packet->gnPacket().packet().payload() = OPTIONAL<OCTETSTRING>(data);
// Update timestamp
eh->geoUnicastHeader().srcPosVector().timestamp__().set_long_long_val(static_cast<unsigned int>(base_time::get_instance().get_its_current_time_mod_ms()));
loggers::get_instance().log_msg("geonetworking_layer::build_geonetworking_pdu: uni: ", *_uni_packet);
// Encode GeoNetworking PDU
OCTETSTRING os;
_codec.encode(*_uni_packet, os);
data = os;
} else { // TODO To be continued
// Default: Use GBC
ExtendedHeader* eh = static_cast<ExtendedHeader *>(_gbc_packet->gnPacket().packet().extendedHeader().get_opt_value());
loggers::get_instance().error("geonetworking_layer::build_geonetworking_pdu: Wrong cast");
return -1;
}
// Update NextHeader
if (next_header.compare("btpB") == 0) {
_gbc_packet->gnPacket().packet().commonHeader().nextHeader() = NextHeader::e__btpB;
} else { // Default btp is btpA
_gbc_packet->gnPacket().packet().commonHeader().nextHeader() = NextHeader::e__btpA;
}
// Update sequence number
eh->geoBroadcastHeader().seqNumber() = _sequence_number++;
// Update payload
_gbc_packet->gnPacket().packet().commonHeader().plLength() = data.lengthof();
_gbc_packet->gnPacket().packet().payload() = OPTIONAL<OCTETSTRING>(data);
// Update timestamp
eh->geoBroadcastHeader().srcPosVector().timestamp__().set_long_long_val(static_cast<unsigned int>(base_time::get_instance().get_its_current_time_mod_ms()));
loggers::get_instance().log_msg("geonetworking_layer::build_geonetworking_pdu: gbc: ", *_gbc_packet);
// Encode GeoNetworking PDU
OCTETSTRING os;
_codec.encode(*_gbc_packet, os);
data = os;
}
return 0;
}
int geonetworking_layer::build_secured_pdu(OCTETSTRING& data, params& params) {
loggers::get_instance().log_msg(">>> geonetworking_layer::build_secured_pdu: ", data);
LibItsGeoNetworking__TypesAndValues::BasicHeader basic_header;
decode_basic_header(data, basic_header);
if (basic_header.nextHeader() == BasicNextHeader::e__securedPacket) { // Already secured (ATS Security test suite/f_sendSecuredGn/Cam/Denm TTCN-3 functions
// Leave data unchanged
loggers::get_instance().log_msg("<<< geonetworking_layer::build_secured_pdu: Leave data unchanged: ", data);
return 0;
}
unsigned int basic_header_len = 4;// FIXME How to retrive the BasicHeader length basic_header.get_descriptor()->raw->fieldlength / 8;
loggers::get_instance().log("geonetworking_layer::build_secured_pdu: basic_header_len = %d", basic_header_len);
basic_header.nextHeader() = BasicNextHeader::e__securedPacket;
OCTETSTRING unsecured_gn_payload = OCTETSTRING(data.lengthof() - basic_header_len, static_cast<const unsigned char*>(data) + basic_header_len);
if (security_services::get_instance().secure_gn_payload(unsecured_gn_payload, secured_gn_payload, params) != 0) {
loggers::get_instance().warning("geonetworking_layer::build_secured_pdu: failed to build secured pdu");
//loggers::get_instance().log_msg("geonetworking_layer::build_secured_pdu: New basic_header = ", basic_header);
RAW_enc_tr_pos rp;
rp.level=0;
rp.pos=NULL;
RAW_enc_tree enc_tree(FALSE, NULL, &rp, 1, basic_header.get_descriptor()->raw);
basic_header.RAW_encode(*basic_header.get_descriptor(), enc_tree);
TTCN_Buffer encoding_buffer;
enc_tree.put_to_buf(encoding_buffer);
// Copy result
data =
OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data()) +
secured_gn_payload;
loggers::get_instance().log_msg("geonetworking_layer::build_secured_pdu: Secured pdu = ", data);
int geonetworking_layer::decode_basic_header(const OCTETSTRING& p_data, LibItsGeoNetworking__TypesAndValues::BasicHeader& p_basic_header) {
loggers::get_instance().log_msg(">>> geonetworking_layer::decode_basic_header: ", p_data);
// Update security mode
OCTETSTRING bh = OCTETSTRING(4, static_cast<const unsigned char*>(p_data)); // Extract the basic header as specified in ETSI EN 302 636-4-1 V1.3.1 (2017-08) Clause 9.6
loggers::get_instance().log_msg("geonetworking_layer::decode_basic_header: bh: ", bh);
TTCN_Buffer decoding_buffer(bh);
p_basic_header.RAW_decode(*p_basic_header.get_descriptor(), decoding_buffer, decoding_buffer.get_len() * 8, raw_order_t::ORDER_MSB);
loggers::get_instance().log_msg("geonetworking_layer::decode_basic_header: ", p_basic_header);
int geonetworking_layer::setup_secured_mode() {
loggers::get_instance().log(">>> geonetworking_layer::setup_secured_mode");
loggers::get_instance().log("geonetworking_layer::setup_secured_mode: GN Layer address = %p", this);
params::const_iterator it = _params.find(params::certificate);
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("certificate"), "CERT_TS_A_AT"));
}
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("sec_db_path"), ""));
}
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("hash"), "SHA-256"));
}
it = _params.find(params::signature); // TODO Should be removed
if (it == _params.cend()) {
_params.insert(std::pair<std::string, std::string>(std::string("signature"), "NISTP-256"));
}
// Set up security services even if secured_mode is set to 0. Later, we can receive an AcEnableSecurity request, the sertificate caching will be ready to go
security_services::get_instance().setup(_params);
security_services::get_instance().set_position(_latitude, _longitude);
return 0;
}
geonetworking_layer_factory geonetworking_layer_factory::_f;