Commit 8e744cf3 authored by garciay's avatar garciay
Browse files

STF545: Add InnerAcRequest/Response support, UpperTester port for ITS-S

parent ac2eae90
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -152,7 +152,7 @@ module LibItsCommon_TypesAndValues {
		const integer c_its_aid_IVI   := 139; 
    const integer c_its_aid_TLC   := 140;
    const integer c_its_aid_GN    := 141;
		const integer c_its_aid_SCR   := 36; // Secured Certificate Request
		const integer c_its_aid_SCR   := 35; // Secured Certificate Request
    }
}
with {
+72 −6
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ module LibItsPki_Functions {
      f_readSigningKey(p_certificateId, vc_eaPrivateKey);
      f_readEncryptingKey(p_certificateId, vc_eaPrivateEncKey);
      f_getCertificateDigest(p_certificateId, vc_eaHashedId8);
      f_readCertificate(p_peerCertificateId, vc_peerEaCertificate);
      f_getCertificateHash(p_peerCertificateId, vc_eaPeerWholeHash);
      
      activate(a_default_pki_http());
@@ -110,6 +111,8 @@ module LibItsPki_Functions {
      f_cfUp();
      
      map(self:geoNetworkingPort, system:geoNetworkingPort);
      map(self:utPort, system:utPort);
      map(self:acPort, system:acPort);
      
      activate(a_default_pki());
    } // End of function f_cfUp_itss
@@ -136,6 +139,8 @@ module LibItsPki_Functions {
     */
    function f_cfDown_itss() runs on ItsPkiItss /* TITAN TODO: system ItsPkiItssSystem */ {
      unmap(self:geoNetworkingPort, system:geoNetworkingPort);
      unmap(self:utPort, system:utPort);
      unmap(self:acPort, system:acPort);
      
      f_cfDown();
    } // End of function f_cfDown
@@ -186,10 +191,70 @@ module LibItsPki_Functions {
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      } // End of 'alt' statement
    }
    } // End of function f_sendAcPkiPrimitive
    
  } // End of group ac_port

  group ut_port {

    function f_utInitializeIut(template (value) UtPkiInitialize p_init) runs on ItsPkiItss {
      
      utPort.send(p_init);
      tc_wait.start;
      alt {
        [] utPort.receive(UtPkiResults: { utPkiInitializeResult := true }) {
          tc_wait.stop;
          log("*** f_utInitializeIut: INFO: IUT initialized ***");
        }
        [] utPort.receive {
          tc_wait.stop;
          log("*** f_utInitializeIut: INFO: IUT could not be initialized ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_wait.timeout {
          log("*** f_utInitializeIut: INFO: IUT could not be initialized in time ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      }
      
    } // End of function f_utInitializeIut
    
    function f_sendUtTriggerPrimitive(
                                      in HashAlgorithm p_hashAlgorithm,
                                      in octetstring p_private_key,
                                      in octetstring p_publicKeyCompressed,
                                      in integer p_compressedMode
                                      ) runs on ItsPkiItss {
      var TriggerEnrolmentRequest v_ut_trigger_enrolment_request;
      var octetstring v_compressed_public_key;

      if (p_compressedMode == 2) { // TODO v_compressed_public_key := int2oct(p_compressedMode, 1) & p_publicKeyCompressed?
        v_compressed_public_key := '02'O & p_publicKeyCompressed;
      } else {
        v_compressed_public_key := '03'O & p_publicKeyCompressed;
      }
      
      v_ut_trigger_enrolment_request := { p_hashAlgorithm, p_private_key, v_compressed_public_key };
      utPort.send(UtPkiTrigger: { triggerEnrolmentRequest := v_ut_trigger_enrolment_request });
      tc_ac.start;
      alt {
        [] utPort.receive(UtPkiResults: { utPkiTriggerResult := true }) {
          tc_ac.stop;
        }
        [] utPort.receive(UtPkiResults: { utPkiTriggerResult := false }) {
          tc_ac.stop;
          log("*** f_sendUtTriggerPrimitive: ERROR: Received unexpected message ***");
          f_selfOrClientSyncAndVerdict("error", e_error);
        }
        [] tc_ac.timeout {
          log("*** f_sendAcPkiPrimitive: ERROR: Timeout while waiting for adapter control event result ***");
          f_selfOrClientSyncAndVerdict("error", e_timeout);
        }
      } // End of 'alt' statement
    } // End of function f_sendUtTriggerPrimitive
    
  } // End of group ut_port

  group http {

    function f_http_build_enrolment_request(
@@ -222,7 +287,9 @@ module LibItsPki_Functions {
        log("*** f_http_build_enrolment_request: ERROR: Failed to generate InnerEcRequestSignedForPop ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
      log("*** f_http_build_enrolment_request: DEBUG: v_inner_ec_request_signed_for_pop_msg= ", v_inner_ec_request_signed_for_pop_msg);
      log("*** f_http_build_enrolment_request: DEBUG: p_ieee1609dot2_signed_and_encrypted_data= ", p_ieee1609dot2_signed_and_encrypted_data);
      log("*** f_http_build_enrolment_request: DEBUG: p_hash_inner_ec_request_signed_for_pop= ", p_hash_inner_ec_request_signed_for_pop);
    } // End of function f_http_build_enrolment_request
    
    function f_http_build_invalid_enrolment_request(
@@ -250,13 +317,13 @@ module LibItsPki_Functions {
      // 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));
      // Get 16 last byte of SHA256 of InnerEcRequestSignedForPop
      p_hash_inner_ec_request_signed_for_pop := f_hashWithSha256(bit2oct(int2oct(12345, 32))); // Invalue InnseEcRequestSignedForPop
      p_hash_inner_ec_request_signed_for_pop := f_hashWithSha256(int2oct(12345, 32)); // Invalid InnseEcRequestSignedForPop
      if (f_build_pki_secured_message(vc_eaPrivateKey, valueof(m_signerIdentifier_self), vc_eaHashedId8, p_publicKeyCompressed, p_compressedMode, bit2oct(v_inner_ec_request_signed_for_pop_msg), p_ieee1609dot2_signed_and_encrypted_data) == false) {
        log("*** f_http_build_invalid_enrolment_request: ERROR: Failed to generate InnerEcRequestSignedForPop ***");
        f_selfOrClientSyncAndVerdict("error", e_error);
      }
      log("*** f_http_build_invalid_enrolment_request: DEBUG: p_ieee1609dot2_signed_and_encrypted_data = ", p_ieee1609dot2_signed_and_encrypted_data);
    } // End of function f_http_build_enrolment_request
    } // End of function f_http_build_invalid_enrolment_request
    
  } // End of group http
  
@@ -424,13 +491,12 @@ module LibItsPki_Functions {
      var integer v_ephemeralKeyModeCompressed;
      var octetstring v_encrypted_inner_ec_request;
      
      
      // Signed the encoded PKI message
      v_tbs := m_toBeSignedData(
                                m_signedDataPayload(
                                                    m_etsiTs103097Data_unsecured(p_pki_message)
                                                   ),
                                m_headerInfo_inner_ec_request(12345, f_getCurrentTimeUtc()) // TODO Use PIXIT
                                m_headerInfo_inner_ec_request(c_its_aid_SCR, f_getCurrentTimeUtc())
                               );
      if (ischosen(p_signer_identifier.self_)) {
        v_tbs_signed := f_signWithEcdsaNistp256WithSha256(bit2oct(encvalue(v_tbs)), int2oct(0, 32), p_private_key);
+102 −9
Original line number Diff line number Diff line
@@ -26,16 +26,20 @@ module LibItsPki_Templates {
  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 EtsiTs102941TypesAuthorization language "ASN.1:1997" all;
  import from EtsiTs102941MessagesItss language "ASN.1:1997" all;
  import from EtsiTs103097Module language "ASN.1:1997" all;
  
  // LibItsSecurity
  import from LibItsSecurity_Templates all;

  // LibItsPki
  import from LibItsPki_TypesAndValues all;

  template (value) EtsiTs102941Data m_etsiTs102941Data_inner_ec_request_signed_for_pop(
                                                                                       in template (value) InnerEcRequestSignedForPop p_inner_ec_request_signed_for_pop
                                                                                       ) := {
    version := 1,
    version := PkiProtocolVersion,
    content := {
      enrolmentRequest := p_inner_ec_request_signed_for_pop
    }
@@ -44,12 +48,30 @@ module LibItsPki_Templates {
  template (value) EtsiTs102941Data m_etsiTs102941Data_inner_ec_response(
                                                                         in template (value) InnerEcResponse p_inner_ec_response
                                                                         ) := {
    version := 1,
    version := PkiProtocolVersion,
    content := {
      enrolmentResponse := p_inner_ec_response
    }
  } // End of template m_etsiTs102941Data_inner_ec_response

  template (value) EtsiTs102941Data m_etsiTs102941Data_inner_at_request(
                                                                        in template (value) InnerAtRequest p_inner_at_response
                                                                        ) := {
    version := PkiProtocolVersion,
    content := {
      authorizationRequest := p_inner_at_response
    }
  } // End of template m_etsiTs102941Data_inner_at_request
  
  template (value) EtsiTs102941Data m_etsiTs102941Data_inner_at_response(
                                                                         in template (value) InnerAtResponse p_inner_at_response
                                                                         ) := {
    version := PkiProtocolVersion,
    content := {
      authorizationResponse := p_inner_at_response
    }
  } // End of template m_etsiTs102941Data_inner_at_response
  
  template (value) EnrolmentRequestMessage m_enrolmentRequestMessage(
                                                                     in template (value) EncryptedData p_encryptedData
                                                                     ) modifies m_etsiTs103097Data_encrypted := {
@@ -60,6 +82,16 @@ module LibItsPki_Templates {
                                                                         ) modifies mw_etsiTs103097Data_encrypted := {
  } // End of template mw_enrolmentResponseMessage

  template (value) AuthorizationRequestMessage m_authorizationRequestMessage(
                                                                             in template (value) EncryptedData p_encryptedData
                                                                             ) modifies m_etsiTs103097Data_encrypted := {
  } // End of template m_authorizationRequestMessage
  
  template (value) AuthorizationResponseMessage m_authorizationResponseMessage(
                                                                             in template (value) EncryptedData p_encryptedData
                                                                             ) modifies m_etsiTs103097Data_encrypted := {
  } // End of template m_authorizationResponseMessage
  
  template (value) EtsiTs102941DataContent m_enrolmentRequest(
                                                              in template (value) InnerEcRequestSignedForPop p_enrolmentRequest
                                                              ) := {
@@ -72,6 +104,18 @@ module LibItsPki_Templates {
    enrolmentResponse := p_enrolmentResponse
  } // End of template mw_enrolmentResponse
  
  template (value) EtsiTs102941DataContent m_authorizationRequest(
                                                                  in template (value) InnerAtRequest p_authorizationRequest
                                                                  ) := {
    authorizationRequest := p_authorizationRequest
  } // End of template m_authorizationRequest
  
  template (present) EtsiTs102941DataContent mw_authorizationResponse(
                                                                      template (present) InnerAtResponse p_authorizationResponse := ?
                                                                      ) := {
    authorizationResponse := p_authorizationResponse
  } // End of template mw_authorizationResponse
  
  template (value) InnerEcRequest m_innerEcRequest(
                                                   in template (value) charstring p_itsId,
                                                   in template (value) PublicKeys p_publicKeys,
@@ -94,6 +138,30 @@ module LibItsPki_Templates {
    requestedSubjectAttributes := p_requestedSubjectAttributes
  } // End of template mw_innerEcRequest
  
  template (value) InnerAtRequest m_innerAtRequest(
                                                   in template (value) PublicKeys p_publicKeys,
                                                   in template (value) Oct32 p_hmacKey,
                                                   in template (value) SharedAtRequest p_sharedAtRequest,
                                                   in template (value) EcSignature p_ecSignature
                                                   ) := {
    publicKeys      := p_publicKeys,
    hmacKey         := p_hmacKey,
    sharedAtRequest := p_sharedAtRequest,
    ecSignature     := p_ecSignature
  } // End of template m_innerAtRequest
  
  template (present) InnerAtRequest mw_innerAtRequest(
                                                      template (present) PublicKeys p_publicKeys := ?,
                                                      template (present) Oct32 p_hmacKey := ?,
                                                      template (present) SharedAtRequest p_sharedAtRequest := ?,
                                                      template (present) EcSignature p_ecSignature := ?
                                                      ) := {
    publicKeys      := p_publicKeys,
    hmacKey         := p_hmacKey,
    sharedAtRequest := p_sharedAtRequest,
    ecSignature     := p_ecSignature
  } // End of template mw_innerAtRequest
  
  template (omit) PublicKeys m_publicKeys(
                                          in template (value) PublicVerificationKey p_verificationKey,
                                          in template (omit) PublicEncryptionKey p_encryptionKey := omit
@@ -157,9 +225,34 @@ module LibItsPki_Templates {
                                                           ) := {
  requestHash  := p_requestHash,
  responseCode := p_responseCode,
  certificate  := *
  certificate  := omit
  } // End of template mw_innerEcResponse_ko
  
  template (value) InnerAtResponse m_innerAtResponse_ok(
                                                        in template (value) Oct16 p_requestHash,
                                                        in template (value) EtsiTs103097Certificate p_certificate
                                                        ) := {
  requestHash  := p_requestHash,
  responseCode := ok,
  certificate  := p_certificate
  } // End of template m_innerAtResponse_ok
  
  template (present) InnerAtResponse mw_innerAtResponse_ok(
                                                           template (present) Oct16 p_requestHash := ?,
                                                           template (present) EtsiTs103097Certificate p_certificate := ?
                                                           ) := {
  requestHash  := p_requestHash,
  responseCode := ok,
  certificate  := p_certificate
  } // End of template mw_innerAtResponse_ok
  
  template (present) InnerAtResponse mw_innerAtResponse_ko(
                                                           template (present) Oct16 p_requestHash := ?,
                                                           template (present) AuthorizationResponseCode p_responseCode := complement(ok)
                                                           ) := {
  requestHash  := p_requestHash,
  responseCode := p_responseCode,
  certificate  := omit
  } // End of template mw_innerAtResponse_ko
  
} // End of module LibItsPki_Templates
+20 −0
Original line number Diff line number Diff line
@@ -47,6 +47,21 @@ module LibItsPki_TestSystem {
    out AcPkiPrimitive;
    in AcPkiResponse;
  } // End of AdapterControlPkiPort
  /**
   * @desc Adapter control port
   */
  type port AdapterControlPort message {
    out AcPkiPrimitive;
    in AcPkiResponse;
  } // End of AdapterControlPort
  
  /**
   * @desc Upper Tester port
   */
  type port UpperTesterPort message {
    out UtPkiInitialize, UtPkiTrigger;
    in UtPkiResults;
  } // End of UpperTesterPort
  
  type port PkiPort message {
    inout InnerEcRequest, InnerEcResponse;
@@ -61,6 +76,8 @@ module LibItsPki_TestSystem {
  } // End of component ItsPkiHttpSystem
  
  type component ItsPkiItssSystem extends ItsPkiSystem {
    port AdapterControlPort acPort;
    port UpperTesterPort utPort;
    port GeoNetworkingPort geoNetworkingPort;
  } // End of component ItsPkiItssSystem
  
@@ -76,10 +93,13 @@ module LibItsPki_TestSystem {
    var octetstring vc_eaPrivateKey;        /** Test Adapter EA private key for signature */
    var octetstring vc_eaPrivateEncKey;     /** Test Adapter EA private key for encryption */
    var HashedId8   vc_eaHashedId8;         /** Test Adapter EA HashedId8 for decryption of IUT's response */
    var Certificate vc_peerEaCertificate;   /** IUT EA certificate for signature check */
    var octetstring vc_eaPeerWholeHash;     /** IUT EA whole-hash for signature check */
  } // End of component ItsPki
  
  type component ItsPkiItss extends ItsPki {
    port AdapterControlPort acPort;
    port UpperTesterPort utPort;
    port GeoNetworkingPort geoNetworkingPort;
  } // End of component ItsPkiItss
  
+57 −4
Original line number Diff line number Diff line
@@ -10,6 +10,10 @@
 */
module LibItsPki_TypesAndValues {
  
  // LibCommon
  import from LibCommon_BasicTypesAndValues all;
  import from LibCommon_DataStrings all;
  
  // LibIts
  import from IEEE1609dot2BaseTypes language "ASN.1:1997" all;
  
@@ -17,8 +21,6 @@ module LibItsPki_TypesAndValues {

    const integer PkiProtocolVersion := 1;
    
    const Psid its_aid_secured_cert_request := 12345;

  } // End of group constants
  
  group acPrimitives {
@@ -52,11 +54,62 @@ module LibItsPki_TypesAndValues {
      encode "LibItsPki"
    } // AcSetSecurityData
    
  } // end acPrimitives
  with {
  } with {
    variant ""
    encode "AdapterControl"
  } // End of group acPrimitives
  
  group utPrimitives {

    /**
     * @desc Upper Tester message to initialize ITS-S IUT 
     * @member hashedId8 In case of secured mode set, hashedId8 indicate which certificate the IUT shall use
     */
    type record UtPkiInitialize {
      Oct8 hashedId8 
    } with {
      variant "FIELDORDER(msb)"
    }

    /**
     * @desc Upper Tester results message of the PKI ITS-S IUT
     */
    type union UtPkiResults {
      boolean utPkiInitializeResult,
      boolean utPkiTriggerResult
    } with {
      variant ""
    } // End of type UtPkiResults

    /**
     * @desc    UT primitives for PKI ITS-S IUT
     * @member  triggerEnrolmentRequest Request to trigger an EnrolmentRequest
     */
    type union UtPkiTrigger {
      TriggerEnrolmentRequest triggerEnrolmentRequest
    } with {
      variant ""
    } // End of type UtPkiTrigger
    
    /**
     * @desc Request to trigger an EnrolmentRequest
     * @member hashAlgorithm The Hash algorithm to be used (sha256 or sha384)
     * @member privateKey The private key to be used for signature of the requested EA certificate
     * @member compressedPublickey The compressed public key to be used for signature of the requested EA certificate (format: [02|03]<compressed public key>
     */
    type record TriggerEnrolmentRequest {
      HashAlgorithm hashAlgorithm,
      octetstring privateKey,
      octetstring compressedPublickey
    } with {
      variant "FIELDORDER(msb)"
    } // End of type TriggerEnrolmentRequest
    
  } with {
    encode "UpperTester"
    variant ""
  } // End of group utPrimitives
  
}
with {
  variant ""