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(a)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
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36229?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ic9ea8c69e56a2e8ddf0f506861ece6d40cbcb06d
Gerrit-Change-Number: 36229
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
Gerrit-MessageType: newchange