Commit 53a1d335 authored by Yann Garcia's avatar Yann Garcia
Browse files

Security uses TAI not UTC: Need to add 4 Leap seconds

parent 2ef207bc
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@
class base_time {
  const unsigned long long its_base_time_ms = 1072915200000L; //! Base time 01/01/2004 12:00am in millseconds
  
  unsigned long long leap_delay;
  
  static base_time* _instance;
private:
  base_time() { }; //! Can not be created manually
  base_time(): leap_delay{0} { }; //! Can not be created manually
public:
  static inline base_time& get_instance();

@@ -33,6 +35,8 @@ public:
  inline const unsigned long long get_its_current_time_ms() const;
  inline const unsigned long long get_its_current_time_us() const;
  inline const unsigned long long get_its_current_time_mod_ms() const;
  inline void set_leap_delay_us(const unsigned long long p_leap_delay);
  inline const unsigned long long get_leap_delay_us() const;
}; // End of class base_time

// static functions
@@ -41,7 +45,7 @@ base_time& base_time::get_instance() {
}

const unsigned long long base_time::get_current_time_ms() const {
  return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
  return (leap_delay / 1000) + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}

const unsigned long long base_time::get_its_base_time_ms() const {
@@ -49,14 +53,21 @@ const unsigned long long base_time::get_its_base_time_ms() const {
}

const unsigned long long base_time::get_its_current_time_ms() const {
  return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms;
  return (leap_delay / 1000) + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms;
}

const unsigned long long base_time::get_its_current_time_us() const {
  return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms * 1000;
  return leap_delay + std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms * 1000;
}

const unsigned long long base_time::get_its_current_time_mod_ms() const {
  return (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms) % 65536;
  return ((leap_delay / 1000) + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms) % 65536;
}

void base_time::set_leap_delay_us(const unsigned long long p_leap_delay) {
  leap_delay = p_leap_delay;
}

inline const unsigned long long base_time::get_leap_delay_us() const {
  return leap_delay;
}
+3 −0
Original line number Diff line number Diff line
@@ -152,6 +152,9 @@ void geonetworking_layer::init(const std::string & p_type, const std::string & p
  // Register this object for AdapterControlPort
  loggers::get_instance().log("geonetworking_layer::geonetworking_layer: Register %s/%p", p_type.c_str(), this);
  registration<geonetworking_layer>::get_instance().add_item(p_type, this);

  // Add 4 leap seconds to convert to TAI (as Feb 2019)
  base_time::get_instance().set_leap_delay_us(4 * 1000000); // TODO Set it as parameter
} // End of init_params

void geonetworking_layer::sendMsg(const LibItsGeoNetworking__TestSystem::GeoNetworkingReq& p, params& params) {
+2 −1
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ module TestCodec_Pki {
  import from LibItsPki_Templates all;
  import from LibItsPki_Functions all;
  import from LibItsPki_TestSystem all;
  import from LibItsPki_Pixits all;
  
  // TestCodec
  import from TestCodec_TestAndSystem all;
@@ -182,7 +183,7 @@ module TestCodec_Pki {
    
    // 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_request_message_signed_with_pop(v_private_key, valueof(m_signerIdentifier_self), int2oct(0, 8), v_publicKeyCompressed, v_compressedMode, ''O, bit2oct(v_inner_ec_request_signed_for_pop_msg), v_ieee1609dot2_signed_and_encrypted_data, v_aes_sym_key, v_encrypted_sym_key, v_authentication_vector, v_nonce, v_request_hash) == false) {
    if (f_build_pki_secured_request_message_signed_with_pop(v_private_key, valueof(m_signerIdentifier_self), int2oct(0, 8), v_publicKeyCompressed, v_compressedMode, ''O, bit2oct(v_inner_ec_request_signed_for_pop_msg), PX_EC_ALG_FOR_EC, v_ieee1609dot2_signed_and_encrypted_data, v_aes_sym_key, v_encrypted_sym_key, v_authentication_vector, v_nonce, v_request_hash) == false) {
      setverdict(fail, "Failed to secure InnerEcRequest message");
      stop;
    }