Skip to content
ItsPki_TestCases.ttcn 19.6 KiB
Newer Older
garciay's avatar
garciay committed
/**
 *  @author   ETSI / STF545
 *  @version  $URL$
 *            $Id$
 *  @desc     Testcases  file for Security Protocol
 *  @reference   ETSI TS ITS-00546v006
 *  @copyright   ETSI Copyright Notification
 *               No part may be reproduced except as authorized by written permission.
 *               The copyright and the foregoing restriction extend to reproduction in all media.
 *               All rights reserved.
 */
module ItsPki_TestCases {
Yann Garcia's avatar
Yann Garcia committed
  
garciay's avatar
garciay committed
  // Libcommon
  import from LibCommon_Time all;
  import from LibCommon_VerdictControl all;
  import from LibCommon_Sync all;
  import from LibCommon_BasicTypesAndValues all;
Yann Garcia's avatar
Yann Garcia 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;
  import from ITS_Container language "ASN.1:1997" all;
  import from CAM_PDU_Descriptions language "ASN.1:1997" all;
Yann Garcia's avatar
Yann Garcia committed
  
garciay's avatar
garciay committed
  // LibItsCommon
Yann Garcia's avatar
Yann Garcia committed
  import from LibItsCommon_TypesAndValues all;
garciay's avatar
garciay committed
  import from LibItsCommon_Functions all;
Yann Garcia's avatar
Yann Garcia committed
  import from LibItsCommon_TypesAndValues all;
garciay's avatar
garciay committed
  import from LibItsCommon_ASN1_NamedNumbers all;
Yann Garcia's avatar
Yann Garcia committed
  
  // LibItsGeoNetworking
  import from LibItsGeoNetworking_TestSystem all;
  import from LibItsGeoNetworking_Functions all;
  import from LibItsGeoNetworking_Templates all;
  import from LibItsGeoNetworking_TypesAndValues all;
  import from LibItsGeoNetworking_Pics all;
  
garciay's avatar
garciay committed
  // LibItsSecurity
  import from LibItsSecurity_TypesAndValues all;
  import from LibItsSecurity_TestSystem all;
  import from LibItsSecurity_Templates all;
  import from LibItsSecurity_Functions all;
  import from LibItsSecurity_Pixits all;
  import from LibItsSecurity_Pics all;
Yann Garcia's avatar
Yann Garcia committed
  
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
    
  // LibItsPki
  import from LibItsPki_Templates all;
Yann Garcia's avatar
Yann Garcia committed
  import from LibItsPki_Functions all;
garciay's avatar
garciay committed
  import from LibItsPki_TestSystem all;
    
  // AtsPki
  import from ItsPki_Functions all;

  /**
   * @desc 5.2	ITS-S behaviour
   */
  group itss_behavior {

    group itss_manufacturing {
Yann Garcia's avatar
Yann Garcia committed
      
garciay's avatar
garciay committed
      /**
       * @desc Check that IUT sends an enrolment request when triggered.
       * <pre>
       * Pics Selection: 
       * Initial conditions: 
       *     with {
       *         the IUT being in the "initial state"
       *     }
       * Expected behaviour:
       *     ensure that {
       *         when {
       *             the IUT is triggered to requested a new Enrolment Certificate (EC)
       *         }
       *         then {
       *             the IUT sends to EA an EnrolmentRequestMessage
       *         }
       *     }
       * </pre>
       * 
       * @see       ETSI TS ITS-00546v006 TP 2
       * @reference ETSI TS 102 941 [2], clause 6.1.3
       */
Yann Garcia's avatar
Yann Garcia committed
      testcase TC_SEC_PKI_ITSS_ENR_BV_01() runs on ItsMtc /*system ItsPkiItssSystem*/ {
garciay's avatar
garciay committed
        // Local variables
Yann Garcia's avatar
Yann Garcia committed
        var ItsPkiItss v_itss;
        var ItsPki     v_ea;
        
garciay's avatar
garciay committed
        // Test component configuration
Yann Garcia's avatar
Yann Garcia committed
        //f_cfUp_itss();
        
        v_itss.start(f_TC_SEC_PKI_ITSS_ENR_BV_01_itss(cc_taCert_A));
        v_ea.start(f_TC_SEC_PKI_ITSS_ENR_BV_01_pki(cc_taCert_A));
        
        // Synchronization
        f_serverSync2ClientsAndStop({c_prDone, c_tbDone, c_poDone});
garciay's avatar
garciay committed
        
Yann Garcia's avatar
Yann Garcia committed
        // Cleanup
        //f_cfDown_itss();
garciay's avatar
garciay committed
        
      } // End of testcase TC_SEC_PKI_ITSS_ENR_BV_01
      
Yann Garcia's avatar
Yann Garcia committed
      group f_TC_SEC_PKI_ITSS_ENR_BV_01 {
        
        function f_TC_SEC_PKI_ITSS_ENR_BV_01_itss(in charstring p_certificate_id) runs on ItsPkiItss /*system ItsPkiItssSystem*/ {
                
            // Local variables
            var LongPosVector v_longPosVectorIut;
Yann Garcia's avatar
Yann Garcia committed
            var GeoNetworkingInd v_response;
            var EtsiTs103097Certificate v_initial_certificate;
Yann Garcia's avatar
Yann Garcia committed
                
            // Test control
            if (not(PICS_GN_SECURITY)) {
                log("*** " & testcasename() & ":ERROR: 'PICS_GN_SECURITY' required for executing the TC ***");
                stop;
            }
            
            // Test component configuration
            f_cf01Up(); // Initialise IUT with CERT_IUT_A_AT signed with CERT_IUT_A_AA
            v_longPosVectorIut := f_getPosition(c_compIut);
                
            // Test adapter configuration
            
            // Preamble
            f_prNeighbour();
            f_acTriggerEvent(m_startPassBeaconing(m_beaconHeader(v_longPosVectorIut).beaconHeader)); // Authorize the TA to forward the received beacons
Yann Garcia's avatar
Yann Garcia committed
            // Wait for current certificate
            tc_ac.start;
            alt {
                [] geoNetworkingPort.receive(
                    mw_geoNwInd(
                        mw_geoNwSecPdu(
                            mw_etsiTs103097Data_signed(
                                mw_signedData(
                                    -, 
                                    mw_toBeSignedData(
                                        mw_signedDataPayload,
                                        mw_headerInfo_cam
                                    ),
                                    mw_signerIdentifier_certificate(
                                        mw_etsiTs103097Certificate(
                                            -,
                                            mw_toBeSignedCertificate_at(
                                                { mw_appPermissions(c_its_aid_CAM) }
                                            )
                                        )
                                    )
                                )
                            ), 
                            mw_geoNwShbPacket
                ))) -> value v_response {
                  tc_ac.stop;
                  
                  log("*** " & testcasename() & ": INFO: Receieve initial certificate");
                  // Extract the initial certificate
                  // TODO v_initial_certificate := 
                  f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
                }
                [] geoNetworkingPort.receive(
                    mw_geoNwInd(
                        mw_geoNwSecPdu(
                            mw_etsiTs103097Data_signed
                ))) {
                    log("*** " & testcasename() & ": DEBUG: Still waiting for certificate");
                    repeat;
                }
                [] tc_ac.timeout {
                    log("*** " & testcasename() & ": INCONC: Expected CA message not received ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_prDone, e_timeout);
                } 
            } // End of 'alt' statement
Yann Garcia's avatar
Yann Garcia committed
            
            // Test Body
            tc_ac.start;
            alt {
Yann Garcia's avatar
Yann Garcia committed
              [] geoNetworkingPort.receive(
                  mw_geoNwInd(
                      mw_geoNwSecPdu(
                          mw_etsiTs103097Data_signed(
                              mw_signedData(
                                  -, 
                                  mw_toBeSignedData(
                                      mw_signedDataPayload,
                                      mw_headerInfo_cam
                                  ),
                                  mw_signerIdentifier_certificate(
                                      v_initial_certificate
                                  )
                              )
                          ), 
                          mw_geoNwShbPacket
                ))) {
                    log("*** " & testcasename() & ": INFO: IUT still using initial certificate ***");
                    repeat;
                }
                [] geoNetworkingPort.receive(
                    mw_geoNwInd(
                        mw_geoNwSecPdu(
                            mw_etsiTs103097Data_signed(
                                mw_signedData(
                                    -, 
                                    mw_toBeSignedData(
                                        mw_signedDataPayload,
                                        mw_headerInfo_gn
                                    ),
                                    mw_signerIdentifier_certificate
                                )
                            )
                ))) {
                  tc_ac.stop;
                  log("*** " & testcasename() & ": PASS: IUT uses new certificate ***");
                  f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
                }
Yann Garcia's avatar
Yann Garcia committed
                [] geoNetworkingPort.receive(
                    mw_geoNwInd(
                        mw_geoNwSecPdu(
                            mw_etsiTs103097Data_signed
                ))) {
Yann Garcia's avatar
Yann Garcia committed
                    log("*** " & testcasename() & ": INFO: Unexpected message received, continue ***");
                    repeat;
Yann Garcia's avatar
Yann Garcia committed
                }
                [] tc_ac.timeout {
                    log("*** " & testcasename() & ": INCONC: Expected message not received ***");
                    f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_timeout);
                }
            } // End of 'alt' statement
            
            // Postamble
            f_acTriggerEvent(m_stopPassBeaconing);
            f_poNeighbour();
            f_cf01Down();
        } // End of testcase f_TC_SEC_PKI_ITSS_ENR_BV_01_itss
        
        function f_TC_SEC_PKI_ITSS_ENR_BV_01_pki(in charstring p_certificate_id) runs on ItsPki /*system ItsPkiItssSystem*/ { 
          
        } // End of testcase f_TC_SEC_PKI_ITSS_ENR_BV_01_pki
        
      } // End of f_TC_SEC_PKI_ITSS_ENR_BV_01
      
garciay's avatar
garciay committed
    } // End of group itss_manufacturing
    
    
  } // End of group itss_behavior
garciay's avatar
garciay committed
  group ea_behavior {
    
    /**
     * @desc The EnrolmentResponse message shall be sent by the EA to the 
     *       ITS-S across the interface at reference point S3 in response 
     *       to a received EnrolmentRequest message.
     * <pre>
     * Pics Selection: 
     * Initial conditions: 
     *     with {
     *         the IUT being in the "operational state"
     *     }
     * Expected behaviour:
     *     ensure that {
     *         when {
     *             the IUT receives an EnrolmentRequestMessage across the interface at the reference point S3
     *         }
     *         then {
     *             the IUT answers with an EnrolmentResponseMessage across the interface at reference point S3
     *         }
     *     }
     * </pre>
     * 
     * @see       ETSI TS ITS-00546v006 TP 20
     * @reference ETSI TS 102 941, clause 6.2.3.2.2
     */
    testcase TC_SEC_PKI_SND_EA_BV_01() runs on ItsPki system ItsPkiSystem {
      // Local variables
garciay's avatar
garciay committed
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var Oct32 v_publicKeyCompressed;
      var integer v_compressedMode;
Yann Garcia's avatar
Yann Garcia committed
      var InnerEcRequest v_inner_ec_request;
garciay's avatar
garciay committed
    
      // Test control
    
      // Test component configuration
Yann Garcia's avatar
Yann Garcia committed
      LibItsPki_Functions.f_cfUp();
Yann Garcia's avatar
Yann Garcia committed
    
      // Test adapter configuration
    
      // Preamble
garciay's avatar
garciay committed
      // Generate InnerEcRequest
      if (f_generate_inner_ec_request(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode, v_inner_ec_request) == false) {
        log("*** " & testcasename() & ": FAIL: Failed to setup InnerEcRequest message ***")
garciay's avatar
garciay committed
        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error);
        stop;
      }
Yann Garcia's avatar
Yann Garcia committed
      f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
    
      // Test Body
garciay's avatar
garciay committed
      pkiPort.send(v_inner_ec_request);
Yann Garcia's avatar
Yann Garcia committed
      tc_ac.start;
      alt {
        [] pkiPort.receive(
                           mw_innerEcResponse_ok
                                               ) {
          tc_ac.stop;
          log("*** " & testcasename() & ": PASS: InnerEcReponse received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
        }
        [] pkiPort.receive { // FIXME Use altstep
          tc_ac.stop;
          log("*** " & testcasename() & ": FAIL: HTTP error ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
        }
        [] tc_ac.timeout {
          log("*** " & testcasename() & ": INCONC: Expected message not received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_timeout);
        }
      } // End of 'alt' statement
garciay's avatar
garciay committed
    
Yann Garcia's avatar
Yann Garcia committed
      // Postamble
Yann Garcia's avatar
Yann Garcia committed
      LibItsPki_Functions.f_cfDown();
Yann Garcia's avatar
Yann Garcia committed
    
    } // End of testcase TC_SEC_PKI_SND_EA_BV_01

    /**
     * @desc If the enrolment request of the IUT is an initial enrolment request, the itsId 
     *       (contained in the InnerECRequest) shall be set to the canonical identifier, the 
     *       signer (contained in the outer EtsiTs1030971Data-Signed) shall be set to self and 
     *       the outer signature shall be computed using the canonical private key.
     * <pre>
     * Pics Selection: 
     * Initial conditions: 
     *     with {
     *         the IUT being in the "operational state"
     *     }
     * Expected behaviour:
     *     ensure that {
     *         when {
     *             the IUT is requested to send an EnrolmentRequestMessage
     *         }
     *         then {
     *             the IUT sends an EtsiTs103097Data-Encrypted
     *                 containing an encrypted EtsiTs103097Data-Signed
     *                     containing EtsiTs103097Data
     *                          containing InnerECRequestSignedForPOP
     *                             containing InnerEcRequest
     *                                 containing itsId
     *                                     indicating the canonical identifier of the ITS-S 
     *                 and containing signer
     *                     declared as self
     *                 and containing signature 
     *                     computed using the canonical private key
     *         }
     *     }
     * </pre>
     * 
     * @see       ETSI TS ITS-00546v006 TP 20
     * @reference ETSI TS 102 941, clause 6.2.3.2.2
     */
    testcase TC_SEC_PKI_SND_EA_BV_02() runs on ItsPkiHttp system ItsPkiHttpSystem {
      // Local variables
      var Oct32 v_private_key;
      var Oct32 v_publicKeyX;
      var Oct32 v_publicKeyY;
      var Oct32 v_publicKeyCompressed;
      var integer v_compressedMode;
Yann Garcia's avatar
Yann Garcia committed
      var InnerEcRequest v_inner_ec_request;
garciay's avatar
garciay committed
      var Ieee1609Dot2Data v_inner_ec_request_signed_for_pop;
      var bitstring v_inner_ec_request_signed_for_pop_msg;
Yann Garcia's avatar
Yann Garcia committed
      var Ieee1609Dot2Data v_ieee1609dot2_signed_and_encrypted_data;
garciay's avatar
garciay committed
      var HeaderLines v_headers;
Yann Garcia's avatar
Yann Garcia committed
      // Test control
Yann Garcia's avatar
Yann Garcia committed
      // Test component configuration
      f_cfHttpUp(); // Default value: CERT_TS_A_EA
garciay's avatar
garciay committed
      // Test adapter configuration
garciay's avatar
garciay committed
      // Preamble
garciay's avatar
garciay committed
      // Generate InnerEcRequest
garciay's avatar
garciay committed
      // TODO f_build_enrolment_request(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode, v_ieee1609dot2_signed_and_encrypted_data);
garciay's avatar
garciay committed
      if (f_generate_inner_ec_request(v_private_key, v_publicKeyX, v_publicKeyY, v_publicKeyCompressed, v_compressedMode, v_inner_ec_request) == false) {
        log("*** " & testcasename() & ": FAIL: Failed to setup InnerEcRequestPoP message ***")
        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error);
        stop;
      }
      // Generate InnerEcRequestSignedForPoP
garciay's avatar
garciay committed
      if (f_generate_inner_ec_request_signed_for_pop(v_private_key, v_inner_ec_request, v_inner_ec_request_signed_for_pop) == false) {
Yann Garcia's avatar
Yann Garcia committed
        log("*** " & testcasename() & ": FAIL: Failed to setup InnerEcRequestPoP message ***")
Yann Garcia's avatar
Yann Garcia committed
        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error);
        stop;
      }
garciay's avatar
garciay committed
      // 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(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) {
Yann Garcia's avatar
Yann Garcia committed
        log("*** " & testcasename() & ": FAIL: Failed to seucure InnerEcRequestPoP message ***")
        f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_error);
        stop;
Yann Garcia's avatar
Yann Garcia committed
      }
garciay's avatar
garciay committed
      log("v_ieee1609dot2_signed_and_encrypted_data = ", v_ieee1609dot2_signed_and_encrypted_data);
      f_init_default_headers_list(v_headers);
garciay's avatar
garciay committed
      f_selfOrClientSyncAndVerdictPreamble(c_prDone, e_success);
garciay's avatar
garciay committed
      // Test Body
      httpPort.send(
                    m_http_request(
garciay's avatar
garciay committed
                                   m_http_request_get(
                                                      "/its/inner_ec_request",
                                                      v_headers,
                                                      m_http_message_body_binary(
                                                                                 m_binary_body_ieee1609dot2_data(
                                                                                                                 v_ieee1609dot2_signed_and_encrypted_data
                                                                                                                 )))));
garciay's avatar
garciay committed
      tc_ac.start;
      alt {
        [] httpPort.receive(
                            mw_http_response(
                                             mw_http_response_ok(
                                                                 mw_http_message_body_binary(
Yann Garcia's avatar
Yann Garcia committed
                                                                                             mw_binary_body_ieee1609dot2_data(
                                                                                                                              mw_etsiTs103097Data_encrypted(
garciay's avatar
garciay committed
                                                                                                                                                            mw_encryptedData(
                                                                                                                                                                             -,
                                                                                                                                                                             mw_SymmetricCiphertext_aes128ccm
                                                                                                                                                                             ))))))) {
garciay's avatar
garciay committed
          tc_ac.stop;
          log("*** " & testcasename() & ": PASS: InnerEcReponse received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_success);
        }
Yann Garcia's avatar
Yann Garcia committed
        [] httpPort.receive( // FIXME Use altstep
garciay's avatar
garciay committed
                            mw_http_response(
                                             mw_http_response_ko
                                             )) {
          tc_ac.stop;
          log("*** " & testcasename() & ": FAIL: HTTP error ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
        }
Yann Garcia's avatar
Yann Garcia committed
        [] httpPort.receive(mw_http_response) { // FIXME Use altstep
garciay's avatar
garciay committed
          tc_ac.stop;
          log("*** " & testcasename() & ": FAIL: Unexpected response received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_error);
        }
        [] tc_ac.timeout {
          log("*** " & testcasename() & ": INCONC: Expected message not received ***");
          f_selfOrClientSyncAndVerdictTestBody(c_tbDone, e_timeout);
        }
      } // End of 'alt' statement
    
      // Postamble
Yann Garcia's avatar
Yann Garcia committed
      f_cfHttpDown();
garciay's avatar
garciay committed
    
Yann Garcia's avatar
Yann Garcia committed
    } // End of testcase TC_SEC_PKI_SND_EA_BV_02
garciay's avatar
garciay committed

  } // End of group ea_behavior

  group aa_behavior {

  } // End of group aa_beavior
  
} // End of module ItsPki_TestCases