dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36229?usp=email )
Change subject: IPAd_Tests: add testsuite for an IPAd ......................................................................
IPAd_Tests: add testsuite for an IPAd
With this patch we add a testsuite that can be used to test an IPAd implementation.
The testsuite emulates the ESipa and the ES10x (pcsc cardreader) interface and is capable of testing a direct profile download and other ESipa features like the execution of an eIM package (eCO, PSMO).
Change-Id: Ic9ea8c69e56a2e8ddf0f506861ece6d40cbcb06d --- M Makefile A ipad/IPAd_Tests.cfg A ipad/IPAd_Tests.default A ipad/IPAd_Tests.ttcn A ipad/gen_links.sh A ipad/regen_makefile.sh A ipad/server.crt A ipad/server.key M regen-makefile.sh 9 files changed, 823 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/29/36229/1
diff --git a/Makefile b/Makefile index 51e51ed..fb3099b 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,7 @@ hnbgw \ hnodeb \ hss \ + ipad \ mgw \ mme \ msc \ diff --git a/ipad/IPAd_Tests.cfg b/ipad/IPAd_Tests.cfg new file mode 100644 index 0000000..6608177 --- /dev/null +++ b/ipad/IPAd_Tests.cfg @@ -0,0 +1,23 @@ +[ORDERED_INCLUDE] +# Common configuration, shared between test suites +"../Common.cfg" +# testsuite specific configuration, not expected to change +"./IPAd_Tests.default" + +# Local configuration below + +[LOGGING] + +[TESTPORT_PARAMETERS] +system.HTTP_server_port.use_notification_ASPs := "no" +system.HTTP_server_port.KEYFILE := "./server.key" +system.HTTP_server_port.CERTIFICATEFILE := "./server.crt" +system.HTTP_server_port.PASSWORD := "katinka1" +system.HTTP_server_port.http_debugging := "yes" + +[MODULE_PARAMETERS] + +[MAIN_CONTROLLER] + +[EXECUTE] +IPAd_Tests.control diff --git a/ipad/IPAd_Tests.default b/ipad/IPAd_Tests.default new file mode 100644 index 0000000..95b42e9 --- /dev/null +++ b/ipad/IPAd_Tests.default @@ -0,0 +1,8 @@ +[LOGGING] +mtc.FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING; // | DEBUG_ENCDEC; + +[TESTPORT_PARAMETERS] + +[MODULE_PARAMETERS] + +[EXECUTE] diff --git a/ipad/IPAd_Tests.ttcn b/ipad/IPAd_Tests.ttcn new file mode 100644 index 0000000..104836f --- /dev/null +++ b/ipad/IPAd_Tests.ttcn @@ -0,0 +1,655 @@ +/* IPAd testsuite in TTCN-3 + * + * Author: Philipp Maier pmaier@sysmocom.de / sysmocom - s.f.m.c. GmbH + * + * Released under the terms of GNU General Public License, Version 2 or + * (at your option) any later version. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +module IPAd_Tests { + +import from Misc_Helpers all; +import from General_Types all; +import from Osmocom_Types all; + +import from SGP32Definitions all; +import from SGP32Definitions_Types all; +import from SGP32Definitions_Templates all; + +import from RSPDefinitions all; +import from RSPDefinitions_Types all; +import from RSPDefinitions_Templates all; + +import from PKIX1Explicit88 all; +import from PKIX1Explicit88_Templates all; +import from PKIX1Explicit88_Types all; + +import from HTTP_Server_Emulation all; +import from HTTPmsg_Types all; + +import from VPCD_Types all; +import from VPCD_CodecPort all; +import from VPCD_Adapter all; + +/* Altstep to handle card power up/down and ATR transmission */ +private altstep as_vpcd_atr() runs on VPCD_Adapter_CT { + [] VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, tr_VPCD_CTRL_ATR)) { + f_vpcd_send(ts_VPCD_DATA('3B9F96801FC78031A073BE21136743200718000001A5'O)); + repeat; + } + [] VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, tr_VPCD_CTRL_OFF)) { + repeat; + } + [] VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, tr_VPCD_CTRL_ON)) { + repeat; + } +} + +/* Helper function to send HTTP responses */ +private function f_make_http_resp(octetstring resp) return HTTPMessage { + var HTTPMessage resp_msg; + var HTTPResponse_binary_body resp_body := { + client_id := omit, + version_major := 1, + version_minor := 1, + statuscode := 200, + statustext := "OK", + /* See also SGP.32, section 6.1.1 */ + header := { + { + header_name := "X-Admin-Protocol", + header_value := "gsma/rsp/v1.0.0" + }, + { + header_name := "Content-Type", + header_value := "application/x-gsma-rsp-asn1" + }, + { + header_name := "Content-Length", + header_value := int2str(lengthof(resp)) + } + }, + body := resp + }; + + resp_msg := { response_binary := resp_body }; + return resp_msg; +} + +type component MTC_CT { + timer g_Tguard; + + /* HTTP server */ + var HTTP_Server_Emulation_CT vc_HTTP; +}; + +type component IPAd_ConnHdlr extends HTTP_ConnHdlr, VPCD_Adapter_CT { + var IPAd_ConnHdlrPars g_pars; +}; + +type record IPAd_ConnHdlrPars { + /* TODO: add some useful parameters */ +}; + +private function f_init_pars() +runs on MTC_CT return IPAd_ConnHdlrPars { + var IPAd_ConnHdlrPars pars := { + /* TODO: fill parameters with meaninful values */ + }; + return pars; +} + +modulepar { + /* emulated eIM HTTPs server */ + charstring mp_esipa_ip := "127.0.0.1"; + integer mp_esipa_port := 4430; + boolean mp_esipa_disable_ssl := false; + boolean mp_use_vpcd := true; +} + +private altstep as_Tguard() runs on MTC_CT { + [] g_Tguard.timeout { + Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Tguard timeout"); + } +} + +private type function void_fn(charstring id) runs on IPAd_ConnHdlr; + +private function f_init_handler(void_fn fn, charstring id, IPAd_ConnHdlrPars pars) runs on IPAd_ConnHdlr { + g_pars := pars; + + /* Initialize VPDC (virtual smartcard) */ + if (mp_use_vpcd) { + VPCD_Adapter.f_connect(); + activate(as_vpcd_atr()); + } + + fn.apply(id); +} + +private function f_start_handler(void_fn fn, IPAd_ConnHdlrPars pars) +runs on MTC_CT return IPAd_ConnHdlr { + var IPAd_ConnHdlr vc_conn; + var charstring id := testcasename(); + + vc_conn := IPAd_ConnHdlr.create(id); + + if (isbound(vc_HTTP)) { + connect(vc_conn:HTTP_SRV, vc_HTTP:CLIENT); + connect(vc_conn:HTTP_SRV_PROC, vc_HTTP:CLIENT_PROC); + } + + vc_conn.start(f_init_handler(fn, id, pars)); + return vc_conn; +} + +function f_init_esipa(charstring id) runs on MTC_CT { + var HttpServerEmulationCfg http_cfg := { + http_bind_ip := mp_esipa_ip, + http_bind_port := mp_esipa_port, + use_ssl := not mp_esipa_disable_ssl + }; + + vc_HTTP := HTTP_Server_Emulation_CT.create(id); + vc_HTTP.start(HTTP_Server_Emulation.main(http_cfg)); +} + +private function f_init(charstring id, float t_guard := 40.0) runs on MTC_CT { + g_Tguard.start(t_guard); + activate(as_Tguard()); + f_init_esipa(id); +} + +/* Expect a GetResponse request from IUT and transfer as many response bytes the IUT requests */ +private function f_vpcd_get_response(octetstring response) runs on IPAd_ConnHdlr return integer { + var octetstring sw; + var VPCD_PDU req; + var integer len; + + req := f_vpcd_exp(tr_VPCD_DATA(?)); + len := oct2int(req.u.data[4]); + if (len == 0) { + len := 256; + } + + /* Make sure that the request APDU is actually a GetResponse request (on logical channel 2) */ + if (substr(req.u.data, 0, 4) != '01c00000'O) { + setverdict(fail, "unexpected APDU, expecting GetResponse"); + return 0; + } + + /* Compute status word, in case the requested data is shorter then the response data we intend to send, we must + * tell the IUT that there is still data available, so that a consecutive GetResponse request can be issued. + * (caller must check return code to determine if a consecutive GetResponse is needed/expected) */ + if (lengthof(response) > len) { + if (lengthof(response) - len > 255) { + sw := '6100'O; + } else { + sw := '61'O & int2oct(lengthof(response) - len, 1); + } + } else { + sw := '9000'O; + } + + /* Send response to IUT */ + f_vpcd_send(ts_VPCD_DATA(substr(response, 0, len) & sw)); + + /* Return how many bytes have sent */ + return len; +} + +/* Expect one or more GetResponse requests from IUT until the full response is transferred */ +private function f_vpcd_get_response_multi(octetstring response) runs on IPAd_ConnHdlr { + var integer bytes_sent := 0; + var octetstring response_remainder := response; + + while(true) { + response_remainder := substr(response_remainder, bytes_sent, lengthof(response_remainder) - bytes_sent); + bytes_sent := f_vpcd_get_response(response_remainder); + + /* Check if we reached the last chunk */ + if (lengthof(response_remainder) <= bytes_sent) { + return; + } + } +} + +/* Expect one or more STORE DATA requests until the IUT has completed the transmision cycle */ +private function f_vpcd_store_data(octetstring exp := ''O) runs on IPAd_ConnHdlr return octetstring { + + var VPCD_PDU req; + var octetstring block; + var integer len; + var octetstring data := ''O; + + while(true) { + req := f_vpcd_exp(tr_VPCD_DATA(?)); + + /* Make sure that the request APDU is actually a STORE DATA request (on logical channel 1) */ + if (substr(req.u.data, 0, 3) != '81E291'O and + substr(req.u.data, 0, 3) != '81E211'O) { + setverdict(fail, "unexpected APDU, expecting GetResponse"); + return ''O; + } + + if (lengthof(req.u.data) - 5 > 255) { + len := 255; + } else { + len := lengthof(req.u.data) - 5; + } + block := substr(req.u.data, 5, len); + data := data & block; + + /* The final status word contains the length of the response. We can not send it right now + * since the caller must first process the received data block and compute a response. When + * the exact length of the response data is known. The final status word can be sent using + * f_vpcd_store_data_final_ack() */ + if (substr(req.u.data, 2, 1) == '91'O) { + if (exp != ''O and block != exp) { + setverdict(fail, "received block contains unexpected data"); + } + return block; + } + + f_vpcd_send(ts_VPCD_DATA('9000'O)); + } + + setverdict(fail, "no data? (we should not reach this code path)"); + return ''O; +} + +/* Send a final status word to acknowledge the last block of a STORE DATA transmission. The status word will tell + * the IUT how many response bytes are available. (The IUT will immediately begin to fetch the response using + * one or more GetResponse requests */ +private function f_vpcd_store_data_final_ack(integer response_len) runs on IPAd_ConnHdlr { + var octetstring second_sw_byte; + var octetstring first_sw_byte; + + if (response_len > 255) { + second_sw_byte := '00'O; + } else { + second_sw_byte := int2oct(response_len, 1); + } + + if (response_len > 0) { + first_sw_byte := '61'O; /* 61xx */ + } else { + first_sw_byte := '90'O; /* 9000 */ + } + + f_vpcd_send(ts_VPCD_DATA(first_sw_byte & second_sw_byte)); +} + +/* Expect a pre-defined request (optional), and send a pre-defined response. This is a shortcut that only works in case + * the response does not depend on the request. */ +private function f_vpcd_transceive(octetstring response, octetstring expected_request := ''O) runs on IPAd_ConnHdlr { + + /* In case we do not use the VPCD (because we have some other kind of eUICC emulation or even a real card + * present), we just skip. */ + if (mp_use_vpcd == false) { + return; + } + + f_vpcd_store_data(expected_request); + f_vpcd_store_data_final_ack(lengthof(response)); + if (response != ''O) { + f_vpcd_get_response_multi(response); + } +} + +/* Handle the opening of logical channel 1 and the selection of the ISD-R */ +private function f_es10x_init() runs on IPAd_ConnHdlr { + var charstring eim_fqdn := mp_esipa_ip & ":" & int2str(mp_esipa_port); + + /* If we decide not to use vpcd, then we must not initialize anything here */ + if (mp_use_vpcd == false) { + return; + } + + /* Expect a MANAGE CHANNEL request that opens logical channel 1 */ + f_vpcd_exp(tr_VPCD_DATA('0070000100'O)); + f_vpcd_send(ts_VPCD_DATA('9000'O)); + + /* Expect selection of ISD-R request */ + f_vpcd_exp(tr_VPCD_DATA('01a4040410a0000005591010ffffffff8900000100'O)); + f_vpcd_send(ts_VPCD_DATA('6121'O)); /* 21 bytes of response, which are not requested by the ipad. */ + + /* Expect the IPAd to query the eID from the eUICC */ + f_vpcd_transceive(enc_GetEuiccDataResponse(valueof(ts_getEuiccDataResponse)), 'BF3E035C015A'O); + + /* Expect the IPAd to query the eIM configuration data from the eUICC */ + f_vpcd_transceive(enc_GetEimConfigurationDataResponse(valueof(ts_getEimConfigurationDataResponse(eim_fqdn))), 'BF5500'O); +} + +/* Handle the closing of logical channel 1 */ +private function f_es10x_close() runs on IPAd_ConnHdlr { + + /* Expect a MANAGE CHANNEL request that closes logical channel 1 */ + f_vpcd_exp(tr_VPCD_DATA('0070800100'O)); + f_vpcd_send(ts_VPCD_DATA('9000'O)); +} + +/* Receive one ESipa HTTP request */ +private function f_esipa_receive() runs on IPAd_ConnHdlr return EsipaMessageFromIpaToEim { + var HTTPMessage esipa_req; + timer T := 10.0; + var EsipaMessageFromIpaToEim request; + + T.start; + alt { + [] HTTP_SRV.receive({ request_binary := ? }) -> value esipa_req { + request := dec_EsipaMessageFromIpaToEim(esipa_req.request_binary.body); + } + [] T.timeout { + setverdict(fail, "no HTTP request received?"); + } + } + + return request; +} + +/* Send one ESipa HTTP response */ +private function f_esipa_send(EsipaMessageFromEimToIpa response) runs on IPAd_ConnHdlr { + var octetstring esipa_res; + esipa_res := enc_EsipaMessageFromEimToIpa(response); + HTTP_SRV.send(f_make_http_resp(esipa_res)); +} + +/* Perform one ESipa HTTP request/response cycle */ +private function f_esipa_transceive(EsipaMessageFromEimToIpa response) runs on IPAd_ConnHdlr return EsipaMessageFromIpaToEim { + var EsipaMessageFromIpaToEim request; + + request := f_esipa_receive(); + f_esipa_send(response); + + return request; +} + +/* Perform one ESipa HTTP request/response cycle but with an empty response */ +private function f_esipa_transceive_empty_response() runs on IPAd_ConnHdlr return EsipaMessageFromIpaToEim { + var EsipaMessageFromIpaToEim request; + + request := f_esipa_receive(); + HTTP_SRV.send(f_make_http_resp(''O)); + return request; +} + +/* Common Mutual Authentication Procedure, see also: GSMA SGP.22, section 3.0.1 */ +private function f_proc_cmn_mtl_auth() runs on IPAd_ConnHdlr { + var EsipaMessageFromIpaToEim esipa_req; + var EsipaMessageFromEimToIpa esipa_res; + + /* Step #1 */ + f_vpcd_transceive(enc_EUICCInfo1(valueof(ts_EUICCInfo1)), 'bf2000'O); + + /* Step #2-#4 */ + f_vpcd_transceive(enc_GetEuiccChallengeResponse(valueof(ts_GetEuiccChallengeResponse)), 'bf2e00'O); + + /* Step #5-#10 */ + esipa_req := f_esipa_receive(); + if (not match(esipa_req, tr_initiateAuthenticationRequestEsipa)) { + setverdict(fail, "unexpected message from IPAd"); + } + esipa_res := valueof(ts_initiateAuthenticationResponseEsipa(euiccChallenge := esipa_req.initiateAuthenticationRequestEsipa.euiccChallenge)); + f_esipa_send(esipa_res); + + /* Step #11-#14 */ + f_vpcd_transceive(enc_AuthenticateServerResponse(valueof(ts_authenticateServerResponse))); + + /* Step #15-#17 */ + esipa_req := f_esipa_transceive(valueof(ts_authenticateClientResponseEsipa_dpe)); + if (not match(esipa_req, tr_authenticateClientRequestEsipa)) { + setverdict(fail, "unexpected message from IPAd"); + } +} + +/* ********************************************* */ +/* ********** BELOW ONLY TESTCASES! ************ */ +/* ********************************************* */ + + +/* A testcase to try out an the Common Mutual Authentication Procedure */ +private function f_TC_proc_direct_prfle_dwnld(charstring id) runs on IPAd_ConnHdlr { + var EsipaMessageFromIpaToEim esipa_req; + var EsipaMessageFromEimToIpa esipa_res; + var integer i; + var charstring eim_fqdn := mp_esipa_ip & ":" & int2str(mp_esipa_port); + + f_es10x_init(); + f_http_register(); + + /* Prepare direct profile download by responding with a download trigger request */ + esipa_res := valueof(ts_getEimPackageResponse_dnlTrigReq); + esipa_req := f_esipa_transceive(esipa_res); + if (not match(esipa_req, tr_getEimPackageRequest)) { + setverdict(fail, "unexpected message from IPAd"); + } + + /* Expect the IPAd to query the eIM configuration data from the eUICC */ + f_vpcd_transceive(enc_GetEimConfigurationDataResponse(valueof(ts_getEimConfigurationDataResponse(eim_fqdn))), 'BF5500'O); + + f_proc_cmn_mtl_auth(); + + f_vpcd_transceive(enc_PrepareDownloadResponse(valueof(ts_prepareDownloadResponse))); + + esipa_res := valueof(ts_getBoundProfilePackageResponseEsipa); + esipa_req := f_esipa_transceive(esipa_res); + /* TODO: match response (we do not have a template yet) */ + + /* initialiseSecureChannelRequest */ + f_vpcd_transceive(''O); + + /* Step #3 (ES8+.ConfigureISDP) */ + for (i := 0; i < sizeof(esipa_res.getBoundProfilePackageResponseEsipa.getBoundProfilePackageOkEsipa.boundProfilePackage.firstSequenceOf87); i := i + 1) { + f_vpcd_transceive(''O); + } + + /* Step #4 (ES8+.StoreMetadata) */ + for (i := 0; i < sizeof(esipa_res.getBoundProfilePackageResponseEsipa.getBoundProfilePackageOkEsipa.boundProfilePackage.sequenceOf88); i := i + 1) { + f_vpcd_transceive(''O); + } + + /* Step #5 (ES8+.ReplaceSessionKeys", optional, left out) */ + if (ispresent(esipa_res.getBoundProfilePackageResponseEsipa.getBoundProfilePackageOkEsipa.boundProfilePackage.secondSequenceOf87)) { + for (i := 0; i < sizeof(esipa_res.getBoundProfilePackageResponseEsipa.getBoundProfilePackageOkEsipa.boundProfilePackage.secondSequenceOf87); i := i + 1) { + f_vpcd_transceive(''O); + } + } + + /* Step #6 (ES8+.LoadProfileElements) */ + for (i := 0; i < sizeof(esipa_res.getBoundProfilePackageResponseEsipa.getBoundProfilePackageOkEsipa.boundProfilePackage.sequenceOf86); i := i + 1) { + if (i < sizeof(esipa_res.getBoundProfilePackageResponseEsipa.getBoundProfilePackageOkEsipa.boundProfilePackage.sequenceOf86) - 1) { + f_vpcd_transceive(''O); + } else { + /* In the last message we send the ProfileInstallationResult */ + f_vpcd_transceive(enc_ProfileInstallationResult(valueof(ts_profileInstallationResult))); + } + } + + /* Receive ProfileInstallationResult from iPAD->eIM */ + esipa_req := f_esipa_transceive_empty_response(); + /* TODO: match response (we do not have a template yet) */ + + /* Receive RemoveNotificationFromList from iPAD->eUICC */ + f_vpcd_transceive(enc_NotificationSentResponse(valueof(ts_notificationSentResponse))); + + /* Wait some time until the the last HTTP response is actually delivered */ + f_sleep(2.0); + + f_es10x_close(); + + setverdict(pass); +} +testcase TC_proc_direct_prfle_dwnld() runs on MTC_CT { + var charstring id := testcasename(); + var IPAd_ConnHdlrPars pars := f_init_pars(); + var IPAd_ConnHdlr vc_conn; + f_init(id); + vc_conn := f_start_handler(refers(f_TC_proc_direct_prfle_dwnld), pars); + vc_conn.done; + setverdict(pass); +} + + +/* A testcase to try out an the Generic eUICC Package Download and Execution Procedure */ +private function f_TC_proc_euicc_pkg_dwnld_exec(charstring id) runs on IPAd_ConnHdlr { + var EsipaMessageFromIpaToEim esipa_req; + var EsipaMessageFromEimToIpa esipa_res; + + f_es10x_init(); + f_http_register(); + + /* Step #1-#2 */ + esipa_res := valueof(ts_getEimPackageResponse_euiccPkgReq); + esipa_req := f_esipa_transceive(esipa_res); + if (not match(esipa_req, tr_getEimPackageRequest)) { + setverdict(fail, "unexpected message from IPAd"); + } + + /* Step #3-#8 */ + f_vpcd_transceive(enc_EuiccPackageResult(valueof(ts_euiccPackageResult))); + + /* Step #9 */ + f_vpcd_transceive(enc_RetrieveNotificationsListResponse(valueof(ts_retrieveNotificationsListResponse))); + + /* Step #10-14 */ + esipa_res := valueof(ts_provideEimPackageResultResponse(eimAcknowledgements := {1,2,3,4})); + esipa_req := f_esipa_transceive(esipa_res); + /* TODO: match request */ + + /* Step #15-17 */ + f_vpcd_transceive(enc_NotificationSentResponse(valueof(ts_notificationSentResponse))); + f_vpcd_transceive(enc_NotificationSentResponse(valueof(ts_notificationSentResponse))); + f_vpcd_transceive(enc_NotificationSentResponse(valueof(ts_notificationSentResponse))); + f_vpcd_transceive(enc_NotificationSentResponse(valueof(ts_notificationSentResponse))); + f_vpcd_transceive(enc_NotificationSentResponse(valueof(ts_notificationSentResponse))); + + /* Wait some time until the the HTTP response is actually delivered */ + f_sleep(2.0); + + f_es10x_close(); + + setverdict(pass); +} + +testcase TC_proc_euicc_pkg_dwnld_exec() runs on MTC_CT { + var charstring id := testcasename(); + var IPAd_ConnHdlrPars pars := f_init_pars(); + var IPAd_ConnHdlr vc_conn; + f_init(id); + vc_conn := f_start_handler(refers(f_TC_proc_euicc_pkg_dwnld_exec), pars); + vc_conn.done; + setverdict(pass); +} + +/* A testcase to try out an IpaEuiccDataRequest */ +private function f_TC_proc_euicc_data_req(charstring id) runs on IPAd_ConnHdlr { + var EsipaMessageFromIpaToEim esipa_req; + var EsipaMessageFromEimToIpa esipa_res; + var charstring eim_fqdn := mp_esipa_ip & ":" & int2str(mp_esipa_port); + + f_es10x_init(); + f_http_register(); + + /* IPAd requests a package, we tell it to execute an ipaEuiccDataRequest */ + esipa_res := valueof(ts_getEimPackageResponse_euiccDataReq); + esipa_req := f_esipa_transceive(esipa_res); + if (not match(esipa_req, tr_getEimPackageRequest)) { + setverdict(fail, "unexpected message from IPAd"); + } + + /* IPAd will obtain the data from the eUICC */ + f_vpcd_transceive(enc_EuiccConfiguredAddressesResponse(valueof(ts_euiccConfiguredAddressesResponse))); + f_vpcd_transceive(enc_EUICCInfo1(valueof(ts_EUICCInfo1))); + f_vpcd_transceive(enc_EUICCInfo2(valueof(ts_EUICCInfo2))); + f_vpcd_transceive(enc_GetEimConfigurationDataResponse(valueof(ts_getEimConfigurationDataResponse(eim_fqdn)))); + f_vpcd_transceive(enc_GetCertsResponse(valueof(ts_getCertsResponse))); + f_vpcd_transceive(enc_RetrieveNotificationsListResponse(valueof(ts_retrieveNotificationsListResponse))); + + /* IPAd will return the data to us */ + esipa_res := valueof(ts_provideEimPackageResultResponse(eimAcknowledgements := {1,2,3,4})); + esipa_req := f_esipa_transceive(esipa_res); + + /* Wait some time until the the HTTP response is actually delivered */ + f_sleep(2.0); + + f_es10x_close(); + + setverdict(pass); +} +testcase TC_proc_euicc_data_req() runs on MTC_CT { + var charstring id := testcasename(); + var IPAd_ConnHdlrPars pars := f_init_pars(); + var IPAd_ConnHdlr vc_conn; + f_init(id); + vc_conn := f_start_handler(refers(f_TC_proc_euicc_data_req), pars); + vc_conn.done; + setverdict(pass); +} + +/* A testcase to try out what happens when the eIM package request is rejected */ +private function f_TC_get_eim_pkg_req_rej(charstring id) runs on IPAd_ConnHdlr { + var EsipaMessageFromIpaToEim esipa_req; + var EsipaMessageFromEimToIpa esipa_res; + + f_es10x_init(); + f_http_register(); + + /* IPAd requests a package, we respond with an eimPackageError code 127 (undefined error) */ + esipa_res := valueof(ts_getEimPackageResponse_eimPkgErrUndef); + esipa_req := f_esipa_transceive(esipa_res); + if (not match(esipa_req, tr_getEimPackageRequest)) { + setverdict(fail, "unexpected message from IPAd"); + } + + /* Wait some time until the the HTTP response is actually delivered */ + f_sleep(2.0); + + f_es10x_close(); + + setverdict(pass); +} +testcase TC_get_eim_pkg_req_rej() runs on MTC_CT { + var charstring id := testcasename(); + var IPAd_ConnHdlrPars pars := f_init_pars(); + var IPAd_ConnHdlr vc_conn; + f_init(id); + vc_conn := f_start_handler(refers(f_TC_get_eim_pkg_req_rej), pars); + vc_conn.done; + setverdict(pass); +} + +/* A testcase to try out the ES10b function AddInitialEim */ +private function f_TC_add_init_eim(charstring id) runs on IPAd_ConnHdlr { + var EsipaMessageFromIpaToEim esipa_req; + var EsipaMessageFromEimToIpa esipa_res; + + f_es10x_init(); + + f_vpcd_transceive(enc_AddInitialEimResponse(valueof(ts_addInitialEimResponse))); + + f_es10x_close(); + + setverdict(pass); +} +testcase TC_add_init_eim() runs on MTC_CT { + var charstring id := testcasename(); + var IPAd_ConnHdlrPars pars := f_init_pars(); + var IPAd_ConnHdlr vc_conn; + f_init(id); + vc_conn := f_start_handler(refers(f_TC_add_init_eim), pars); + vc_conn.done; + setverdict(pass); +} + +control { + execute ( TC_proc_direct_prfle_dwnld() ); + execute ( TC_proc_euicc_pkg_dwnld_exec() ); + execute ( TC_proc_euicc_data_req() ); + execute ( TC_get_eim_pkg_req_rej() ); +// execute ( TC_add_init_eim() ); +} + +} \ No newline at end of file diff --git a/ipad/gen_links.sh b/ipad/gen_links.sh new file mode 100755 index 0000000..130c68e --- /dev/null +++ b/ipad/gen_links.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +BASEDIR=../deps + +. ../gen_links.sh.inc + +DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src +FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.Common_Components.Abstract_Socket/src +FILES="Abstract_Socket.cc Abstract_Socket.hh " +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.HTTPmsg/src +FILES="HTTPmsg_MessageLen.ttcn HTTPmsg_MessageLen_Function.cc HTTPmsg_PT.cc HTTPmsg_PT.hh HTTPmsg_PortType.ttcn " +FILES+="HTTPmsg_Types.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src +FILES="Socket_API_Definitions.ttcn" +gen_links $DIR $FILES + +DIR=$BASEDIR/titan.TestPorts.IPL4asp/src +FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttcn IPL4asp_Types.ttcn " +FILES+="IPL4asp_discovery.cc IPL4asp_protocol_L234.hh" +gen_links $DIR $FILES + +DIR=../library/euicc +FILES="PEDefinitions.asn PKIX1Explicit88.asn PKIX1Implicit88.asn RSPDefinitions.asn SGP32Definitions.asn " +FILES+="PKIX1Explicit88_Templates.ttcn PKIX1Explicit88_Types.ttcn PKIX1Implicit88_Templates.ttcn " +FILES+="PKIX1Implicit88_Types.ttcn RSPDefinitions_Templates.ttcn RSPDefinitions_Types.ttcn " +FILES+="SGP32Definitions_Templates.ttcn SGP32Definitions_Types.ttcn " +FILES+="PKIX1Explicit88_EncDec.cc PKIX1Implicit88_EncDec.cc RSPDefinitions_EncDec.cc SGP32Definitions_EncDec.cc" +gen_links $DIR $FILES + +DIR=../library +FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc " +FILES+="VPCD_Types.ttcn VPCD_CodecPort.ttcn VPCD_CodecPort_CtrlFunct.ttcn VPCD_CodecPort_CtrlFunctDef.cc " +FILES+="VPCD_Adapter.ttcn HTTP_Server_Emulation.ttcn" +gen_links $DIR $FILES + +ignore_pp_results diff --git a/ipad/regen_makefile.sh b/ipad/regen_makefile.sh new file mode 100755 index 0000000..9123e43 --- /dev/null +++ b/ipad/regen_makefile.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +NAME=IPAd_Tests + +FILES=" + *.ttcn + *.asn + Abstract_Socket.cc + HTTPmsg_MessageLen_Function.cc + HTTPmsg_PT.cc + IPL4asp_PT.cc + IPL4asp_discovery.cc + Native_FunctionDefs.cc + TCCConversion.cc + TCCInterface.cc + SGP32Definitions_EncDec.cc + RSPDefinitions_EncDec.cc + PKIX1Explicit88_EncDec.cc + PKIX1Implicit88_EncDec.cc + VPCD_CodecPort_CtrlFunctDef.cc +" +../regen-makefile.sh IPAd_Tests.ttcn $FILES + +# required for forkpty(3) used by PIPEasp +sed -i -e '/^LINUX_LIBS/ s/$/ -lutil/' Makefile diff --git a/ipad/server.crt b/ipad/server.crt new file mode 100644 index 0000000..c113a77 --- /dev/null +++ b/ipad/server.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDyTCCArECFEz9Tzs8MSJUbUSExuS62RPPnfhjMA0GCSqGSIb3DQEBCwUAMIGg +MQswCQYDVQQGEwJERTEPMA0GA1UECAwGQmVybGluMQ8wDQYDVQQHDAZCZXJsaW4x +HTAbBgNVBAoMFElQQWQgdGVzdCBpbmR1c3RyaWVzMRswGQYDVQQLDBJ0ZXN0aW5n +IGRlcGFydG1lbnQxEjAQBgNVBAMMCTEyNy4wLjAuMTEfMB0GCSqGSIb3DQEJARYQ +dGVzdEBleGFtcGxlLm5ldDAeFw0yNDAxMTUxMDMxMTJaFw0yNTAxMTQxMDMxMTJa +MIGgMQswCQYDVQQGEwJERTEPMA0GA1UECAwGQmVybGluMQ8wDQYDVQQHDAZCZXJs +aW4xHTAbBgNVBAoMFElQQWQgdGVzdCBpbmR1c3RyaWVzMRswGQYDVQQLDBJ0ZXN0 +aW5nIGRlcGFydG1lbnQxEjAQBgNVBAMMCTEyNy4wLjAuMTEfMB0GCSqGSIb3DQEJ +ARYQdGVzdEBleGFtcGxlLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAK7dI15D1/n+axIimHQvQdhwzpFGNu/PQc+WimVNT4yX5PEbLgiX+OzJMhum +TMU2a/rdNSWAKAa/fK8X8cyFdsJ0hOvTta+1aNzwvVpqjHRwgzKgwjSQ625dujkr +ztERZcM7jrv4+rbU6kFc6W8hb4z4d66RJsDe0cwtsAvP9aipwtOIW4+6IdcduH0g +ANsPadebUz7Cc1l8LUQdfbwU/8VVtlr2RHPMviSidWYworclYYVzM3zvHM1bObo/ +PNCBsq8z9l8KJJqcZhsI9J+Z/5PzGSNGSvI7B55AUZHzt/E86CaRpGrUr+KctV6j +z6CDwdZHVsxRuMvWKsAL5Bw65LsCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAnPK4 +dyWCA9mYm5swYEcavhtyJvNwZ1zEp/MHJ40egZFpSnGqNbpEYgjCmqCrpHQxU1Qc +CtgXKgQMuUbvzJio5Mdp1JeSWJD18cBEhWcuufVMvN/HqMw/yJBCmizarUKjRNrE +o2C1P9287fUWdzGxXYPtevMV0E1DQ6v+xTnt1/gyiCtElctYO3f7tkioTmWXGzJY +AyelLfp0F/+lX3Ep1uUIvO7Dofzu+tKilbqqZjBO+gqPQFPRXrbXO90p7bvBieb5 +dBG2segL2hmzYzfKXnKaXU42CgyJgJ2DFChz3RwD41Y8q53wrZjjqM5e8rLNwJEI +dBbKBUSZVr0r9mY7dA== +-----END CERTIFICATE----- diff --git a/ipad/server.key b/ipad/server.key new file mode 100644 index 0000000..936d603 --- /dev/null +++ b/ipad/server.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEArt0jXkPX+f5rEiKYdC9B2HDOkUY2789Bz5aKZU1PjJfk8Rsu +CJf47MkyG6ZMxTZr+t01JYAoBr98rxfxzIV2wnSE69O1r7Vo3PC9WmqMdHCDMqDC +NJDrbl26OSvO0RFlwzuOu/j6ttTqQVzpbyFvjPh3rpEmwN7RzC2wC8/1qKnC04hb +j7oh1x24fSAA2w9p15tTPsJzWXwtRB19vBT/xVW2WvZEc8y+JKJ1ZjCityVhhXMz +fO8czVs5uj880IGyrzP2XwokmpxmGwj0n5n/k/MZI0ZK8jsHnkBRkfO38TzoJpGk +atSv4py1XqPPoIPB1kdWzFG4y9YqwAvkHDrkuwIDAQABAoIBAQCN/JQ+c7pIjTSl +uh+un7zIofipb6kmGlWm2OcxkJAaajAFMvuzEKuYoVolp2hI7oLJZZtFAwX9TLlS +d4/ocSrYhMJ1tyedMCGg3X3zj/bSiZWOo4huJIp2yHZw+8hobMcDuzWQHoB9uu8n ++ei2SyEIB60uu0ALdiJGt4ZuYQNpWm55+TwC7j33+8dnPQQof+2vlxMhKoQmZV68 +2VK01o+P1184CqYisecjmKK1zqEvvHFr0QV5hjznZwJXA3eshJe2hydAI3aDamAz +ZD3j54nKtGkwSB4W82SCHEzANTwF5QQYEUiKiGu8EjeTNpSlQ1P4Szf9tjx3rc2m +gcot2YXRAoGBAOQyGQWazJ8EjNDwguc6qeOkSgnWq6HyxcATY9lB2QsPGDs6h6bM +wfnrqEMD8DWyzCuFNtAHcV+KZaNWnGPSQT8pEGGFPgIuH0xSIKbuzu8bE1lv88jU +nPrR+2+N0bd98ilVLQHRb3IlT9FswBF3c2wAm9+c7LoNJ/7pMUM7YQizAoGBAMQr +geewxNjNd8p5NdAi3wp7W8e5XzoJ4iK6y8fnCm2XsVTROtP8xxc6dI4I3OcUzYIa +woN0+RZ1PudC5oGmkPsXzoyORqjAuCOfrYZ62pg7pwRemGGq2Mk+eHfo09d1PrMT +HpkzNRNOk/+pcyKfWUm81NTILPRm/XbIhB6d2+fZAoGBANsg9IA6T2YgQ2zcmIed +AMk12VcrSrOAYr74n7hgECEbhKRTpzHYjCkHUBPSc1fNc1wTVzha/VbGmqVIJXOB +0t/o+e77uTj0u19ZujszNYnMUT9gTxS6fmgpPi64W/u9OM7SGR8W09Mj20r7CFF9 +iFvdFdGcaoKa4Z5apdCu85YbAoGAW3EAY9S1XW4hecMYf4XRvBwWgzn4lqBGxfOW +y/75kG5WXfgN2QUKdNxtukuNVTYQOaZpp0deWMacZMZ9lk/jYvgM8t3bOAxliU2E +YJxhyvZ7ewDxPQ2bcetp0lM4dEWVzXmLGNSS2AYX3OPK5Ies4j9gYjNRKTfczILZ +e0AQYrkCgYEAjJk1an5S6JQMMcdU1KX0uAUJOVu1xkkTvUBYOaC3VzeyYhMJXdOC +g8z/xrFDm7spyCbQPfsA3RHb40ZiGpb2oYhdunEI3f3ZW7RVJSdVeeZAP+IXZOCd +v4+rGNjjXLfpK+TOGkeSNkOivAvpw0mzskCRDfKcsndtwC28OElzCPc= +-----END RSA PRIVATE KEY----- diff --git a/regen-makefile.sh b/regen-makefile.sh index 09088e0..813b212 100755 --- a/regen-makefile.sh +++ b/regen-makefile.sh @@ -41,12 +41,12 @@
sed -i -e 's/# TTCN3_DIR = /TTCN3_DIR = /usr/' Makefile sed -i -e 's/LDFLAGS = /LDFLAGS = -L /usr/lib/titan/' Makefile -sed -i -e 's/LINUX_LIBS = -lxml2/LINUX_LIBS = -lxml2 -lsctp/' Makefile +sed -i -e 's/LINUX_LIBS = -lxml2/LINUX_LIBS = -lxml2 -lsctp -lssl/' Makefile #sed -i -e 's/TTCN3_LIB = ttcn3-parallel/TTCN3_LIB = ttcn3/' Makefile
# The -DMAKEDEPEND_RUN is a workaround for Debian packaging issue, # see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=879816 for details -sed -i -e 's/CPPFLAGS = -D$(PLATFORM)/CPPFLAGS = -D$(PLATFORM) -DMAKEDEPEND_RUN -DUSE_SCTP -DLKSCTP_MULTIHOMING_ENABLED/' Makefile +sed -i -e 's/CPPFLAGS = -D$(PLATFORM)/CPPFLAGS = -D$(PLATFORM) -DMAKEDEPEND_RUN -DUSE_SCTP -DLKSCTP_MULTIHOMING_ENABLED -DAS_USE_SSL/' Makefile
#remove -Wall from CXXFLAGS: we're not interested in generic warnings for autogenerated code cluttering the logs sed -i -e 's/-Wall//' Makefile