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

STF545: Finalyse & validate first test case

parent 626c18af
...@@ -23,6 +23,17 @@ namespace LibItsCommon__Functions ...@@ -23,6 +23,17 @@ namespace LibItsCommon__Functions
i.set_long_long_val(base_time::get_instance().get_its_current_time()); i.set_long_long_val(base_time::get_instance().get_its_current_time());
return i; 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 * @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 * @return TimeMark - tenths of a second in the current or next hour in units of 1/10th second from UTC time
......
...@@ -17,7 +17,7 @@ using namespace std; // Required for isnan() ...@@ -17,7 +17,7 @@ using namespace std; // Required for isnan()
#include "LibItsPki_TypesAndValues.hh" #include "LibItsPki_TypesAndValues.hh"
#include "LibItsPki_TestSystem.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()); 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) ...@@ -86,11 +86,39 @@ void pki_layer::receive_data(OCTETSTRING& data, params& params)
{ {
loggers::get_instance().log_msg(">>> pki_layer::receive_data: ", data); loggers::get_instance().log_msg(">>> pki_layer::receive_data: ", data);
IEEE1609dot2::Ieee1609Dot2Data etsi_ts_1609dot2_data; // 1. Extract EtsiTs102941Data or EtsiTs103097DataSigned
if (decrypt_and_check_signature(data, etsi_ts_1609dot2_data, _params) == -1) { 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"); loggers::get_instance().warning("pki_layer::sendMsg: Failed to secure Pki message");
return; 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 // Pass it to the ports
//to_all_upper_ports(pki_message, params); //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 ...@@ -200,15 +228,24 @@ int pki_layer::sign_and_encrypt_payload(const OCTETSTRING& p_etsi_ts_102941_data
return 0; 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); loggers::get_instance().log_msg(">>> pki_layer::decrypt_and_check_signature: ", p_signed_and_encrypted_data);
// 1. Decrypt the Pki message // 1. Decrypt the Pki message
OCTETSTRING os; OCTETSTRING os;
if (security_services::get_instance().decrypt_gn_payload(p_signed_and_encrypted_data, os, p_params) == -1) { 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; return -1;
} }
loggers::get_instance().log_msg("pki_layer::decrypt_and_check_signature: EtsiTs103097Data-Signed=", etsi_ts_1609dot2_data);
return 0; return 0;
} }
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "etsi_ts102941_types_enrolment_inner_request.hh" #include "etsi_ts102941_types_enrolment_inner_request.hh"
#include "etsi_ts102941_types_enrolment_inner_response.hh" #include "etsi_ts102941_types_enrolment_inner_response.hh"
#include "etsi_ts103097_data_codec.hh" #include "etsi_ts103097_data_codec.hh"
#include "etsi_ts102941_data.hh"
namespace LibItsPki__TestSystem { namespace LibItsPki__TestSystem {
class PkiPort; //! Forward declaration of TITAN class class PkiPort; //! Forward declaration of TITAN class
...@@ -37,9 +38,10 @@ class pki_layer : public t_layer<LibItsPki__TestSystem::PkiPort> { ...@@ -37,9 +38,10 @@ class pki_layer : public t_layer<LibItsPki__TestSystem::PkiPort> {
static constexpr unsigned int ProtocolVersion = 1; static constexpr unsigned int ProtocolVersion = 1;
params _params; params _params;
etsi_ts102941_types_enrolment_inner_request _etsi_ts102941_types_enrolment_inner_request; 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; 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; 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; std::unique_ptr<LibItsPki__TypesAndValues::AcSetSecurityData> _ac_set_security_data;
...@@ -50,7 +52,7 @@ public: //! \publicsection ...@@ -50,7 +52,7 @@ public: //! \publicsection
* \param[in] p_type \todo * \param[in] p_type \todo
* \param[in] p_param \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 * \brief Specialised constructor
* Create a new instance of the pki_layer class * Create a new instance of the pki_layer class
...@@ -112,6 +114,6 @@ private: ...@@ -112,6 +114,6 @@ private:
* \param[in] p_params Some lower layers parameters values when data was received * \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 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 }; // End of class pki_layer
...@@ -156,15 +156,15 @@ int security_services::process_ieee_1609_dot2_signed_data(const IEEE1609dot2::Si ...@@ -156,15 +156,15 @@ int security_services::process_ieee_1609_dot2_signed_data(const IEEE1609dot2::Si
return -1; return -1;
} }
} else { } else {
const OPTIONAL<INTEGER>& v = dynamic_cast<const OPTIONAL<INTEGER>& >(header_info.generationTime()); 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() * 1000 - base_time::get_instance().get_its_base_time(); 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 // 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); 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 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"); loggers::get_instance().warning("security_services::process_ieee_1609_dot2_signed_data: Invalid generation time, discard it");
if (p_verify) { 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 ...@@ -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) { 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_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_x;
OCTETSTRING public_key_y; OCTETSTRING public_key_y;
......
...@@ -383,7 +383,7 @@ module ItsPki_TestCases { ...@@ -383,7 +383,7 @@ module ItsPki_TestCases {
// Test control // Test control
// Test component configuration // Test component configuration
f_cfHttpUp(); f_cfHttpUp(); // Default value: CERT_TS_A_EA
// Test adapter configuration // Test adapter configuration
...@@ -403,7 +403,7 @@ module ItsPki_TestCases { ...@@ -403,7 +403,7 @@ module ItsPki_TestCases {
} }
// Secure InnerEcRequestSignedForPoP message // 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)); 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 ***") log("*** " & testcasename() & ": FAIL: Failed to seucure InnerEcRequestPoP message ***")
f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error); f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error);
stop; stop;
......
Subproject commit 302a7df961902fe0be1e35cbf6e8cb848f2f3577 Subproject commit f18d6e1245310ecab9e33e80c741d40694590ff8
...@@ -10,6 +10,12 @@ module TestCodec_ExternalFunctions { ...@@ -10,6 +10,12 @@ module TestCodec_ExternalFunctions {
// TestCodec // TestCodec
import from TestCodec_TestAndSystem all; import from TestCodec_TestAndSystem all;
testcase tc_f_getCurrentTime() runs on TCType system TCType {
var integer v_timeStamp := 0;
v_timeStamp := fx_getCurrentTime();
log("v_timeStamp= ", v_timeStamp);
}
testcase tc_f_computePositionUsingDistance() runs on TCType system TCType { testcase tc_f_computePositionUsingDistance() runs on TCType system TCType {
var Int32 v_latitude; var Int32 v_latitude;
var Int32 v_longitude; var Int32 v_longitude;
......
...@@ -387,8 +387,12 @@ module TestCodec_Pki { ...@@ -387,8 +387,12 @@ module TestCodec_Pki {
var EtsiTs103097Certificate v_cert_iut_a_ea; var EtsiTs103097Certificate v_cert_iut_a_ea;
var Oct32 v_private_key_cert_ts_a_ea; var Oct32 v_private_key_cert_ts_a_ea;
var Oct32 v_private_key_cert_iut_a_ea; var Oct32 v_private_key_cert_iut_a_ea;
var Oct32 v_private_enc_key_cert_ts_a_ea;
var Oct32 v_private_enc_key_cert_iut_a_ea;
var Oct8 v_hashed_id8_cert_ts_a_ea; var Oct8 v_hashed_id8_cert_ts_a_ea;
var Oct8 v_hashed_id8_cert_iut_a_ea; var Oct8 v_hashed_id8_cert_iut_a_ea;
var Oct32 v_whole_hash_cert_ts_a_ea;
var Oct32 v_whole_hash_cert_iut_a_ea;
var bitstring v_tbs; var bitstring v_tbs;
var Oct32 v_sig; var Oct32 v_sig;
var bitstring v_enc_msg; var bitstring v_enc_msg;
...@@ -413,8 +417,12 @@ module TestCodec_Pki { ...@@ -413,8 +417,12 @@ module TestCodec_Pki {
f_readCertificate("CERT_IUT_A_EA", v_cert_iut_a_ea); f_readCertificate("CERT_IUT_A_EA", v_cert_iut_a_ea);
f_readSigningKey("CERT_TS_A_EA", v_private_key_cert_ts_a_ea); f_readSigningKey("CERT_TS_A_EA", v_private_key_cert_ts_a_ea);
f_readSigningKey("CERT_IUT_A_EA", v_private_key_cert_iut_a_ea); f_readSigningKey("CERT_IUT_A_EA", v_private_key_cert_iut_a_ea);
f_readEncryptingKey("CERT_TS_A_EA", v_private_enc_key_cert_ts_a_ea);
f_readEncryptingKey("CERT_IUT_A_EA", v_private_enc_key_cert_iut_a_ea);
f_getCertificateDigest("CERT_TS_A_EA", v_hashed_id8_cert_ts_a_ea); f_getCertificateDigest("CERT_TS_A_EA", v_hashed_id8_cert_ts_a_ea);
f_getCertificateDigest("CERT_IUT_A_EA", v_hashed_id8_cert_iut_a_ea); f_getCertificateDigest("CERT_IUT_A_EA", v_hashed_id8_cert_iut_a_ea);
f_getCertificateHash("CERT_TS_A_EA", v_whole_hash_cert_ts_a_ea);
f_getCertificateHash("CERT_IUT_A_EA", v_whole_hash_cert_iut_a_ea);
f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode); f_generate_key_pair_nistp256(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode);
// Build certificate based on keys // Build certificate based on keys
...@@ -498,17 +506,27 @@ module TestCodec_Pki { ...@@ -498,17 +506,27 @@ module TestCodec_Pki {
} }
// Decrypt InnerEcResponse // Decrypt InnerEcResponse
f_decrypt(v_private_key_cert_ts_a_ea, v_dec_ieee1609dot2_signed_and_encrypted_data, v_dec_ieee1609dot2_signed_data); f_decrypt(v_private_enc_key_cert_ts_a_ea, v_dec_ieee1609dot2_signed_and_encrypted_data, v_dec_ieee1609dot2_signed_data);
log("v_dec_ieee1609dot2_signed_data= ", v_dec_ieee1609dot2_signed_data); log("v_dec_ieee1609dot2_signed_data= ", v_dec_ieee1609dot2_signed_data);
// Verify signature // Verify signature
v_tbs := encvalue(v_dec_ieee1609dot2_signed_data.content.signedData.tbsData); v_tbs := encvalue(v_dec_ieee1609dot2_signed_data.content.signedData.tbsData);
if (fx_verifyWithEcdsaNistp256WithSha256( if (ischosen(v_cert_iut_a_ea.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0)) {
v_ret := f_verifyWithEcdsaNistp256WithSha256(
bit2oct(v_tbs), bit2oct(v_tbs),
int2oct(0, 32), v_whole_hash_cert_iut_a_ea,
v_dec_ieee1609dot2_signed_data.content.signedData.signature_.ecdsaNistP256Signature.rSig.x_only & v_dec_ieee1609dot2_signed_data.content.signedData.signature_.ecdsaNistP256Signature.sSig, v_dec_ieee1609dot2_signed_data.content.signedData.signature_.ecdsaNistP256Signature.rSig.x_only & v_dec_ieee1609dot2_signed_data.content.signedData.signature_.ecdsaNistP256Signature.sSig,
v_publicKeyCompressed, v_cert_iut_a_ea.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_0,
v_compressedMode) == true) { 0);
} else {
v_ret := f_verifyWithEcdsaNistp256WithSha256(
bit2oct(v_tbs),
v_whole_hash_cert_iut_a_ea,
v_dec_ieee1609dot2_signed_data.content.signedData.signature_.ecdsaNistP256Signature.rSig.x_only & v_dec_ieee1609dot2_signed_data.content.signedData.signature_.ecdsaNistP256Signature.sSig,
v_cert_iut_a_ea.toBeSigned.verifyKeyIndicator.verificationKey.ecdsaNistP256.compressed_y_1,
1);
}
if (v_ret == true) {
setverdict(pass, "Check signature succeed"); setverdict(pass, "Check signature succeed");
} else { } else {
setverdict(fail, "Check signature failed"); setverdict(fail, "Check signature failed");
...@@ -523,6 +541,21 @@ module TestCodec_Pki { ...@@ -523,6 +541,21 @@ module TestCodec_Pki {
setverdict(pass, "Decoded succeed"); setverdict(pass, "Decoded succeed");
if (match(v_dec_inner_ec_response.content.enrolmentResponse, v_inner_ec_response)) { if (match(v_dec_inner_ec_response.content.enrolmentResponse, v_inner_ec_response)) {
setverdict(pass, "Decoded match succeed"); setverdict(pass, "Decoded match succeed");
// Extract the new EA certificate
v_cert := v_dec_inner_ec_response.content.enrolmentResponse.certificate;
// Check signature
v_tbs := encvalue(v_cert.toBeSigned);
if (f_verifyWithEcdsaNistp256WithSha256(
bit2oct(v_tbs),
int2oct(11, 32),
valueof(v_cert.signature_.ecdsaNistP256Signature.rSig.x_only) & valueof(v_cert.signature_.ecdsaNistP256Signature.sSig),
v_publicKeyCompressed,
v_compressedMode) == true) {
setverdict(pass, "Check signature succeed");
} else {
setverdict(fail, "Check signature failed");
stop;
}
} else { } else {
setverdict(fail, "Decoded match failed"); setverdict(fail, "Decoded match failed");
stop; stop;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment