pespin has uploaded this change for review.

View Change

WIP: Introduce ausf testsuite

Change-Id: Ife5af76587b4416767535875e27b02236ee5e1d9
---
M Makefile
A ausf/AUSF_Tests.cfg
A ausf/AUSF_Tests.default
A ausf/AUSF_Tests.ttcn
A ausf/ConnHdlr.ttcn
A ausf/README.md
A ausf/expected-results.xml
A ausf/gen_links.sh
A ausf/open5gs-ausf.yaml
A ausf/regen_makefile.sh
A ausf/testenv.cfg
A ausf/testsrcdir.cfg
A library/TS29509_Nausf_UEAuthentication_Templates.ttcn
13 files changed, 732 insertions(+), 0 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/60/43960/1
diff --git a/Makefile b/Makefile
index ed02e18..459929a 100644
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,7 @@
SUBDIRS= \
5gc \
asterisk \
+ ausf \
bsc \
bsc-nat \
bts \
diff --git a/ausf/AUSF_Tests.cfg b/ausf/AUSF_Tests.cfg
new file mode 100644
index 0000000..c23657a
--- /dev/null
+++ b/ausf/AUSF_Tests.cfg
@@ -0,0 +1,23 @@
+[ORDERED_INCLUDE]
+# Common configuration, shared between test suites
+"../Common.cfg"
+# testsuite specific configuration, not expected to change
+"./AUSF_Tests.default"
+
+# Local configuration below
+
+[LOGGING]
+
+[TESTPORT_PARAMETERS]
+
+[MODULE_PARAMETERS]
+AUSF_Tests.mp_ausf_hostname := "127.0.0.11";
+AUSF_Tests.mp_ausf_sbi_port := 7777;
+AUSF_Tests.mp_scp_local_ip := "127.0.0.200";
+AUSF_Tests.mp_scp_local_port := 7777;
+AUSF_Tests.mp_ausf_local_ip := "127.0.0.6";
+
+[MAIN_CONTROLLER]
+
+[EXECUTE]
+AUSF_Tests.control
diff --git a/ausf/AUSF_Tests.default b/ausf/AUSF_Tests.default
new file mode 100644
index 0000000..b03f59e
--- /dev/null
+++ b/ausf/AUSF_Tests.default
@@ -0,0 +1,12 @@
+[LOGGING]
+FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING | DEBUG_ENCDEC;
+
+[TESTPORT_PARAMETERS]
+*.TCP.noDelay := "yes" // turn off nagle
+*.HTTP.use_notification_ASPs := "yes"
+
+[MODULE_PARAMETERS]
+
+[MAIN_CONTROLLER]
+
+[EXECUTE]
diff --git a/ausf/AUSF_Tests.ttcn b/ausf/AUSF_Tests.ttcn
new file mode 100644
index 0000000..3638e87
--- /dev/null
+++ b/ausf/AUSF_Tests.ttcn
@@ -0,0 +1,137 @@
+/* AUSF test suite in TTCN-3 (3GPP TS 29.503, 3GPP TS 29.509)
+ * (C) 2026 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ *
+ * 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 AUSF_Tests {
+
+import from General_Types all;
+import from Native_Functions all;
+import from IPL4asp_Types all;
+import from Misc_Helpers all;
+
+import from Osmocom_Types all;
+import from GSM_Types all;
+
+import from TCCEncoding_Functions all;
+
+import from HTTP2_Adapter all;
+import from HTTP2_Server_Emulation all;
+
+import from ConnHdlr all;
+
+modulepar {
+ charstring mp_ausf_hostname := "127.0.0.11";
+ integer mp_ausf_sbi_port := 7777;
+
+ charstring mp_scp_local_ip := "127.0.0.200";
+ integer mp_scp_local_port := 7777;
+
+ /* IP address at which we listen for HTTP2/SBI to emulate a AUSF in ttcn3 */
+ charstring mp_ausf_local_ip := "127.0.0.6";
+
+ GsmMcc mp_mcc := '999'H;
+ GsmMnc mp_mnc := '70'H;
+ HEX15n mp_imsi := '999700000000000'H;
+}
+
+type component MTC_CT extends HTTP2_CT, HTTP2_ConnHdlr {
+ /* emulated SCP */
+ var HTTP2_Server_Emulation_CT vc_HTTP2_SRV_SCP;
+
+ timer g_Tguard := 30.0;
+}
+
+private function f_init_http2_srv(charstring id) runs on MTC_CT {
+ id := id & "-HTTP2SRV";
+
+ var Http2ServerEmulationCfg http2_srv_cfg := {
+ http2_bind_ip := mp_scp_local_ip,
+ http2_bind_port := mp_scp_local_port,
+ one_req_per_conn := false
+ };
+
+ vc_HTTP2_SRV_SCP := HTTP2_Server_Emulation_CT.create(id) alive;
+ vc_HTTP2_SRV_SCP.start(HTTP2_Server_Emulation.main(http2_srv_cfg));
+
+ connect(self:HTTP2_CONN_PROC[HTTP2_CONN_SCP], vc_HTTP2_SRV_SCP:CONN_PROC);
+}
+
+
+private function f_init(integer imsi_suffix := 0, float t_guard := 30.0) runs on MTC_CT {
+ var charstring id := testcasename();
+
+ g_Tguard.start(t_guard);
+ activate(as_Tguard());
+
+ f_init_http2_srv(id);
+}
+
+private function f_shutdown() runs on MTC_CT {
+ f_http2_server_close_conn_all();
+ setverdict(pass);
+}
+
+private function f_start_handler_create()
+runs on MTC_CT return ConnHdlr
+{
+ var ConnHdlr vc_conn;
+ var charstring id := testcasename();
+
+ vc_conn := ConnHdlr.create(id);
+
+ if (isbound(vc_HTTP2_SRV_SCP)) {
+ connect(vc_conn:HTTP2_CONN[HTTP2_CONN_SCP], vc_HTTP2_SRV_SCP:CONN);
+ connect(vc_conn:HTTP2_CONN_PROC[HTTP2_CONN_SCP], vc_HTTP2_SRV_SCP:CONN_PROC);
+ }
+
+ return vc_conn;
+}
+
+private function f_start_handler_run(ConnHdlr vc_conn, void_fn fn, ConnHdlrPars pars) runs on MTC_CT
+{
+ vc_conn.start(f_ConnHdlr_init(fn, pars));
+}
+
+/* start a connection handler with given parameters */
+private function f_start_handler(void_fn fn, ConnHdlrPars pars)
+runs on MTC_CT return ConnHdlr {
+ var ConnHdlr vc_conn;
+ vc_conn := f_start_handler_create();
+ f_start_handler_run(vc_conn, fn, pars);
+ return vc_conn;
+}
+
+private altstep as_Tguard() runs on MTC_CT {
+ [] g_Tguard.timeout {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Tguard timeout");
+ }
+}
+
+/* 3GPP TS 29.509 5.2.2.2.2 5G AKA */
+private function f_TC_5g_aka() runs on ConnHdlr {
+ f_n12_post_ue_authentications();
+ f_n12_put_5g_aka_confirmation();
+ setverdict(pass);
+}
+testcase TC_5g_aka() runs on MTC_CT {
+ var ConnHdlr vc_conn;
+ var ConnHdlrPars pars := f_ConnHdlrPars(0);
+ f_init();
+ vc_conn := f_start_handler(refers(f_TC_5g_aka), pars);
+ vc_conn.done;
+ f_shutdown();
+}
+
+
+control {
+ execute( TC_5g_aka() );
+}
+
+}
diff --git a/ausf/ConnHdlr.ttcn b/ausf/ConnHdlr.ttcn
new file mode 100644
index 0000000..64c0b66
--- /dev/null
+++ b/ausf/ConnHdlr.ttcn
@@ -0,0 +1,339 @@
+/* AUSF test suite in TTCN-3 (3GPP TS 29.503, 3GPP TS 29.509), ConnHdlr
+ * (C) 2026 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ *
+ * 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 ConnHdlr {
+
+import from TCCEncoding_Functions all;
+
+import from General_Types all;
+import from Native_Functions all;
+import from IPL4asp_Types all;
+import from Misc_Helpers all;
+
+import from Osmocom_Types all;
+import from GSM_Types all;
+
+import from HTTP2_Types all;
+import from HTTP2_Templates all;
+import from HTTP2_Functions all;
+import from HTTP2_Msg all;
+import from HTTP2_Adapter all;
+import from HTTP2_Server_Emulation all;
+
+import from Prometheus_Checker all;
+
+import from TS29571_CommonData_Templates all;
+import from TS29503_Nudm_UEAU all;
+import from TS29503_Nudm_UEAU_Templates all;
+import from TS29509_Nausf_UEAuthentication all;
+import from TS29509_Nausf_UEAuthentication_Templates all;
+
+import from AUSF_Tests all;
+
+const integer HTTP2_CONN_SCP := 0;
+
+/* These are a preset of path matches which can be applied through the entire lifecycle of the session: */
+function f_http2_server_path_match()
+runs on ConnHdlr return charstring {
+ var charstring imsi_match := "*imsi-" & g_pars.imsi_str & "*";
+ return imsi_match;
+}
+
+type record ConnHdlrPars {
+ integer idx,
+ hexstring imsi,
+ charstring imsi_str,
+ charstring serving_network,
+ charstring nudm_ueau_auth_ctx_id optional
+}
+
+type component ConnHdlr extends HTTP2_CT, HTTP2_ConnHdlr, Prometheus_Checker_CT {
+ var ConnHdlrPars g_pars;
+}
+
+type function void_fn() runs on ConnHdlr;
+
+function f_ConnHdlrPars(integer idx := 0) return ConnHdlrPars
+{
+ var hexstring imsi := f_concat_pad(lengthof(mp_imsi), substr(mp_imsi, 0, lengthof(mp_imsi) - 6), idx);
+ var charstring imsi_str := f_dec_TBCD(imsi_hex2oct(imsi));
+ var template (value) ConnHdlrPars pars := {
+ idx := idx,
+ imsi := imsi,
+ imsi_str := imsi_str,
+ serving_network := "5G:mnc070.mcc999.3gppnetwork.org", /* TODO: set based on mp_mcc and mp_mnc */
+ nudm_ueau_auth_ctx_id := omit
+ };
+ return valueof(pars);
+}
+
+function f_ConnHdlr_init(void_fn fn, ConnHdlrPars pars) runs on ConnHdlr {
+ /* make parameters available via component variable */
+ g_pars := pars;
+
+ /* Setup */
+ /* Register SCP HTTP2 sever, where IUT will send all SBI requests: */
+ f_http2_server_emu_register(f_http2_server_path_match(), idx := HTTP2_CONN_SCP);
+ f_http2_adapter_init();
+
+ fn.apply();
+
+ /* Cleanup */
+ f_http2_server_emu_unregister(f_http2_server_path_match(), idx := HTTP2_CONN_SCP);
+}
+
+/********************************************
+ * SCP
+/*******************************************/
+const charstring c_SCP_uri_hostport := mp_scp_local_ip & ":" & int2str(mp_scp_local_port);
+const charstring c_SCP_uri_prefix := "http://" & c_SCP_uri_hostport;
+
+/***********************************************************************
+ * N12 Nausf_UEAuthentication (SBI): Emulated AMF, 3GPP TS 29.509 A.2
+ ***********************************************************************/
+const charstring c_Nausf_uri_hostport := mp_ausf_hostname & ":" & int2str(mp_ausf_sbi_port);
+const charstring c_Nausf_uri_prefix := "http://" & c_Nausf_uri_hostport;
+
+/* 3GPP TS 29.509 6.1.3.2.3.1 Resource: ue-authentications (POST) */
+private function f_n12_prepare_post_ue_authentications(AuthenticationInfo auth_info)
+runs on ConnHdlr return HTTP2_Msg {
+ var octetstring auth_info_enc;
+ var integer http2_idx;
+ var integer http2_stream_id;
+ var template (value) HTTP2_Msg http2_tx;
+
+ auth_info_enc := f_enc_AuthenticationInfo(auth_info);
+
+ http2_idx := f_http2_adapter_find_free_idx();
+ http2_stream_id := f_http2_adapter_next_stream_id(http2_idx);
+ http2_tx := ts_HTTP2_Msg(http2_idx,
+ http2_stream_id,
+ hb := {
+ pseudo_headers := ts_HTTP2_pseudo_headers_Req(method := "POST",
+ scheme := "http",
+ authority := c_Nausf_uri_hostport,
+ path := c_Nausf_UEAuthentication_path_ue_authentications),
+ headers := {
+ ts_HTTP2_Hdr_content_type("application/json"),
+ ts_HTTP2_Hdr_accept("application/json"),
+ ts_HTTP2_Hdr_user_agent("ttcn3-ausf"),
+ ts_HTTP2_Hdr_accept_encoding("gzip")
+ }
+ },
+ body := ts_HTTP2_Data_frame(http2_stream_id,
+ end_stream_flag := true,
+ data := auth_info_enc));
+ return valueof(http2_tx);
+}
+
+/* 3GPP TS 29.509 6.1.3.2.3.1 Resource: ue-authentications (POST) */
+function f_n12_post_ue_authentications()
+runs on ConnHdlr {
+ var HTTP2_Msg http2_tx;
+ var HTTP2_Msg http2_rx;
+ var template (present) HTTP2_Msg http2_exp_rx;
+ var template (value) AuthenticationInfo auth_info;
+
+ auth_info := ts_AuthenticationInfo(supiOrSuci := ts_sbi_Supi(g_pars.imsi_str),
+ servingNetworkName := g_pars.serving_network);
+
+ http2_tx := f_n12_prepare_post_ue_authentications(valueof(auth_info));
+ f_http2_adapter_connect(mp_ausf_hostname, mp_ausf_sbi_port, mp_ausf_local_ip, idx := http2_tx.conn_id);
+ f_http2_adapter_send(http2_tx);
+
+ as_Nudm_UEAU_post_generate_auth_data();
+
+ /* 3GPP TS 29.509 Table 6.1.3.2.3.1-3 */
+ http2_exp_rx :=
+ tr_HTTP2_Msg(http2_tx.conn_id,
+ http2_tx.stream_id,
+ tr_HTTP2_header_block(pseudo_headers := tr_HTTP2_pseudo_headers_Resp(201)),
+ tr_HTTP2_Data_frame(stream_id := http2_tx.stream_id,
+ end_stream_flag := true,
+ data := decmatch tr_UEAuthenticationCtx));
+ as_http2_adapter_receive(http2_rx, http2_exp_rx, idx := http2_tx.conn_id);
+
+ /* Store obtained authCtxId:*/
+ var charstring created_location := valueof(f_HTTP2_header_list_find_header(http2_rx.hb.headers, c_HTTP2_HDR_location));
+ g_pars.nudm_ueau_auth_ctx_id := regexp(created_location, c_Nausf_uri_prefix & c_Nausf_UEAuthentication_path_ue_authentications & "/(?+)", 0);
+
+
+ f_http2_adapter_close(idx := http2_tx.conn_id);
+ setverdict(pass);
+}
+
+/* 3GPP TS 29.509 6.1.3.3.3.1 Resource: 5g-aka-confirmation (PUT) */
+private function f_n12_prepare_put_5g_aka_confirmation(ConfirmationData conf_data)
+runs on ConnHdlr return HTTP2_Msg {
+ var octetstring conf_data_enc;
+ var integer http2_idx;
+ var integer http2_stream_id;
+ var template (value) HTTP2_Msg http2_tx;
+
+ conf_data_enc := f_enc_ConfirmationData(conf_data);
+
+ http2_idx := f_http2_adapter_find_free_idx();
+ http2_stream_id := f_http2_adapter_next_stream_id(http2_idx);
+ http2_tx := ts_HTTP2_Msg(http2_idx,
+ http2_stream_id,
+ hb := {
+ pseudo_headers := ts_HTTP2_pseudo_headers_Req(method := "PUT",
+ scheme := "http",
+ authority := c_Nausf_uri_hostport,
+ path := ts_Nausf_UEAuthentication_path_5g_aka_confirmation(g_pars.nudm_ueau_auth_ctx_id)),
+ headers := {
+ ts_HTTP2_Hdr_content_type("application/json"),
+ ts_HTTP2_Hdr_accept("application/json"),
+ ts_HTTP2_Hdr_user_agent("ttcn3-ausf"),
+ ts_HTTP2_Hdr_accept_encoding("gzip")
+ }
+ },
+ body := ts_HTTP2_Data_frame(http2_stream_id,
+ end_stream_flag := true,
+ data := conf_data_enc));
+ return valueof(http2_tx);
+}
+
+/* 3GPP TS 29.509 6.1.3.3.3.1 Resource: 5g-aka-confirmation (PUT) */
+function f_n12_put_5g_aka_confirmation()
+runs on ConnHdlr {
+ var HTTP2_Msg http2_tx;
+ var HTTP2_Msg http2_rx;
+ var template (present) HTTP2_Msg http2_exp_rx;
+ var template (value) ConfirmationData conf_data;
+
+ conf_data := ts_ConfirmationData(resStar := ts_ResStar(""));
+
+ http2_tx := f_n12_prepare_put_5g_aka_confirmation(valueof(conf_data));
+ f_http2_adapter_connect(mp_ausf_hostname, mp_ausf_sbi_port, mp_ausf_local_ip, idx := http2_tx.conn_id);
+ f_http2_adapter_send(http2_tx);
+
+ as_Nudm_UEAU_post_auth_events();
+
+ /* 3GPP TS 29.503 Table 6.3.3.2.4.2.2-2 */
+ http2_exp_rx :=
+ tr_HTTP2_Msg(http2_tx.conn_id,
+ http2_tx.stream_id,
+ tr_HTTP2_header_block(pseudo_headers := tr_HTTP2_pseudo_headers_Resp(200)),
+ tr_HTTP2_Data_frame(stream_id := http2_tx.stream_id,
+ end_stream_flag := true,
+ data := decmatch tr_ConfirmationDataResponse));
+ as_http2_adapter_receive(http2_rx, http2_exp_rx, idx := http2_tx.conn_id);
+
+ f_http2_adapter_close(idx := http2_tx.conn_id);
+ setverdict(pass);
+}
+
+/****************************************************
+ * N13 Nudm_UEAU (SBI): Emulated UDM, 3GPP TS 29.503
+ ****************************************************/
+const charstring Nudm_uri_hostport := mp_scp_local_ip & ":" & int2str(mp_scp_local_port);
+const charstring Nudm_uri_prefix := "http://" & Nudm_uri_hostport;
+
+template (value) charstring
+ts_Nudm_UEAU_uri_indivdual_auth_event(template (value) charstring imsi,
+ template (value) charstring auth_event_id)
+:= Nudm_uri_prefix & "/" & valueof(ts_Nudm_UEAU_path_indivdual_auth_event(imsi, auth_event_id));
+
+/* 3GPP TS 29.503 6.3.3.2.4.2 Operation: generate-auth-data (POST) */
+function f_tr_Nudm_UEAU_post_generate_auth_data()
+runs on ConnHdlr return template (present) HTTP2_Msg {
+ var template (present) HTTP2_Msg http2_msg;
+ var template (present) HTTP2_header_block hb;
+ var template (present) HTTP2_pseudo_headers pseudo_headers;
+ var template HTTP2_header_list headers := *;
+
+ pseudo_headers := tr_HTTP2_pseudo_headers_Req(method := "POST",
+ path := tr_Nudm_UEAU_path_generate_auth_data(g_pars.imsi_str));
+ hb := tr_HTTP2_header_block(pseudo_headers, headers);
+ http2_msg := tr_HTTP2_Msg(?, ?, hb := hb,
+ body := tr_HTTP2_Data_frame(data := decmatch tr_AuthenticationInfoRequest1));
+ return http2_msg;
+}
+
+/* 3GPP TS 29.503 6.3.3.2.4.2 Operation: generate-auth-data */
+altstep as_Nudm_UEAU_post_generate_auth_data()
+runs on ConnHdlr {
+ var HTTP2_Msg http2_rx;
+ [] HTTP2_CONN[HTTP2_CONN_SCP].receive(f_tr_Nudm_UEAU_post_generate_auth_data()) -> value http2_rx {
+ var template (value) AuthenticationInfoResult1 auth_info_res;
+ var template (value) Av5GHeAka1 aka;
+ var octetstring body_enc;
+ var template (value) HTTP2_Msg http2_tx;
+
+ aka := ts_Av5GHeAka1(avType := ts_AvType1(FiveG_HE_AKA),
+ rand := "22fd7b017a00a3d10a7fa43bcdb38737",
+ xresStar := "7fd887a888a0711e2bf090b3e83ecc41",
+ autn := "39e2eeb667fe8000df925c009944031b",
+ kausf := "9f4319e9b73df525fd1d4212dabd0642ca73de96d485252fde7e664a8b59f739");
+ auth_info_res := ts_AuthenticationInfoResult1(authType := ts_AuthType1(FiveG_AKA),
+ authenticationVector := ts_AuthenticationVector1_5GHeAka(aka),
+ supi := ts_sbi_Supi(g_pars.imsi_str));
+ body_enc := f_enc_AuthenticationInfoResult1(valueof(auth_info_res));
+
+ http2_tx := ts_HTTP2_Msg_200_OK(http2_rx.conn_id,
+ http2_rx.stream_id,
+ headers := {
+ ts_HTTP2_Hdr_content_type("application/json")
+ },
+ body := ts_HTTP2_Data_frame(http2_rx.stream_id,
+ end_stream_flag := true,
+ data := body_enc));
+ HTTP2_CONN[HTTP2_CONN_SCP].send(http2_tx);
+ setverdict(pass);
+ }
+}
+
+/* 3GPP TS 29.503 6.3.3.3.3.1 Resource: AuthEvents (POST) */
+function f_tr_Nudm_UEAU_post_auth_events()
+runs on ConnHdlr return template (present) HTTP2_Msg {
+ var template (present) HTTP2_Msg http2_msg;
+ var template (present) HTTP2_header_block hb;
+ var template (present) HTTP2_pseudo_headers pseudo_headers;
+ var template HTTP2_header_list headers := *;
+
+ pseudo_headers := tr_HTTP2_pseudo_headers_Req(method := "POST",
+ path := tr_Nudm_UEAU_path_auth_events(g_pars.imsi_str));
+ hb := tr_HTTP2_header_block(pseudo_headers, headers);
+ http2_msg := tr_HTTP2_Msg(?, ?, hb := hb,
+ body := tr_HTTP2_Data_frame(data := decmatch tr_AuthEvent1));
+ return http2_msg;
+}
+
+/* 3GPP TS 29.503 5.4.2.3.2 Authentication Confirmation */
+altstep as_Nudm_UEAU_post_auth_events()
+runs on ConnHdlr {
+ var HTTP2_Msg http2_rx;
+ [] HTTP2_CONN[HTTP2_CONN_SCP].receive(f_tr_Nudm_UEAU_post_auth_events()) -> value http2_rx {
+ var AuthEvent1 auth_event;
+ var octetstring body_enc;
+ var template (value) HTTP2_Msg http2_tx;
+
+ /* 3GPP TS 29.503 Table 6.3.3.3.3.1-3 */
+ f_dec_AuthEvent1(http2_rx.body.data, auth_event); // TODO: check return code
+ body_enc := f_enc_AuthEvent1(valueof(auth_event));
+
+ http2_tx := ts_HTTP2_Msg_201_Created(http2_rx.conn_id,
+ http2_rx.stream_id,
+ headers := {
+ ts_HTTP2_Hdr_content_type("application/json"),
+ ts_HTTP2_Hdr_location(ts_Nudm_UEAU_uri_indivdual_auth_event(g_pars.imsi_str,
+ int2str(g_pars.idx)))
+ },
+ body := ts_HTTP2_Data_frame(http2_rx.stream_id,
+ end_stream_flag := true,
+ data := body_enc));
+ HTTP2_CONN[HTTP2_CONN_SCP].send(http2_tx);
+ setverdict(pass);
+ }
+}
+
+}
diff --git a/ausf/README.md b/ausf/README.md
new file mode 100644
index 0000000..52877c8
--- /dev/null
+++ b/ausf/README.md
@@ -0,0 +1,16 @@
+# AUSF_Tests.ttcn
+
+* external interfaces
+ * N12: SBI (emulates AMF)
+ * N13: SBI (emulates UDM)
+
+{% dot ausf_tests.svg
+digraph G {
+ rankdir=LR;
+ ATS [label="ATS\nAUSF_Tests.ttcn"];
+ UDM [label="AMF\open5gs-ausfd",shape="box"];
+
+ ATS -> UDM [label="N12"];
+ ATS -> UDM [label="N13"];
+}
+%}
diff --git a/ausf/expected-results.xml b/ausf/expected-results.xml
new file mode 100644
index 0000000..7e1d439
--- /dev/null
+++ b/ausf/expected-results.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<testsuite name='Titan' tests='1' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
+ <testcase classname='AUSF_Tests' name='TC_5g_aka' time='MASKED'/>
+</testsuite>
diff --git a/ausf/gen_links.sh b/ausf/gen_links.sh
new file mode 100755
index 0000000..f505654
--- /dev/null
+++ b/ausf/gen_links.sh
@@ -0,0 +1,52 @@
+#!/bin/bash -e
+
+BASEDIR=../deps
+
+. ../_buildsystem/gen_links.inc.sh
+
+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src
+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"
+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src
+FILES="Socket_API_Definitions.ttcn"
+gen_links $DIR $FILES
+
+# Required by MGCP and IPA
+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src
+FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttcn IPL4asp_Types.ttcn IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"
+gen_links $DIR $FILES
+
+# Needed by HTTP_Adapter (Prometheus_Checker.ttcn metrics):
+DIR=$BASEDIR/titan.TestPorts.Common_Components.Abstract_Socket/src
+FILES="Abstract_Socket.cc Abstract_Socket.hh "
+gen_links $DIR $FILES
+
+# Needed by HTTP_Adapter (Prometheus_Checker.ttcn metrics):
+DIR=$BASEDIR/titan.TestPorts.HTTPmsg/src
+FILES="HTTPmsg_MessageLen.ttcn HTTPmsg_MessageLen_Function.cc HTTPmsg_PT.cc HTTPmsg_PT.hh HTTPmsg_PortType.ttcn HTTPmsg_Types.ttcn "
+gen_links $DIR $FILES
+
+# Needed by HTTP2_Adapter:
+DIR=$BASEDIR/titan.ProtocolModules.HTTP2/src
+FILES="HTTP2_EncDec.cc HTTP2_Types.ttcn"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.ProtocolModules.JSON_v07_2006/src
+FILES="JSON_Generic_Null_Def.asn JSON_Generic.ttcn"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/osmo-ttcn3-openapi-generator/openapi-specs/3GPP_5GC_Rel19/ttcn3
+FILES="TS29571_CommonData.ttcn TS29503_Nudm_UEAU.ttcn TS29509_Nausf_UEAuthentication.ttcn "
+gen_links $DIR $FILES
+
+DIR=../library
+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPCP_Types.ttcn IPCP_Templates.ttcn "
+FILES+="SCTP_Templates.ttcn "
+FILES+="HTTP2_CodecPort.ttcn HTTP2_CodecPort_CtrlFunct.ttcn HTTP2_CodecPort_CtrlFunctDef.cc HTTP2_Templates.ttcn HTTP2_Functions.ttcn HTTP2_Msg.ttcn HTTP2_Adapter.ttcn HTTP2_Server_Emulation.ttcn "
+FILES+="HTTP_Adapter.ttcn Prometheus_Checker.ttcn "
+FILES+="TS29571_CommonData_Templates.ttcn TS29503_Nudm_UEAU_Templates.ttcn TS29509_Nausf_UEAuthentication_Templates.ttcn "
+gen_links $DIR $FILES
+
+gen_links_finish
diff --git a/ausf/open5gs-ausf.yaml b/ausf/open5gs-ausf.yaml
new file mode 100644
index 0000000..8296fa2
--- /dev/null
+++ b/ausf/open5gs-ausf.yaml
@@ -0,0 +1,19 @@
+# See https://github.com/open5gs/open5gs/blob/main/configs/open5gs/ausf.yaml.in
+
+logger:
+ level: debug
+
+global:
+ max:
+ ue: 1024
+
+ausf:
+ sbi:
+ server:
+ - address: 127.0.0.11
+ port: 7777
+ client:
+# nrf:
+# - uri: http://127.0.0.10:7777
+ scp:
+ - uri: http://127.0.0.200:7777
diff --git a/ausf/regen_makefile.sh b/ausf/regen_makefile.sh
new file mode 100755
index 0000000..e019abe
--- /dev/null
+++ b/ausf/regen_makefile.sh
@@ -0,0 +1,23 @@
+#!/bin/sh -e
+
+NAME=AUSF_Tests
+
+FILES="
+ *.asn
+ *.ttcn
+ Abstract_Socket.cc
+ HTTPmsg_MessageLen_Function.cc
+ HTTPmsg_PT.cc
+ HTTP2_EncDec.cc
+ HTTP2_CodecPort_CtrlFunctDef.cc
+ IPL4asp_PT.cc
+ IPL4asp_discovery.cc
+ Native_FunctionDefs.cc
+ TCCConversion.cc
+ TCCEncoding.cc
+ TCCInterface.cc
+"
+
+. ../_buildsystem/regen_makefile.inc.sh
+
+sed -i -e 's/^LINUX_LIBS = -lxml2 -lsctp/LINUX_LIBS = -lxml2 -lsctp -lgnutls/' Makefile
diff --git a/ausf/testenv.cfg b/ausf/testenv.cfg
new file mode 100644
index 0000000..4a021cc
--- /dev/null
+++ b/ausf/testenv.cfg
@@ -0,0 +1,10 @@
+[testsuite]
+program=AUSF_Tests
+config=AUSF_Tests.cfg
+
+[ausf]
+program=open5gs-ausfd -c open5gs-ausf.yaml
+make=open5gs
+package=open5gs-ausf
+copy=open5gs-ausf.yaml
+
diff --git a/ausf/testsrcdir.cfg b/ausf/testsrcdir.cfg
new file mode 100644
index 0000000..7f19289
--- /dev/null
+++ b/ausf/testsrcdir.cfg
@@ -0,0 +1,2 @@
+[testsrcdir]
+max_jobs_per_gb_ram=0.3
diff --git a/library/TS29509_Nausf_UEAuthentication_Templates.ttcn b/library/TS29509_Nausf_UEAuthentication_Templates.ttcn
new file mode 100644
index 0000000..1dd052b
--- /dev/null
+++ b/library/TS29509_Nausf_UEAuthentication_Templates.ttcn
@@ -0,0 +1,94 @@
+module TS29509_Nausf_UEAuthentication_Templates {
+
+import from TS29509_Nausf_UEAuthentication all;
+
+const charstring c_Nausf_UEAuthentication_path_api_prefix := "/nausf-auth/v1";
+
+/* 3GPP TS 29.503 6.1.3.2 Resource: ue-authentications (Collection) */
+const charstring c_Nausf_UEAuthentication_path_ue_authentications
+:= c_Nausf_UEAuthentication_path_api_prefix & "/ue-authentications" ;
+
+template (value) charstring
+ts_Nausf_UEAuthentication_path_individual_ue_authentication(template (value) charstring auth_ctx_id)
+:= c_Nausf_UEAuthentication_path_ue_authentications & "/" & valueof(auth_ctx_id);
+
+/* 3GPP TS 29.509 6.1.3.3 Resource: 5g-aka-confirmation */
+template (value) charstring
+ts_Nausf_UEAuthentication_path_5g_aka_confirmation(template (value) charstring auth_ctx_id)
+:= valueof(ts_Nausf_UEAuthentication_path_individual_ue_authentication(auth_ctx_id)) & "/5g-aka-confirmation";
+
+template (value) AuthType
+ts_AuthType(AuthType_enum enum_val) := {
+ enum_val := enum_val
+}
+
+template (value) ResStar
+ts_ResStar(template (value) charstring val) := {
+ val := val
+}
+
+type TS29509_Nausf_UEAuthentication.AuthenticationInfo.cellCagInfo CagIdList;
+template (value) AuthenticationInfo
+ts_AuthenticationInfo(template (value) SupiOrSuci supiOrSuci,
+ template (value) ServingNetworkName servingNetworkName,
+ template (omit) ResynchronizationInfo resynchronizationInfo := omit,
+ template (omit) Pei pei := omit,
+ template (omit) TraceData traceData := omit,
+ template (omit) NfGroupId udmGroupId := omit,
+ template (omit) charstring routingIndicator := omit,
+ template (omit) CagIdList cellCagInfo := omit,
+ template (omit) boolean n5gcInd := omit,
+ template (omit) SupportedFeatures supportedFeatures := omit,
+ template (omit) boolean nswoInd := omit,
+ template (omit) boolean disasterRoamingInd := omit,
+ template (omit) boolean onboardingInd := omit,
+ template (omit) boolean aun3Ind := omit) := {
+ supiOrSuci := supiOrSuci,
+ servingNetworkName := servingNetworkName,
+ resynchronizationInfo := resynchronizationInfo,
+ pei := pei,
+ traceData := traceData,
+ udmGroupId := udmGroupId,
+ routingIndicator := routingIndicator,
+ cellCagInfo := cellCagInfo,
+ n5gcInd := n5gcInd,
+ supportedFeatures := supportedFeatures,
+ nswoInd := nswoInd,
+ disasterRoamingInd := disasterRoamingInd,
+ onboardingInd := onboardingInd,
+ aun3Ind := aun3Ind
+}
+
+type TS29509_Nausf_UEAuthentication.UEAuthenticationCtx.fivegAuthData FivegAuthDataUnion;
+type TS29509_Nausf_UEAuthentication.UEAuthenticationCtx.links LinksMap;
+template (present) UEAuthenticationCtx
+tr_UEAuthenticationCtx(template (present) AuthType authType := ?,
+ template (present) FivegAuthDataUnion fivegAuthData := ?,
+ template (present) LinksMap links := ?,
+ template ServingNetworkName servingNetworkName := *) := {
+ authType := authType,
+ fivegAuthData := fivegAuthData,
+ links := links,
+ servingNetworkName := servingNetworkName
+}
+
+template (value) ConfirmationData
+ts_ConfirmationData(template (value) ResStar resStar,
+ template (omit) SupportedFeatures supportedFeatures := omit) := {
+ resStar := resStar,
+ supportedFeatures := supportedFeatures
+}
+
+type TS29509_Nausf_UEAuthentication.ConfirmationDataResponse.pvsInfo ServerAddressingInfoList;
+template (present) ConfirmationDataResponse
+tr_ConfirmationDataResponse(template (present) AuthResult authResult := ?,
+ template Supi supi := *,
+ template Kseaf kseaf := *,
+ template ServerAddressingInfoList pvsInfo := *) := {
+ authResult := authResult,
+ supi := supi,
+ kseaf := kseaf,
+ pvsInfo := pvsInfo
+}
+
+}

To view, visit change 43960. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ife5af76587b4416767535875e27b02236ee5e1d9
Gerrit-Change-Number: 43960
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>