TestCodec_Pki.ttcn 20.2 KB
Newer Older
garciay's avatar
garciay committed
/*
 * @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;
garciay's avatar
garciay committed
  import from LibCommon_DataStrings all;
garciay's avatar
garciay committed
  
  // 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;
  
garciay's avatar
garciay committed
  // LibItsHttp
  import from LibItsHttp_TypesAndValues all;
  import from LibItsHttp_Templates all;
  import from LibItsHttp_BinaryTemplates all;
  import from LibItsHttp_Functions all;
Yann Garcia's avatar
Yann Garcia committed
  import from LibItsHttp_TestSystem all;
garciay's avatar
garciay committed
    
garciay's avatar
garciay committed
  // LibItsPki
garciay's avatar
garciay committed
  import from LibItsPki_EncdecDeclarations all;
garciay's avatar
garciay committed
  import from LibItsPki_Templates all;
garciay's avatar
garciay committed
  import from LibItsPki_TestSystem all;
garciay's avatar
garciay committed
  
  // 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;
garciay's avatar
garciay committed
    var InnerEcRequest v_exp_innerEcReq;
garciay's avatar
garciay committed
    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
garciay's avatar
garciay committed

    // Decode certificate
    v_res := decvalue(v_enc_msg, v_certificate);
    if (v_res == 0) {
      log("Decoded message: ", v_certificate);
garciay's avatar
garciay committed
      setverdict(pass, "Decoded certificate succeed");
garciay's avatar
garciay committed
    } else {
garciay's avatar
garciay committed
      setverdict(fail, "Decoding certificate failed");
garciay's avatar
garciay committed
    }

    // Create InnerEcRequest request
garciay's avatar
garciay committed
    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
                                                 )));
garciay's avatar
garciay committed
    // Encode InnerEcRequest template
garciay's avatar
garciay committed
    log("Encode template ", v_innerEcRequest);
garciay's avatar
garciay committed
    v_enc_msg := encvalue(v_innerEcRequest);
    log("Encoded message:  ", bit2oct(v_enc_msg));
garciay's avatar
garciay committed
    // Check result
garciay's avatar
garciay committed
    if (not isbound(v_enc_msg)) {
      setverdict(fail, "Encoding InnerEcRequest failed!");
garciay's avatar
garciay committed
      stop;
    }
garciay's avatar
garciay committed
    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!");
garciay's avatar
garciay committed
      stop;
    }
garciay's avatar
garciay committed
    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");
garciay's avatar
garciay committed
    }
    setverdict(pass, "Encoding passed.");
garciay's avatar
garciay committed
  } // End of testcase tc_inner_ec_request_1
garciay's avatar
garciay committed
  
Yann Garcia's avatar
Yann Garcia committed
  testcase tc_http_inner_ec_request_1() runs on HttpComponent system HttpTestAdapter {
garciay's avatar
garciay committed
    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;
Yann Garcia's avatar
Yann Garcia committed
    var Ieee1609Dot2Data v_ieee1609dot2_data;
garciay's avatar
garciay committed

    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(
Yann Garcia's avatar
Yann Garcia committed
                                                                                m_binary_body_ieee1609dot2_data(
                                                                                                                v_ieee1609dot2_data
                                                                                                               )))));
//                                                                                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
//                                                                                                                                                             )))))));
garciay's avatar
garciay committed
    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
  
garciay's avatar
garciay committed
  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;
garciay's avatar
garciay committed
    var bitstring v_enc_msg;
garciay's avatar
garciay committed
    var integer v_res := 0;
garciay's avatar
garciay committed
    var bitstring v_exp_enc_msg := oct2bit('340010'O);
garciay's avatar
garciay committed
    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);
garciay's avatar
garciay committed
    v_enc_msg := encvalue(valueof(v_signed_data));
garciay's avatar
garciay committed
    setverdict(pass, "Encoding passed.");
garciay's avatar
garciay committed
    if (decvalue(v_enc_msg, v_signed_data_dec) != 0) {
garciay's avatar
garciay committed
      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,
garciay's avatar
garciay committed
                                                                                                                        bit2oct(v_enc_msg)
garciay's avatar
garciay committed
  v_enc_msg := encvalue(valueof(v_encrypted_data));
garciay's avatar
garciay committed
    setverdict(pass, "Encoding passed.");
garciay's avatar
garciay committed
    if (decvalue(v_enc_msg, v_encrypted_data_dec) != 0) {
garciay's avatar
garciay committed
      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
  
garciay's avatar
garciay committed
  testcase tc_inner_ec_response_1() runs on TCType system TCType {
    var integer v_res := 0;
    var EtsiTs103097Certificate v_certificate;
    var InnerEcResponse v_innerEcResponse;
garciay's avatar
garciay committed
    var bitstring v_exp_enc_msg := oct2bit('400000000000000000000000000000000A0080030080DB4F29FDF09200D2708300000000001A5617008422388301018000FA60010380012481040301FFFF80012581050401FFFFFF80018D810201008080823C5C40E2D3117A493E97ECA2EA7AE164A2E3EBC856EEC760428442076370ED83808051AAE5E5DB859816DE75DB80112FBA869E2704829B912D1BE3B082F2E531C061C5699757849F335C816DDDA1742E3E6C0C2A0930146D1E0697BF035B14655AFD'O);
garciay's avatar
garciay committed
    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