Commit 3ee46626 authored by Yann Garcia's avatar Yann Garcia
Browse files

Add PKI support to RSU simumlator

parents 493000b8 e0eb25e1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ The ETSI ITS protocols project builds and tests regularly on the following platf

  - Linux (Ubuntu)

Note: The [OpenSSL](https://www.openssl.org) version > 1.x is also required.

### Using Vagrant

Pre-requisites on your host machine:
+50 −3
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@

#include "converter.hh"

unsigned char commsignia_layer::_fixed_header[12] = { 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x0D, 0x00, 0x00 };

commsignia_layer::commsignia_layer(const std::string & p_type, const std::string & param) : layer(p_type), _params(), _c2p_recv{0}, _802_11p_hdr{0}, _c2p_llc_hdr{0}, _mac_src(), _eth_type() {
  loggers::get_instance().log(">>> commsignia_layer::commsignia_layer: %s, %s", to_string().c_str(), param.c_str());
  
@@ -31,12 +33,57 @@ commsignia_layer::commsignia_layer(const std::string & p_type, const std::string
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("interface_id"), "1"));
  }
  it = _params.find(std::string("power_tx"));
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("power_tx"), "20")); // 20db
  }
  it = _params.find(std::string("data_rate"));
  if (it == _params.cend()) {
    _params.insert(std::pair<std::string, std::string>(std::string("data_rate"), "12")); // 12 * 500Kbps = 6Mbps
  }
  //_params.log();
}

void commsignia_layer::send_data(OCTETSTRING& data, params& params) {
  loggers::get_instance().log_msg(">>> commsignia_layer::send_data: ", data);

  OCTETSTRING buffer(12, commsignia_layer::_fixed_header);
  buffer += int2oct(std::stoi(_params[params::interface_id]), 4);
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  buffer += int2oct(std::stoi(_params[std::string("data_rate")]), 4);
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  buffer += int2oct(0x80000000 & std::stoi(_params[std::string("power_tx")]), 4); // Negative number
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  buffer += int2oct(7, 1); // MAC user priority
  // Destination MAC address
  params::const_iterator it = params.find(params::mac_dst); // Find in provided parameters, params
  if (it != params.cend()) {
    buffer = str2oct(CHARSTRING(it->second.c_str()));
  } else {
    it = _params.find(params::mac_dst);
    if (it != _params.cend()) {
      buffer = str2oct(CHARSTRING(it->second.c_str()));
    } else {
      buffer = str2oct(CHARSTRING(_params[params::mac_bc].c_str()));
    }
  }
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  // Source MAC address
  it = params.find(params::mac_src); // Find in provided parameters, params
  if (it != params.cend()) {
    buffer += str2oct(CHARSTRING(it->second.c_str()));
  } else {
    buffer += str2oct(CHARSTRING(_params[params::mac_src].c_str()));
  }
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  buffer += int2oct(0, 2); // Fixed
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  buffer += int2oct(data.lengthof(), 2);
  loggers::get_instance().log_msg("commsignia_layer::send_data: buffer: ", buffer);
  buffer += data;
  
  loggers::get_instance().log_msg("commsignia_layer::send_data: ", buffer);
  send_to_all_layers(buffer, params);
}

void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
@@ -83,9 +130,9 @@ void commsignia_layer::receive_data(OCTETSTRING& data, params& params) {
    l = (const commsignia_layer::c2p_llc_hdr*)(p + sizeof(commsignia_layer::c2p_recv) + sizeof(commsignia_layer::c2p_802_11p_hdr));
    length = sizeof(commsignia_layer::c2p_recv) + sizeof(commsignia_layer::c2p_802_11p_hdr) + sizeof(commsignia_layer::c2p_llc_hdr);
  }
  //loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap);
  //loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap);
  //loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type);
  loggers::get_instance().log("commsignia_layer::receive_data: dsap=%02x", l->dsap);
  loggers::get_instance().log("commsignia_layer::receive_data: ssap=%02x", l->ssap);
  loggers::get_instance().log("commsignia_layer::receive_data: type=%04x", l->type);
  // Check ether type
  if ((_eth_type[1] == (unsigned char)((l->type & 0xff00) >> 8)) && (_eth_type[0] == (unsigned char)(l->type & 0xff))) { // Warning: Network ordered bytes
    // Extract payload
+3 −0
Original line number Diff line number Diff line
@@ -79,6 +79,9 @@ class commsignia_layer : public layer {
  std::vector<unsigned char> _mac_src;  //! Used to optimize filtering on source mac address in \see commsignia_layer::receive_data method
  std::vector<unsigned char> _eth_type; //! Used to optimize filtering on ethernet type in \see commsignia_layer::receive_data method

  //! Fixed header for packet injection
  static unsigned char _fixed_header[12];
  
public:
  //! \publicsection
   /*!
+1 −20
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ int http_codec::encode_request(const LibItsHttp__TypesAndValues::Request& p_requ
  if (_ec.is_content_length_present == 0x01) {
    loggers::get_instance().log_msg("http_codec::encode_request: Add body ", os);
    p_encoding_buffer.put_os(os);
    p_encoding_buffer.put_cs("\r\n");
    //FIXME For test With GEMALTO, comment to be removed, p_encoding_buffer.put_cs("\r\n");
  }

  loggers::get_instance().log_to_hexa("<<< http_codec::encode_request: ", p_encoding_buffer);
@@ -403,16 +403,6 @@ int http_codec::encode_body(const LibItsHttp__MessageBodyTypes::HttpMessageBody&
        if (it != _codecs.cend()) {
          loggers::get_instance().log("http_codec::encode_body: Call '%s'", it->first.c_str());
          _codecs["http_its"]->encode((Record_Type&)binary_body.ieee1609dot2__data(), p_encoding_buffer); // TODO Use params
          
          
#if defined(GEMALTO_FIX) // Temporary fix to be removed
          // GEMALTO Encode in hex string
          CHARSTRING buf = oct2str(p_encoding_buffer);
          p_encoding_buffer = OCTETSTRING(buf.lengthof(), (const unsigned char*)(static_cast<const char*>(buf)));
          loggers::get_instance().log_msg("http_codec::encode_body: Convert binary to string: ", p_encoding_buffer);
#endif
          
          
          processed = true;
        }
      } // TODO Add new HTTP message codec here
@@ -482,15 +472,6 @@ int http_codec::decode_body(TTCN_Buffer& decoding_buffer, LibItsHttp__MessageBod
  OCTETSTRING s(decoding_buffer.get_len() - decoding_buffer.get_pos(), decoding_buffer.get_data() + decoding_buffer.get_pos());
  loggers::get_instance().log_msg("http_codec::decode_body: raw body=", s);
  
#if defined(GEMALTO_FIX) // Temporary fix to be removed
  // GEMALTO Encode in hex string
  if ((s.lengthof() & 0x00000001) == 0x00000001) {
    s = int2oct(0, 1) + s;
  }
  s = str2oct(CHARSTRING(s.lengthof(), (const char*)(static_cast<const unsigned char*>(s))));
  loggers::get_instance().log_msg("http_codec::decode_body: Convert string to binary: ", s);
#endif
  
  // Align the payload length with the specified Content-lenght value
  loggers::get_instance().log("http_codec::decode_body: _dc.length=%d - body length=%d", _dc.length, s.lengthof());
  OCTETSTRING body;
+15 −12
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ class TTCN_EncDec;

int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data)
{
  loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg);
  loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode (1): ", (const Record_Type&)msg);
  
  TTCN_EncDec::clear_error();
  TTCN_Buffer encoding_buffer;
@@ -32,7 +32,7 @@ int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data)

int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger& msg, OCTETSTRING& data)
{
  loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg);
  loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode (2): ", (const Record_Type&)msg);
  
  TTCN_EncDec::clear_error();
  TTCN_Buffer encoding_buffer;
@@ -40,11 +40,12 @@ int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger
  const LibItsPki__TypesAndValues::UtPkiTrigger &u = static_cast<const LibItsPki__TypesAndValues::UtPkiTrigger &>(msg);
  if (u.ischosen(LibItsPki__TypesAndValues::UtPkiTrigger::ALT_triggerEnrolmentRequest)) {
    encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_pki_codec::c_utPkiTriggerEnrolmentRequest));
    encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string
    /*encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string
    encoding_buffer.put_string(u.triggerEnrolmentRequest().cannonicalId());
    encoding_buffer.put_os(u.triggerEnrolmentRequest().encAlgorithm()); // One byte
    encoding_buffer.put_os(u.triggerEnrolmentRequest().privateKey()); // 32 bytes
    encoding_buffer.put_os(u.triggerEnrolmentRequest().compressedPublickey()); //33 bytes
    */
  } else { // Error
    data = OCTETSTRING(0, nullptr);
    loggers::get_instance().warning("<<< uppertester_pki_codec::encode: Failed to encode UT message");
@@ -80,6 +81,10 @@ int uppertester_pki_codec::encode_ (const Base_Type& type, const TTCN_Typedescri
  } else {
    std::string s(field_descriptor.name);
    loggers::get_instance().log("uppertester_pki_codec::encode_: field to process %s", s.c_str());

    
    loggers::get_instance().log("uppertester_pki_codec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name);
    type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW);
    /*if (
        (s.rfind(".shape") != string::npos) ||
        (s.rfind(".relevanceDistance") != string::npos) ||
@@ -173,15 +178,13 @@ std::unique_ptr<Base_Type> uppertester_pki_codec::decode (const OCTETSTRING& dat

  std::unique_ptr<Base_Type> result;
  
  /*const unsigned char* ptr = static_cast<const unsigned char*>(data);
  if (*ptr != uppertester_pki_codec::c_utPkiEventInd) {
  const unsigned char* ptr = static_cast<const unsigned char*>(data);
  LibItsPki__TypesAndValues::UtPkiResults res;
  if (decode(data, res, params) == 0) {
    result.reset((Base_Type *)res.clone());
  } else {
    result.reset(nullptr);
  }
    }*/

  return result;
}
Loading