/* * @author * * @version * 1.0 * @desc * * @remark * * @see * */ module TestCodec_Pki { // Libcommon import from LibCommon_Time all; import from LibCommon_VerdictControl all; import from LibCommon_Sync all; import from LibCommon_BasicTypesAndValues all; import from LibCommon_DataStrings all; // LibIts import from IEEE1609dot2BaseTypes language "ASN.1:1997" all; import from IEEE1609dot2 language "ASN.1:1997" all; import from EtsiTs102941BaseTypes language "ASN.1:1997" all; import from EtsiTs102941TypesEnrolment language "ASN.1:1997" all; import from EtsiTs102941MessagesItss language "ASN.1:1997" all; import from EtsiTs103097Module language "ASN.1:1997" all; // LibItsCommon import from LibItsCommon_TypesAndValues all; import from LibItsCommon_TypesAndValues all; import from LibItsCommon_ASN1_NamedNumbers all; // LibItsSecurity import from LibItsSecurity_TypesAndValues all; import from LibItsSecurity_Templates all; import from LibItsSecurity_Functions all; // LibItsHttp import from LibItsHttp_TypesAndValues all; import from LibItsHttp_Templates all; import from LibItsHttp_BinaryTemplates all; import from LibItsHttp_Functions all; // LibItsPki import from LibItsPki_EncdecDeclarations all; import from LibItsPki_Templates all; import from LibItsPki_TestSystem all; // TestCodec import from TestCodec_TestAndSystem all; testcase tc_inner_ec_request_1() runs on TCType system TCType { var integer v_res := 0; var EtsiTs103097Certificate v_certificate; var InnerEcRequest v_innerEcRequest; var InnerEcRequest v_exp_innerEcReq; var bitstring v_exp_enc_msg := oct2bit('0004544F444F01008083A72B88B6A1ADEEBA7FC18772952F053A81BD18635EE5AB08ED1376C107B5413968831874E3808466A8C0'O); var bitstring v_enc_msg := oct2bit('8003008100288300000000001874e3808466a8c001018080010e80012482080301ffff0301ffff800125820a0401ffffff0401ffffff800189820a0401ffffff0401ffffff80018a820a0401ffffff0401ffffff80018b820a0401ffffff0401ffffff80018c820a0401ffffff0401ffffff00018d0001600001610001620001630001640001650001660102808083a72b88b6a1adeeba7fc18772952f053a81bd18635ee5ab08ed1376c107b541398080c0290e397381bf7502a0e6a6b271d8e2f18fc8311f591f0528a673ee5169f670e224ac455b5e67eb251cc1467f6ffc6840987c8c8eb9245c22be73322b64ca54'O); // CERT_IUT_A_RCA.oer var Oct32 v_private_key := 'd79ef1d533b0385463a5d15708e94ff4f0d281cccbef504acd3afbb82dc0499f'O; // CERT_IUT_A_RCA.vkey // Decode certificate v_res := decvalue(v_enc_msg, v_certificate); if (v_res == 0) { log("Decoded message: ", v_certificate); setverdict(pass, "Decoded certificate succeed"); } else { setverdict(fail, "Decoding certificate failed"); } // Create InnerEcRequest request v_innerEcRequest := valueof(m_innerEcRequest( "TODO", m_publicKeys( v_certificate.toBeSigned.verifyKeyIndicator.verificationKey, v_certificate.toBeSigned.encryptionKey ), m_certificateSubjectAttributes( v_certificate.toBeSigned.appPermissions, v_certificate.toBeSigned.validityPeriod, v_certificate.toBeSigned.region, v_certificate.toBeSigned.assuranceLevel ))); // Encode InnerEcRequest template log("Encode template ", v_innerEcRequest); v_enc_msg := encvalue(v_innerEcRequest); log("Encoded message: ", bit2oct(v_enc_msg)); // Check result if (not isbound(v_enc_msg)) { setverdict(fail, "Encoding InnerEcRequest failed!"); stop; } if (not match(v_enc_msg, v_exp_enc_msg)) { log("Expected message: ", bit2oct(valueof(v_exp_enc_msg))); setverdict(fail, "Encoding InnerEcRequest failed, not the expected result!"); stop; } v_res := decvalue(v_exp_enc_msg, v_exp_innerEcReq); if (v_res == 0) { log("Decoded message: ", v_certificate); setverdict(pass, "Decoded succeed"); if (not match(v_innerEcRequest, v_exp_innerEcReq)) { log("Expected message: ", bit2oct(valueof(v_exp_enc_msg))); setverdict(fail, "Encoding failed, not the expected result!"); stop; } } else { setverdict(fail, "Decoding failed"); } setverdict(pass, "Encoding passed."); } // End of testcase tc_inner_ec_request_1 testcase tc_http_inner_ec_request_1() runs on ItsPki system ItsPkiSystem { var integer v_res := 0; var EtsiTs103097Certificate v_certificate; var InnerEcRequest v_innerEcRequest; var InnerEcRequest v_exp_innerEcReq; var bitstring v_exp_enc_msg := oct2bit('0004544F444F01008083A72B88B6A1ADEEBA7FC18772952F053A81BD18635EE5AB08ED1376C107B5413968831874E3808466A8C0'O); var bitstring v_enc_msg := oct2bit('8003008100288300000000001874e3808466a8c001018080010e80012482080301ffff0301ffff800125820a0401ffffff0401ffffff800189820a0401ffffff0401ffffff80018a820a0401ffffff0401ffffff80018b820a0401ffffff0401ffffff80018c820a0401ffffff0401ffffff00018d0001600001610001620001630001640001650001660102808083a72b88b6a1adeeba7fc18772952f053a81bd18635ee5ab08ed1376c107b541398080c0290e397381bf7502a0e6a6b271d8e2f18fc8311f591f0528a673ee5169f670e224ac455b5e67eb251cc1467f6ffc6840987c8c8eb9245c22be73322b64ca54'O); // CERT_IUT_A_RCA.oer var Oct32 v_private_key := 'd79ef1d533b0385463a5d15708e94ff4f0d281cccbef504acd3afbb82dc0499f'O; // CERT_IUT_A_RCA.vkey var HeaderLines v_headers; var HttpMessage v_response; map(self:httpPort, system:httpPort); // Decode certificate v_res := decvalue(v_enc_msg, v_certificate); if (v_res == 0) { log("Decoded message: ", v_certificate); setverdict(pass, "Decoded certificate succeed"); } else { setverdict(fail, "Decoding certificate failed"); } // Create HTTP InnerEcRequest request f_init_default_headers_list(v_headers); httpPort.send( m_http_request( m_http_request_post( "/", v_headers, m_http_message_body_binary( m_binary_body_innerEcRequest( m_innerEcRequest( "TODO", m_publicKeys( v_certificate.toBeSigned.verifyKeyIndicator.verificationKey, v_certificate.toBeSigned.encryptionKey ), m_certificateSubjectAttributes( v_certificate.toBeSigned.appPermissions, v_certificate.toBeSigned.validityPeriod, v_certificate.toBeSigned.region, v_certificate.toBeSigned.assuranceLevel ))))))); tc_ac.start; alt { [] httpPort.receive(mw_http_response) -> value v_response{ tc_ac.stop; setverdict(pass, "Encoding passed."); } [] tc_ac.timeout { setverdict(inconc, "No response"); } } // End of 'alt' statement unmap(self:httpPort, system:httpPort); } // End of testcase tc_http_inner_ec_request_1 testcase tc_inner_ec_request_2() runs on TCType system TCType { var template (value) EtsiTs103097Data v_signed_data; var EtsiTs103097Data v_signed_data_dec; var template (value) EtsiTs103097Data v_encrypted_data; var EtsiTs103097Data v_encrypted_data_dec; var EtsiTs103097Certificate v_certificate; var InnerEcRequest v_innerEcRequest; var bitstring v_enc_msg; var integer v_res := 0; var bitstring v_exp_enc_msg := oct2bit('340010'O); var octetstring v_raw_payload_to_be_signed; var HashedId8 v_digest := '0000000000000000'O; var HashedId8 v_encrypted_hashedId8 := '0000000000000000'O; f_readCertificate("CERT_IUT_F_AT", v_certificate); v_innerEcRequest := valueof(m_innerEcRequest( "TODO", m_publicKeys( v_certificate.toBeSigned.verifyKeyIndicator.verificationKey, v_certificate.toBeSigned.encryptionKey ), m_certificateSubjectAttributes( v_certificate.toBeSigned.appPermissions, v_certificate.toBeSigned.validityPeriod, v_certificate.toBeSigned.region, v_certificate.toBeSigned.assuranceLevel ))); // Encode template v_raw_payload_to_be_signed := bit2oct(encvalue(v_innerEcRequest)); log("Encode InnerEcRequest template ", v_raw_payload_to_be_signed); // Signed data v_signed_data := m_etsiTs103097Data_signed( m_signedData( sha256, m_toBeSignedData( m_signedDataPayload( m_etsiTs103097Data_unsecured(v_raw_payload_to_be_signed) ), m_headerInfo_gn( -, 12345 ) ), { digest := v_digest }, m_signature_ecdsaNistP256( m_ecdsaP256Signature( m_eccP256CurvePoint_x_only( '08B2030104020A0D010C0105C0F80BB1460239348D17405C1A845151D4061200'O ), '2617CF4E6B25097F03F502AD0C6F2F125974700D31A60FD1EF12040E4D8231AB'O ) ) ) ); log("v_signed_data = ", v_signed_data); v_enc_msg := encvalue(valueof(v_signed_data)); setverdict(pass, "Encoding passed."); if (decvalue(v_enc_msg, v_signed_data_dec) != 0) { setverdict(fail); stop; } else if (not(match(valueof(v_signed_data), v_signed_data_dec))) { setverdict(fail); stop; } setverdict(pass, "Decoding passed."); v_encrypted_data := m_etsiTs103097Data_encrypted( m_encryptedData( { m_recipientInfo_certRecipInfo( m_pKRecipientInfo( v_encrypted_hashedId8, m_encryptedDataEncryptionKey_eciesNistP256( m_evciesP256EncryptedKey( m_eccP256CurvePoint_x_only( '08B2030104020A0D010C0105C0F80BB1460239348D17405C1A845151D4061200'O ), '01020304050607080010203040506070'O, '01020304050607080010203040506070'O ) ) ) ) }, m_SymmetricCiphertext_aes128ccm( m_aesCcmCiphertext( '0102030405060708090a0b0c'O, bit2oct(v_enc_msg) ) ) ) ); v_enc_msg := encvalue(valueof(v_encrypted_data)); setverdict(pass, "Encoding passed."); if (decvalue(v_enc_msg, v_encrypted_data_dec) != 0) { setverdict(fail); stop; } else if (not(match(valueof(v_encrypted_data), v_encrypted_data_dec))) { setverdict(fail); stop; } setverdict(pass, "Decoding passed."); } // End of testcase tc_inner_ec_request_2 testcase tc_inner_ec_response_1() runs on TCType system TCType { var integer v_res := 0; var EtsiTs103097Certificate v_certificate; var InnerEcResponse v_innerEcResponse; var bitstring v_exp_enc_msg := oct2bit('400000000000000000000000000000000A0080030080DB4F29FDF09200D2708300000000001A5617008422388301018000FA60010380012481040301FFFF80012581050401FFFFFF80018D810201008080823C5C40E2D3117A493E97ECA2EA7AE164A2E3EBC856EEC760428442076370ED83808051AAE5E5DB859816DE75DB80112FBA869E2704829B912D1BE3B082F2E531C061C5699757849F335C816DDDA1742E3E6C0C2A0930146D1E0697BF035B14655AFD'O); var bitstring v_enc_msg := oct2bit('80030080db4f29fdf09200d2708300000000001a5617008422388301018000fa60010380012481040301ffff80012581050401ffffff80018d810201008080823c5c40e2d3117a493e97eca2ea7ae164a2e3ebc856eec760428442076370ed83808051aae5e5db859816de75db80112fba869e2704829b912d1be3b082f2e531c061c5699757849f335c816ddda1742e3e6c0c2a0930146d1e0697bf035b14655afd'O); // CERT_IUT_E_AT.oer var Oct32 v_private_key := '9e85f9242800761c6ee2889bb7bbad8942927caad8519729f8475ee50302e7f7'O; // CERT_IUT_E_AT.vkey // Decode certificate v_res := decvalue(v_enc_msg, v_certificate); if (v_res == 0) { log("Decoded message: ", v_certificate); setverdict(pass, "Decoded succeed"); } else { setverdict(fail, "Decoding failed"); } // Create InnerEcResponse request v_innerEcResponse := valueof(m_innerEcResponse_ok( int2oct(10, 16), v_certificate )); // Encode InnerEcResponse template log("Encode template ", v_innerEcResponse); v_enc_msg := encvalue(v_innerEcResponse); log("Encoded message: ", bit2oct(v_enc_msg)); // Check result if (not isbound(v_enc_msg)) { setverdict(fail, "Encoding failed!"); stop; } if (not match(v_enc_msg, v_exp_enc_msg)) { log("Expected message: ", bit2oct(valueof(v_exp_enc_msg))); setverdict(fail, "Encoding failed, not the expected result!"); stop; } setverdict(pass, "Encoding passed."); } // End of testcase tc_inner_ec_response_1 control { execute(tc_inner_ec_request_1()); execute(tc_inner_ec_request_2()); execute(tc_inner_ec_response_1()); } } // End of module TestCodec_Pki