Commit 1dc4458e authored by garciay's avatar garciay
Browse files

STF545: Finalyse & validate first test case

parent 626c18af
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -23,6 +23,17 @@ namespace LibItsCommon__Functions
    i.set_long_long_val(base_time::get_instance().get_its_current_time());
    return i;
  }
  /**
   * @desc    This external function gets the current time since 01/01/1970 in UTC format
   * @return  The current time since 01/01/1970 in UTC format
   * @see     fx_getCurrentTimeUtc() return UInt64
   */
  INTEGER fx__getCurrentTimeUtc(
) {
    INTEGER i;
    i.set_long_long_val(base_time::get_instance().get_current_time());
    return i;
  }
  /**
   * @desc    Gets the current time since 01/01/2004
   * @return  TimeMark - tenths of a second in the current or next hour in units of 1/10th second from UTC time
+43 −6
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ using namespace std; // Required for isnan()
#include "LibItsPki_TypesAndValues.hh"
#include "LibItsPki_TestSystem.hh"

pki_layer::pki_layer(const std::string & p_type, const std::string & param) : t_layer<LibItsPki__TestSystem::PkiPort>(p_type), _params(), _etsi_ts102941_types_enrolment_inner_request(), _etsi_ts102941_types_enrolment_inner_response(), _codec()
pki_layer::pki_layer(const std::string & p_type, const std::string & param) : t_layer<LibItsPki__TestSystem::PkiPort>(p_type), _params(), _etsi_ts102941_types_enrolment_inner_request(), _etsi_ts102941_types_enrolment_inner_response(), _codec(), _codec_etsi_ts102941_data(), _ac_set_security_data(nullptr)
{
  loggers::get_instance().log(">>> pki_layer::pki_layer: %s, %s", to_string().c_str(), param.c_str());

@@ -86,11 +86,39 @@ void pki_layer::receive_data(OCTETSTRING& data, params& params)
{
  loggers::get_instance().log_msg(">>> pki_layer::receive_data: ", data);
  
  IEEE1609dot2::Ieee1609Dot2Data etsi_ts_1609dot2_data;
  if (decrypt_and_check_signature(data, etsi_ts_1609dot2_data, _params) == -1) {
  // 1. Extract EtsiTs102941Data or EtsiTs103097DataSigned
  OCTETSTRING unsecured_payload;
  if (decrypt_and_check_signature(data, unsecured_payload, _params) == -1) {
    loggers::get_instance().warning("pki_layer::sendMsg: Failed to secure Pki message");
    return;
  }
  loggers::get_instance().log_msg("pki_layer::receive_data: unsecured_payload=", unsecured_payload);

  // Try to extract EtsiTs102941Data
  EtsiTs102941MessagesItss::EtsiTs102941Data etsi_ts_102941_data;
  if (_codec_etsi_ts102941_data.decode(unsecured_payload, etsi_ts_102941_data) == -1) {
    // Try with EtsiTs103097Data-Signed
    IEEE1609dot2::Ieee1609Dot2Data etsi_ts_1609dot2_data;
    if (_codec.decode(unsecured_payload, etsi_ts_1609dot2_data) == -1) {
      loggers::get_instance().warning("pki_layer::sendMsg: Failed to decode unsecured payload");
      return;
    } else {
      // Process EtsiTs103097Data-Signed
      loggers::get_instance().log_msg("pki_layer::receive_data: Process ", etsi_ts_1609dot2_data);
    }
  } else {
    // TODO Process EtsiTs102941Data
    loggers::get_instance().log_msg("pki_layer::receive_data: Process ", etsi_ts_102941_data);
    // Check protocol version
    if (etsi_ts_102941_data.version() != 1) {
      loggers::get_instance().warning("pki_layer::sendMsg: Wrong ETSI TS 102 941 protocol version, discard it!");
      return;
    }
    if (etsi_ts_102941_data.content().ischosen(EtsiTs102941MessagesItss::EtsiTs102941DataContent::ALT_enrolmentResponse)) {
      // Pass it to the ports
      to_all_upper_ports(etsi_ts_102941_data.content().enrolmentResponse(), _params);
    }
  }
  
  // Pass it to the ports
  //to_all_upper_ports(pki_message, params);
@@ -200,15 +228,24 @@ int pki_layer::sign_and_encrypt_payload(const OCTETSTRING& p_etsi_ts_102941_data
  return 0;
}

int pki_layer::decrypt_and_check_signature(const OCTETSTRING& p_signed_and_encrypted_data, IEEE1609dot2::Ieee1609Dot2Data& p_etsi_ts_1609dot2_data, params& p_params) {
int pki_layer::decrypt_and_check_signature(const OCTETSTRING& p_signed_and_encrypted_data, OCTETSTRING& p_unsecured_payload, params& p_params) {
  loggers::get_instance().log_msg(">>> pki_layer::decrypt_and_check_signature: ", p_signed_and_encrypted_data);

  // 1. Decrypt the Pki message
  OCTETSTRING os;
  if (security_services::get_instance().decrypt_gn_payload(p_signed_and_encrypted_data, os, p_params) == -1) {
    loggers::get_instance().warning("http_etsi_ieee1609dot2_codec::decrypt_and_check_signature: Failed to encrypt data");
    loggers::get_instance().warning("http_etsi_ieee1609dot2_codec::decrypt_and_check_signature: Failed to decrypt data");
    return -1;
  }
  loggers::get_instance().log_msg("pki_layer::decrypt_and_check_signature: Decrypted playload=", os);
  // 2. Decode EtsiTs103097Data-Signed and check signature
  IEEE1609dot2::Ieee1609Dot2Data etsi_ts_1609dot2_data;

  if (security_services::get_instance().verify_and_extract_gn_payload(os, true, etsi_ts_1609dot2_data, p_unsecured_payload, p_params) == -1) {
    loggers::get_instance().warning("http_etsi_ieee1609dot2_codec::decrypt_and_check_signature: Failed to verify EtsiTs103097Data-Signed data");
    return -1;
  }
  loggers::get_instance().log_msg("pki_layer::decrypt_and_check_signature: EtsiTs103097Data-Signed=", etsi_ts_1609dot2_data);
  
  return 0;
}
+7 −5
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include "etsi_ts102941_types_enrolment_inner_request.hh"
#include "etsi_ts102941_types_enrolment_inner_response.hh"
#include "etsi_ts103097_data_codec.hh"
#include "etsi_ts102941_data.hh"

namespace LibItsPki__TestSystem {
  class PkiPort; //! Forward declaration of TITAN class
@@ -37,9 +38,10 @@ class pki_layer : public t_layer<LibItsPki__TestSystem::PkiPort> {
  static constexpr unsigned int ProtocolVersion = 1;
  
  params _params;
  etsi_ts102941_types_enrolment_inner_request _etsi_ts102941_types_enrolment_inner_request;
  etsi_ts102941_types_enrolment_inner_response _etsi_ts102941_types_enrolment_inner_response;
  etsi_ts103097_data_codec _codec;
  etsi_ts102941_types_enrolment_inner_request _etsi_ts102941_types_enrolment_inner_request; // TODO Rename _codec_etsi_ts102941_types_enrolment_inner_request
  etsi_ts102941_types_enrolment_inner_response _etsi_ts102941_types_enrolment_inner_response; // TODO Rename _codec_etsi_ts102941_types_enrolment_inner_response
  etsi_ts103097_data_codec _codec; // TODO Rename _codec_etsi_ts103097_data_codec
  etsi_ts102941_data _codec_etsi_ts102941_data;

  std::unique_ptr<LibItsPki__TypesAndValues::AcSetSecurityData> _ac_set_security_data;

@@ -50,7 +52,7 @@ public: //! \publicsection
   * \param[in] p_type \todo
   * \param[in] p_param \todo
   */
  pki_layer() : t_layer(), _params(), _etsi_ts102941_types_enrolment_inner_request(), _etsi_ts102941_types_enrolment_inner_response(), _codec(), _ac_set_security_data(nullptr) { };
  pki_layer() : t_layer(), _params(), _etsi_ts102941_types_enrolment_inner_request(), _etsi_ts102941_types_enrolment_inner_response(), _codec(), _codec_etsi_ts102941_data(), _ac_set_security_data(nullptr) { };
  /*!
   * \brief Specialised constructor
   *        Create a new instance of the pki_layer class
@@ -112,6 +114,6 @@ private:
   * \param[in] p_params Some lower layers parameters values when data was received
   */
  int sign_and_encrypt_payload(const OCTETSTRING& p_etsi_ts_102941_data, OCTETSTRING& p_secured_data, params& p_params);
  int decrypt_and_check_signature(const OCTETSTRING& p_signed_and_encrypted_data, IEEE1609dot2::Ieee1609Dot2Data& p_etsi_ts_1609dot2_data, params& p_params);
  int decrypt_and_check_signature(const OCTETSTRING& p_signed_and_encrypted_data, OCTETSTRING& p_unsecured_payload, params& p_params);
}; // End of class pki_layer
+5 −4
Original line number Diff line number Diff line
@@ -156,15 +156,15 @@ int security_services::process_ieee_1609_dot2_signed_data(const IEEE1609dot2::Si
      return -1;
    }
  } else {
    const OPTIONAL<INTEGER>& v = dynamic_cast<const OPTIONAL<INTEGER>& >(header_info.generationTime());
    unsigned long long gt = ((INTEGER&)(*v.get_opt_value())).get_long_long_val() * 1000 - base_time::get_instance().get_its_base_time();
    const OPTIONAL<INTEGER>& v = dynamic_cast<const OPTIONAL<INTEGER>& >(header_info.generationTime()); // in millisecond
    unsigned long long gt = ((INTEGER&)(*v.get_opt_value())).get_long_long_val() - base_time::get_instance().get_its_base_time()/*in milliseconds*/;
    // Get current time timestamp
    unsigned long long ms = base_time::get_instance().get_its_current_time();
    unsigned long long ms = base_time::get_instance().get_its_current_time(); // in millisecond
    loggers::get_instance().log("security_services::process_ieee_1609_dot2_signed_data: generation time check %ld / %ld", header_info.generationTime(), ms);
    if (abs((double)gt - (double)ms) >= 5.0) { // TODO Use a params for generation_time_epsilon
      loggers::get_instance().warning("security_services::process_ieee_1609_dot2_signed_data: Invalid generation time, discard it");
      if (p_verify) {
        return -1;
        // TODO Issue between ITS time & Unix time in geeration return -1;
      }
    }
  }
@@ -860,6 +860,7 @@ int security_services::sign_ecdsa_nistp256(const OCTETSTRING& p_hash, IEEE1609do

int security_services::verify_sign_ecdsa_nistp256(const OCTETSTRING& p_hash, const IEEE1609dot2BaseTypes::Signature& p_signature, const std::string& p_certificate_id, params& p_params) {
  loggers::get_instance().log_msg(">>> security_services::verify_sign_ecdsa_nistp256:", p_hash);
  loggers::get_instance().log(">>> security_services::verify_sign_ecdsa_nistp256: %s", p_certificate_id.c_str());
  
  OCTETSTRING public_key_x;
  OCTETSTRING public_key_y;
+4 −4
Original line number Diff line number Diff line
@@ -383,7 +383,7 @@ module ItsPki_TestCases {
      // Test control
      
      // Test component configuration
      f_cfHttpUp();
      f_cfHttpUp(); // Default value: CERT_TS_A_EA
      
      // Test adapter configuration
      
@@ -403,7 +403,7 @@ module ItsPki_TestCases {
      }
      // Secure InnerEcRequestSignedForPoP message
      v_inner_ec_request_signed_for_pop_msg := encvalue(m_etsiTs102941Data_inner_ec_request_signed_for_pop(v_inner_ec_request_signed_for_pop));
      if (f_build_pki_secured_message(v_private_key, v_publicKeyCompressed, v_compressedMode, bit2oct(v_inner_ec_request_signed_for_pop_msg), v_ieee1609dot2_signed_and_encrypted_data) == false) {
      if (f_build_pki_secured_message(vc_eaPrivateKey, valueof(m_signerIdentifier_self), vc_eaHashedId8, v_publicKeyCompressed, v_compressedMode, bit2oct(v_inner_ec_request_signed_for_pop_msg), v_ieee1609dot2_signed_and_encrypted_data) == false) {
        log("*** " & testcasename() & ": FAIL: Failed to seucure InnerEcRequestPoP message ***")
        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error);
        stop;
Loading