ItsRSUsSimulator_Functions.ttcn 56.6 KB
Newer Older
garciay's avatar
garciay committed
            } else {
              v_broadcastArea.geoBroadcastSubType := e_reserved;
            }
            v_broadcastArea.geoBroadcastArea := v_utGnTrigger.geoBroadcast.area;
            v_geoNwBroadcastPacket := valueof(
                                              m_geoNwBroadcastPacket_payload(
                                                                             vc_longPosVectorRsu,
                                                                             f_incLocalSeqNumber(),
                                                                             v_broadcastArea,
                                                                             c_defaultHopLimit,
                                                                             v_utGnTrigger.geoBroadcast.trafficClass,
                                                                             v_utGnTrigger.geoBroadcast.payload
                                                                             ));
            v_geoNwPdu := valueof(
                                  m_geoNwPdu(
                                             v_geoNwBroadcastPacket,
                                             m_lifetimeBase1s(v_utGnTrigger.geoBroadcast.lifetime),
                                             c_defaultHopLimit
                                             ));
garciay's avatar
garciay committed
          }
          repeat;
        }
        [vc_cam == true] cfPort.receive(UtCamInitialize:?) {
          cfPort.send(UtCamResults: { utCamInitializeResult := true } );
          repeat;
        [vc_cam == true] cfPort.receive(UtCamTrigger: { changeSpeed := ? }) {
          cfPort.send(UtCamResults: { utCamTriggerResult := true } );
garciay's avatar
garciay committed
          vc_cam_timer_value := vc_cam_timer_value / 2.0;
          repeat;
        }
        [vc_cam == true] cfPort.receive(UtCamTrigger: { changeCurvature := ? }) -> value v_utCamTrigger {
          log("v_utCamTrigger = ", v_utCamTrigger);
          if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency)) {
            cfPort.send(UtCamResults: { utCamTriggerResult := true } );
            vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.curvature.curvatureValue := v_utCamTrigger.changeCurvature;
          } else {
            cfPort.send(UtCamResults: { utCamTriggerResult := false } );
          }
garciay's avatar
garciay committed
        [vc_cam == true] cfPort.receive(UtCamTrigger: { changeHeading := ? }) -> value v_utCamTrigger {
          log("v_utCamTrigger = ", v_utCamTrigger);
garciay's avatar
garciay committed
          if (ispresent(vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency)) {
            cfPort.send(UtCamResults: { utCamTriggerResult := true } );
garciay's avatar
garciay committed
            vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.heading.headingValue := valueof(vc_rsuMessagesValueList[vc_rsu_id].cam.cam.camParameters.highFrequencyContainer.basicVehicleContainerHighFrequency.heading.headingValue) + v_utCamTrigger.changeHeading;
garciay's avatar
garciay committed
          } else {
            cfPort.send(UtCamResults: { utCamTriggerResult := false } );
          }
          repeat;
        }
garciay's avatar
garciay committed
        /*[vc_cam == true] cfPort.receive(UtCamTrigger: { changePosition := ? }) {
garciay's avatar
garciay committed
          cfPort.send(UtCamResults: { utCamTriggerResult := true } );
          //TODO vc_cam_timer_value := vc_cam_timer_value / 4.0;
          repeat;
          }*/
        [vc_denm == true] cfPort.receive(UtDenmInitialize:?) {
          cfPort.send(UtDenmResults: { utDenmInitializeResult := true } );
          repeat;
        [vc_pki == true] cfPort.receive(UtPkiInitialize:?) -> value v_utPkiInitialize {
          log("v_utPkiInitialize = ", v_utPkiInitialize);
          cfPort.send(UtPkiResults: { utPkiInitializeResult := true } );
          repeat;
        }
        [vc_pki == true] cfPort.receive(UtPkiTrigger:?) -> value v_utPkiTrigger {
          var ItsPkiHttp v_pki;
          
          cfPort.send(UtPkiResults: { utPkiTriggerResult := true } );
          v_pki := ItsPkiHttp.create("TriggeredEc") alive;
          v_pki.start(f_trigger_enrolment_request_await_response(
                                                                 vc_reenrolment,
                                                                 vc_ec_certificates_counter,
                                                                 vc_ec_certificates
                                                                 ));
          //v_pki.done;
        [] cfPort.receive {
          // Ignore it
          log("*** " & testcasename() & ": INFO: Unexpected CF message received ***");
          repeat;
        }
    } // End of 'altstep' statement
    
    function f_trigger_enrolment_request_await_response(
                                                        inout boolean p_reenrolment,
                                                        inout integer p_ec_certificates_counter,
                                                        inout SequenceOfCertificate p_ec_certificates
                                                        ) runs on ItsPkiHttp {
      // Local variables
      var Oct32 v_private_key;
      var Oct32 v_compressed_public_key;
      var integer v_compressed_mode;
      var Oct32 v_request_hash;
      var Oct16 v_encrypted_sym_key;
      var Oct16 v_aes_sym_key;
      var Oct16 v_authentication_vector;
      var Oct12 v_nonce;
      var octetstring v_salt;
      var Ieee1609Dot2Data v_ieee1609dot2_signed_and_encrypted_data;
      var HeaderLines v_headers;
      var HttpMessage v_response;
      var EtsiTs102941Data v_etsi_ts_102941_data;
      timer v_t := 5.0;
      
      log(">>> f_trigger_enrolment_request_await_response");

      f_cfHttpUp(PICS_TS_EA_CERTIFICATE_ID);
      
      f_http_build_inner_ec_request(v_private_key, v_compressed_public_key, v_compressed_mode, v_aes_sym_key, v_encrypted_sym_key, v_authentication_vector, v_nonce, v_salt, v_ieee1609dot2_signed_and_encrypted_data, v_request_hash);
      f_init_default_headers_list(-, "inner_ec_request", v_headers);
      httpPort.send(
                    m_http_request(
                                   m_http_request_post(
                                                       PICS_HTTP_POST_URI,
                                                       v_headers,
                                                       m_http_message_body_binary(
                                                                                  m_binary_body_ieee1609dot2_data(
                                                                                                                  v_ieee1609dot2_signed_and_encrypted_data
                                                                                                                  )))));
      // Wait for the resposne
      v_t.start;
      alt {
        [] httpPort.receive(
                            mw_http_response(
                                             mw_http_response_ok(
                                                                 mw_http_message_body_binary(
                                                                                             mw_binary_body_ieee1609dot2_data(
                                                                                                                              mw_enrolmentResponseMessage(
                                                                                                                                                          mw_encryptedData(
                                                                                                                                                                           -,
                                                                                                                                                                           mw_SymmetricCiphertext_aes128ccm
                                                                                                                                                                           ))))))) -> value v_response {
          v_t.stop;
          
          log("f_trigger_enrolment_request_await_response: receive ", v_response);
          if (f_verify_pki_message(v_private_key, v_aes_sym_key, v_authentication_vector, vc_eaWholeHash, vc_eaCertificate, v_response.response.body.binary_body.ieee1609dot2_data, false, v_etsi_ts_102941_data) == false) {
            log("f_trigger_enrolment_request_await_response: Failed to verify PKI message ***");
          } else {
            log("f_trigger_enrolment_request_await_response: Receive ", v_etsi_ts_102941_data, " ***");
            // Verify the received EC certificate
            log("f_trigger_enrolment_request_await_response: match ", match(v_etsi_ts_102941_data.content, mw_enrolmentResponse(mw_innerEcResponse_ok(substr(v_request_hash, 0, 16), mw_etsiTs103097Certificate(-, mw_toBeSignedCertificate_ec, -)))), " ***"); // TODO In TITAN, this is the only way to get the unmatching in log
            if (match(v_etsi_ts_102941_data.content, mw_enrolmentResponse(mw_innerEcResponse_ok(substr(v_request_hash, 0, 16), mw_etsiTs103097Certificate(-, mw_toBeSignedCertificate_ec, -))))) {
              var InnerEcResponse v_inner_ec_response := v_etsi_ts_102941_data.content.enrolmentResponse;
              if (f_verify_ec_certificate(v_etsi_ts_102941_data.content.enrolmentResponse.certificate, vc_eaCertificate, v_compressed_public_key, v_compressed_mode)) {
                log("f_trigger_enrolment_request_await_response: Well-secured EA certificate received ***");
                log("p_inner_ec_response= ", v_inner_ec_response);
                p_reenrolment := true;
                // Store the new certificate
                p_ec_certificates[p_ec_certificates_counter] := v_inner_ec_response.certificate;
                p_ec_certificates_counter := p_ec_certificates_counter + 1;
              } else {
                log("f_trigger_enrolment_request_await_response: Cannot verify EC certificate signature ***");
              }
            } else {
              log("f_trigger_enrolment_request_await_response: Unexpected message received ***");
            }
          }
        }
        [] v_t.timeout {
          log("*** " & testcasename() & ": INCONC: Expected message not received ***");
        }
      } // End of 'alt' statement

      f_cfHttpDown();
      log("<<< f_trigger_enrolment_request_await_response");
} // End of module ItsRSUsSimulator_Functions