geonetworking_layer.cc 54 KB
Newer Older
  // Encode the basic header
garciay's avatar
garciay committed
  //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;
garciay's avatar
garciay committed
  loggers::get_instance().log_msg("geonetworking_layer::build_secured_pdu: Secured pdu = ", data);
garciay's avatar
garciay committed
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
garciay's avatar
garciay committed
  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);
garciay's avatar
garciay committed
  loggers::get_instance().log_msg("geonetworking_layer::decode_basic_header: ", p_basic_header);
garciay's avatar
garciay committed
int geonetworking_layer::setup_secured_mode() {
  loggers::get_instance().log(">>> geonetworking_layer::setup_secured_mode");
garciay's avatar
garciay committed
  loggers::get_instance().log("geonetworking_layer::setup_secured_mode: GN Layer address = %p", this);
garciay's avatar
garciay committed
  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"));
  }
garciay's avatar
garciay committed
  it = _params.find(params::sec_db_path);
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("sec_db_path"), ""));
  }
garciay's avatar
garciay committed
  it = _params.find(params::hash);
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("hash"), "SHA-256"));
  }
garciay's avatar
garciay committed
  it = _params.find(params::signature);
  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;
}

garciay's avatar
garciay committed
geonetworking_layer_factory geonetworking_layer_factory::_f;