From f83c06cec28092cb1e00d9cb57ede46d088c282e Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 11 Jul 2025 09:23:41 +0200 Subject: [PATCH 001/151] Bug fixed in Abstract_Socket patch: missing set_ip_proto/get_ip_proto --- .../Abstract_Socket.cc.patch | 669 +++--------------- .../Abstract_Socket.hh.patch | 140 +--- 2 files changed, 138 insertions(+), 671 deletions(-) diff --git a/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch b/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch index 6389855..55f334a 100644 --- a/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch +++ b/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch @@ -1,580 +1,117 @@ -diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc -old mode 100644 -new mode 100755 -index 910c13e..9d93bed ---- a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc -+++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.cc -@@ -1,28 +1,17 @@ - /****************************************************************************** --* Copyright (c) 2000-2019 Ericsson Telecom AB --* All rights reserved. This program and the accompanying materials --* are made available under the terms of the Eclipse Public License v2.0 --* which accompanies this distribution, and is available at --* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html --* --* Contributors: --* Zoltan Bibo - initial implementation and initial documentation --* Gergely Futo --* Oliver Ferenc Czerman --* Balasko Jeno --* Zoltan Bibo --* Eduard Czimbalmos --* Kulcsár Endre --* Gabor Szalai --* Jozsef Gyurusi --* Csöndes Tibor --* Zoltan Jasz --******************************************************************************/ -+ * Copyright (c) 2000-2025 Ericsson Telecom AB -+ * All rights reserved. This program and the accompanying materials -+ * are made available under the terms of the Eclipse Public License v2.0 -+ * which accompanies this distribution, and is available at -+ * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html -+ ******************************************************************************/ - // - // File: Abstract_Socket.cc - // Description: Abstract_Socket implementation file --// Rev: R9B -+// Rev: - // Prodnr: CNL 113 384 -+// Updated: 2012-08-07 -+// Contact: http://ttcn.ericsson.se - // - - #include "Abstract_Socket.hh" -@@ -254,20 +243,16 @@ bool Abstract_Socket::parameter_set(const char *parameter_name, - Free(local_host_name); - local_host_name = mcopystr(parameter_value); - } else if(strcmp(parameter_name, remote_port_name()) == 0){ -- int a; -- if (sscanf(parameter_value, "%d", &a)!=1) log_error("Invalid input as port number given: %s", parameter_value); -- if (a>65535 || a<0){ log_error("Port number must be between 0 and 65535, %d is given", remote_port_number);} -- else {remote_port_number=a;} -+ if (sscanf(parameter_value, "%d", &remote_port_number)!=1) log_error("Invalid input as port number given: %s", parameter_value); -+ if (remote_port_number>65535 || remote_port_number<0) log_error("Port number must be between 0 and 65535, %d is given", remote_port_number); - } else if(strcmp(parameter_name, ai_family_name()) == 0){ - if (strcasecmp(parameter_value,"IPv6")==0 || strcasecmp(parameter_value,"AF_INET6")==0) ai_family = AF_INET6; - else if (strcasecmp(parameter_value,"IPv4")==0 || strcasecmp(parameter_value,"AF_INET")==0) ai_family = AF_INET; - else if (strcasecmp(parameter_value,"UNSPEC")==0 || strcasecmp(parameter_value,"AF_UNSPEC")==0) ai_family = AF_UNSPEC; - else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ai_family_name()); - } else if(strcmp(parameter_name, local_port_name()) == 0){ -- int a; -- if (sscanf(parameter_value, "%d", &a)!=1) log_error("Invalid input as port number given: %s", parameter_value); -- if (a>65535 || a<0) {log_error("Port number must be between 0 and 65535, %d is given", local_port_number);} -- else {local_port_number=a;} -+ if (sscanf(parameter_value, "%d", &local_port_number)!=1) log_error("Invalid input as port number given: %s", parameter_value); -+ if (local_port_number>65535 || local_port_number<0) log_error("Port number must be between 0 and 65535, %d is given", local_port_number); - } else if (strcmp(parameter_name, nagling_name()) == 0) { - if (strcasecmp(parameter_value,"yes")==0) nagling = true; - else if (strcasecmp(parameter_value,"no")==0) nagling = false; -@@ -316,14 +301,16 @@ void Abstract_Socket::Handle_Socket_Event(int fd, boolean is_readable, boolean i - } else { - if(shutdown(fd, SHUT_RD) != 0) { - if(errno == ENOTCONN) { -+ remove_client(fd); -+ peer_disconnected(fd); - errno = 0; -- } else { -+ } else - log_error("shutdown(SHUT_RD) system call failed"); -- } -+ } else { -+ client_data->tcp_state = CLOSE_WAIT; -+ Remove_Fd_Read_Handler(fd); -+ peer_half_closed(fd); - } -- client_data->tcp_state = CLOSE_WAIT; -- Remove_Fd_Read_Handler(fd); -- peer_half_closed(fd); - } - } // switch (client_data->reading_state) - } else if (messageLength > 0) { -@@ -425,7 +412,6 @@ int Abstract_Socket::receive_message_on_fd(int client_id) - size_t end_len=AS_TCP_CHUNCK_SIZE; - recv_tb->get_end(end_ptr, end_len); - int messageLength = recv(client_id, (char *)end_ptr, end_len, 0); -- log_debug("========> receive_message_on_fd errno: '%d', '%s'", errno, strerror(errno)); - if (messageLength==0) return messageLength; // peer disconnected - else if (messageLength < 0) { - log_warning("Error when reading the received TCP PDU: %s", strerror(errno)); -@@ -464,11 +450,12 @@ int Abstract_Socket::send_message_on_nonblocking_fd(int client_id, - - log_debug("entering Abstract_Socket::" - "send_message_on_nonblocking_fd(id: %d)", client_id); -- as_client_struct * client_data = get_peer(client_id); -+ as_client_struct * client_data; - int sent_len = 0; - while(sent_len < length){ - int ret; - log_debug("Abstract_Socket::send_message_on_nonblocking_fd(id: %d): new iteration", client_id); -+ client_data = get_peer(client_id); - if (client_data->reading_state == STATE_DONT_CLOSE){ - goto client_closed_connection; - } else ret = send(client_id, send_par + sent_len, length - sent_len, 0); -@@ -549,7 +536,7 @@ const PacketHeaderDescr* Abstract_Socket::Get_Header_Descriptor() const - return NULL; - } - --void Abstract_Socket::peer_connected(int /*client_id*/, sockaddr_in& /*remote_addr*/) -+void Abstract_Socket::peer_connected(int client_id, sockaddr_in& remote_addr) - { - } - -@@ -614,8 +601,8 @@ void Abstract_Socket::map_user() - - char remotePort[6]; - char localPort[6]; -- sprintf(localPort, "%u", local_port_number); -- sprintf(remotePort, "%u", remote_port_number); -+ sprintf(localPort, "%d", local_port_number); -+ sprintf(remotePort, "%d", remote_port_number); - - if(!use_connection_ASPs) - { -@@ -797,7 +784,6 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - log_warning("Cannot open socket when trying to open the listen port: %s", strerror(errno)); - listen_port_opened(-1); - errno = 0; -- freeaddrinfo(aip); - return -1; - } - else log_error("Cannot open socket"); -@@ -815,7 +801,6 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - log_warning("Setsockopt failed when trying to open the listen port: %s", strerror(errno)); - listen_port_opened(-1); - errno = 0; -- freeaddrinfo(aip); - return -1; - } - else log_error("Setsockopt failed"); -@@ -828,10 +813,10 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - - log_debug("Bind to port..."); - if (bind(listen_fd, res->ai_addr, res->ai_addrlen) == -1) { -- error = errno; // save it for the warning message - close(listen_fd); - listen_fd = -1; - log_debug("Cannot bind to port when trying to open the listen port: %s", strerror(errno)); -+ error = errno; // save it for the warning message - errno = 0; - continue; - } -@@ -843,8 +828,8 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - { - log_warning("Cannot bind to port when trying to open the listen port: %s", strerror(error)); - listen_port_opened(-1); -+ error = errno; // save it for the warning message - error = 0; -- freeaddrinfo(aip); - return -1; - } - else log_error("Cannot bind to port"); -@@ -858,7 +843,6 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - log_warning("Cannot listen at port when trying to open the listen port: %s", strerror(errno)); - listen_port_opened(-1); - errno = 0; -- freeaddrinfo(aip); - return -1; - } - else log_error("Cannot listen at port"); -@@ -877,14 +861,13 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - log_warning("getsockname() system call failed on the server socket when trying to open the listen port: %s", strerror(errno)); - listen_port_opened(-1); - errno = 0; -- freeaddrinfo(aip); - return -1; - } - else log_error("getsockname() system call failed on the server socket"); - } - char hname[NI_MAXHOST]; - char sname[NI_MAXSERV]; --/* error = getnameinfo(res->ai_addr, res->ai_addrlen, -+ error = getnameinfo(res->ai_addr, res->ai_addrlen, - hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICSERV); - if (error) { - close(listen_fd); -@@ -893,14 +876,13 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - { - log_warning("getnameinfo() system call failed on the server socket when trying to open the listen port: %s", gai_strerror(error)); - listen_port_opened(-1); -- freeaddrinfo(aip); - return -1; - } - else log_error("getsockname() system call failed on the server socket"); - } else { - log_debug("Listening on (name): %s/%s\n", - hname, sname); -- }*/ -+ } - error = getnameinfo(res->ai_addr, res->ai_addrlen, - hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICHOST|NI_NUMERICSERV); - if (error) { -@@ -910,7 +892,6 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - { - log_warning("getnameinfo() system call failed on the server socket when trying to open the listen port: %s", gai_strerror(error)); - listen_port_opened(-1); -- freeaddrinfo(aip); - return -1; - } - else log_error("getsockname() system call failed on the server socket"); -@@ -932,12 +913,11 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc - if(use_connection_ASPs) - listen_port_opened(listenPort); - -- freeaddrinfo(aip); - return listenPort; +diff --git a/src/Abstract_Socket.cc b/src/Abstract_Socket.cc +index 8b7b753..5e4addf 100644 +--- a/src/Abstract_Socket.cc ++++ b/src/Abstract_Socket.cc +@@ -40,6 +40,7 @@ + # include #endif - } - --void Abstract_Socket::listen_port_opened(int /*port_number*/) -+void Abstract_Socket::listen_port_opened(int port_number) - { - // Intentionally blank - } -@@ -1084,9 +1064,7 @@ int Abstract_Socket::open_client_connection(const struct sockaddr_in & new_remot - Add_Fd_Read_Handler(socket_fd); // Done here - as in case of error: remove_client expects the handler as added - log_debug("Abstract_Socket::open_client_connection(). Handler set to socket fd %d", socket_fd); - client_data->fd_buff = new TTCN_Buffer; --// client_data->clientAddr = *(struct sockaddr_storage*)&new_remote_addr; -- memset(&client_data->clientAddr,0,sizeof(client_data->clientAddr)); -- memcpy(&client_data->clientAddr,&new_remote_addr,sizeof(new_remote_addr)); -+ client_data->clientAddr = *(struct sockaddr_storage*)&new_remote_addr; - client_data->clientAddrlen = sizeof(new_remote_addr); - client_data->tcp_state = ESTABLISHED; - client_data->reading_state = STATE_NORMAL; -@@ -1259,22 +1237,22 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch - ); - - if(bind(socket_fd, aip2->ai_addr, aip2->ai_addrlen)<0) { --/* if(use_connection_ASPs) // the if else branches are the same -- {*/ -+ if(use_connection_ASPs) -+ { - log_debug("Cannot bind to port when trying to open client connection: %s", strerror(errno)); - //client_connection_opened(-1); - //freeaddrinfo(localAddrinfo); - errno = 0; - continue; //aip2 cycle - //return -1; --/* } -+ } - else { - //freeaddrinfo(localAddrinfo); - //log_error("Cannot bind to port."); - log_debug("Cannot bind to port when trying to open client connection: %s", strerror(errno)); - errno = 0; - continue; //aip2 cycle -- }*/ -+ } - } - log_debug("Bind successful on client."); - freeaddrinfo(localAddrinfo); -@@ -1358,7 +1336,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch - } - char hname[NI_MAXHOST]; - char sname[NI_MAXSERV]; --/* error = getnameinfo(aip->ai_addr, aip->ai_addrlen, -+ error = getnameinfo(aip->ai_addr, aip->ai_addrlen, - hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICSERV); - if (error) { - close(socket_fd); -@@ -1373,19 +1351,18 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch - log_debug("Connection established (name): %s/%s -> %s/%s\n", - hname, sname, - remoteHostname, remoteServicename); -- }*/ -+ } - error = getnameinfo(aip->ai_addr, aip->ai_addrlen, - hname, sizeof (hname), sname, sizeof (sname), NI_NUMERICHOST|NI_NUMERICSERV); - if (error) { --/* close(socket_fd); -+ close(socket_fd); - if(use_connection_ASPs) - { - log_warning("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); --// client_connection_opened(-1); --// return -1; -+ client_connection_opened(-1); -+ return -1; - } -- else*/ -- log_warning("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); -+ else log_error("getnameinfo() system call failed on the client socket when trying to connect to server: %s", gai_strerror(error)); - } else { - log_debug("Connection established (addr): %s/%s -> %s/%s\n", - hname, sname, -@@ -1421,20 +1398,18 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch - return -1; - } - else log_error("Set blocking mode failed."); -- } -+ } - as_client_struct * client_data=peer_list_add_peer(socket_fd); - Add_Fd_Read_Handler(socket_fd); // Done here - as in case of error: remove_client expects the handler as added - log_debug("Abstract_Socket::open_client_connection(). Handler set to socket fd %d", socket_fd); - client_data->fd_buff = new TTCN_Buffer; --// client_data->clientAddr = *(struct sockaddr_storage*)aip->ai_addr; -- memset(&client_data->clientAddr,0,sizeof(client_data->clientAddr)); -- memcpy(&client_data->clientAddr,aip->ai_addr,sizeof(*aip->ai_addr)); -+ client_data->clientAddr = *(struct sockaddr_storage*)aip->ai_addr; - client_data->clientAddrlen = aip->ai_addrlen; - client_data->tcp_state = ESTABLISHED; - client_data->reading_state = STATE_NORMAL; ++#include -- freeaddrinfo(res); -+ freeaddrinfo(res); - - if (!add_user_data(socket_fd)) { - remove_client(socket_fd); -@@ -1449,7 +1424,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch - } - - --void Abstract_Socket::client_connection_opened(int /*client_id*/) -+void Abstract_Socket::client_connection_opened(int client_id) - { - // Intentionally blank - } -@@ -1463,7 +1438,7 @@ void Abstract_Socket::unmap_user() - log_debug("leaving Abstract_Socket::unmap_user()"); - } - --void Abstract_Socket::peer_disconnected(int /*fd*/) -+void Abstract_Socket::peer_disconnected(int fd) - { - // virtual peer_disconnected() needs to be overriden in test ports! - if(!use_connection_ASPs) { -@@ -1547,19 +1522,11 @@ void Abstract_Socket::send_outgoing(const unsigned char* send_par, int length, i - nrOfBytesSent = use_non_blocking_socket ? send_message_on_nonblocking_fd(dest_fd, send_par, length) : - send_message_on_fd(dest_fd, send_par, length); - -- if (nrOfBytesSent == -1){ -- log_debug("Client %d closed connection. Error: %d %s", client_id, errno, strerror(errno)); -- report_unsent(dest_fd,length,nrOfBytesSent,send_par,"Client closed the connection"); -- -- if(client_data->tcp_state == CLOSE_WAIT){ -- log_debug("Client %d waiting for close ASP.", client_id); -- } else { -- errno = 0; -- log_debug("Client %d closed connection", client_id); -- client_data->tcp_state = CLOSE_WAIT; -- Remove_Fd_Read_Handler(dest_fd); -- peer_half_closed(dest_fd); -- } -+ if (nrOfBytesSent == -1 && errno == EPIPE){ // means connection was interrupted by peer -+ errno = 0; -+ log_debug("Client %d closed connection", client_id); -+ remove_client(dest_fd); -+ peer_disconnected(dest_fd); - }else if (nrOfBytesSent != length) { - char *error_text=mprintf("Send system call failed: %d bytes were sent instead of %d", nrOfBytesSent, length); - report_error(client_id,length,nrOfBytesSent,send_par,error_text); -@@ -1570,16 +1537,11 @@ void Abstract_Socket::send_outgoing(const unsigned char* send_par, int length, i - log_debug("leaving Abstract_Socket::send_outgoing()"); - } - --void Abstract_Socket::report_error(int /*client_id*/, int /*msg_length*/, int /*sent_length*/, const unsigned char* /*msg*/, const char* error_text) -+void Abstract_Socket::report_error(int client_id, int msg_length, int sent_length, const unsigned char* msg, const char* error_text) - { - log_error("%s",error_text); - } - --void Abstract_Socket::report_unsent(int /*client_id*/, int /*msg_length*/, int /*sent_length*/, const unsigned char* /*msg*/, const char* error_text) --{ -- log_debug("%s",error_text); --} -- - void Abstract_Socket::all_mandatory_configparameters_present() - { - if(!use_connection_ASPs) -@@ -1813,6 +1775,7 @@ void Abstract_Socket::peer_list_resize_list(int client_id) { - new_length++; // index starts from 0 - log_debug("Abstract_Socket::peer_list_resize_list: Resizing to %d", new_length); - peer_list_root = (as_client_struct **)Realloc(peer_list_root, new_length*sizeof(as_client_struct *)); -+ log_debug("Abstract_Socket::peer_list_resize_list: After Resizing: %p", peer_list_root); - - // initialize new entries - for (int i = peer_list_length; i < new_length; i++) -@@ -1974,13 +1937,6 @@ SSL_Socket::SSL_Socket() - ssl_password=NULL; + #define AS_TCP_CHUNCK_SIZE 4096 + #define AS_SSL_CHUNCK_SIZE 16384 +@@ -171,6 +172,7 @@ Abstract_Socket::Abstract_Socket() { + remote_host_name = NULL; + remote_port_number = 0; + ai_family = AF_UNSPEC; // default: Auto ++ ip_proto = IPPROTO_TCP; // default test_port_type=NULL; test_port_name=NULL; -- ssl_ctx = NULL; -- ssl_current_ssl = NULL; -- SSLv2=true; -- SSLv3=true; -- TLSv1=true; -- TLSv1_1=true; -- TLSv1_2=true; - } - - SSL_Socket::SSL_Socket(const char *tp_type, const char *tp_name) -@@ -1997,13 +1953,6 @@ SSL_Socket::SSL_Socket(const char *tp_type, const char *tp_name) - ssl_password=NULL; + ttcn_buffer_usercontrol=false; +@@ -199,6 +201,7 @@ Abstract_Socket::Abstract_Socket(const char *tp_type, const char *tp_name) { + remote_host_name = NULL; + remote_port_number = 0; + ai_family = AF_UNSPEC; // default: Auto ++ ip_proto = IPPROTO_TCP; // default test_port_type=tp_type; test_port_name=tp_name; -- ssl_ctx = NULL; -- ssl_current_ssl = NULL; -- SSLv2=true; -- SSLv3=true; -- TLSv1=true; -- TLSv1_1=true; -- TLSv1_2=true; - } - - SSL_Socket::~SSL_Socket() -@@ -2056,26 +2005,6 @@ bool SSL_Socket::parameter_set(const char *parameter_name, - if(strcasecmp(parameter_value, "yes") == 0) ssl_verify_certificate = true; - else if(strcasecmp(parameter_value, "no") == 0) ssl_verify_certificate = false; - else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_verifycertificate_name()); -- } else if(strcasecmp(parameter_name, ssl_disable_SSLv2()) == 0) { -- if(strcasecmp(parameter_value, "yes") == 0) SSLv2= false; -- else if(strcasecmp(parameter_value, "no") == 0) SSLv2 = true; -- else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_SSLv2()); -- } else if(strcasecmp(parameter_name, ssl_disable_SSLv3()) == 0) { -- if(strcasecmp(parameter_value, "yes") == 0) SSLv2 = false; -- else if(strcasecmp(parameter_value, "no") == 0) SSLv2 = true; -- else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_SSLv3()); -- } else if(strcasecmp(parameter_name, ssl_disable_TLSv1()) == 0) { -- if(strcasecmp(parameter_value, "yes") == 0) TLSv1= false; -- else if(strcasecmp(parameter_value, "no") == 0) TLSv1 = true; -- else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_TLSv1()); -- } else if(strcasecmp(parameter_name, ssl_disable_TLSv1_1()) == 0) { -- if(strcasecmp(parameter_value, "yes") == 0) TLSv1_1 = false; -- else if(strcasecmp(parameter_value, "no") == 0) TLSv1_1 = true; -- else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_TLSv1_1()); -- } else if(strcasecmp(parameter_name, ssl_disable_TLSv1_2()) == 0) { -- if(strcasecmp(parameter_value, "yes") == 0) TLSv1_2 = false; -- else if(strcasecmp(parameter_value, "no") == 0) TLSv1_2 = true; -- else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ssl_disable_TLSv1_2()); - } else { - log_debug("leaving SSL_Socket::parameter_set(%s, %s)", parameter_name, parameter_value); - return Abstract_Socket::parameter_set(parameter_name, parameter_value); -@@ -2102,32 +2031,6 @@ bool SSL_Socket::add_user_data(int client_id) { + ttcn_buffer_usercontrol=false; +@@ -261,6 +264,10 @@ bool Abstract_Socket::parameter_set(const char *parameter_name, + else if (strcasecmp(parameter_value,"IPv4")==0 || strcasecmp(parameter_value,"AF_INET")==0) ai_family = AF_INET; + else if (strcasecmp(parameter_value,"UNSPEC")==0 || strcasecmp(parameter_value,"AF_UNSPEC")==0) ai_family = AF_UNSPEC; + else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ai_family_name()); ++ } else if(strcmp(parameter_name, ip_proto_name()) == 0){ ++ if (strcasecmp(parameter_value,"IPPROTO_TCP")==0) ip_proto = IPPROTO_TCP; ++ else if (strcasecmp(parameter_value,"IPPROTO_SCTP")==0) ip_proto = IPPROTO_SCTP; ++ else log_error("Parameter value '%s' not recognized for parameter '%s'", parameter_value, ip_proto_name()); + } else if(strcmp(parameter_name, local_port_name()) == 0){ + int a; + if (sscanf(parameter_value, "%d", &a)!=1) log_error("Invalid input as port number given: %s", parameter_value); +@@ -760,6 +767,7 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc + hints.ai_flags = /*AI_ALL|*/AI_ADDRCONFIG|AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = ai_family; ++ hints.ai_protocol = ip_proto; + + error = getaddrinfo(localHostname, localServicename, &hints, &aip); + if (error != 0) { +@@ -1143,6 +1151,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch + } + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = ai_family; ++ hints.ai_protocol = ip_proto; - if (ssl_current_ssl==NULL) - log_error("Creation of SSL object failed"); --#ifdef SSL_OP_NO_SSLv2 -- if(!SSLv2){ -- SSL_set_options(ssl_current_ssl,SSL_OP_NO_SSLv2); -- } --#endif --#ifdef SSL_OP_NO_SSLv3 -- if(!SSLv3){ -- SSL_set_options(ssl_current_ssl,SSL_OP_NO_SSLv3); -- } --#endif --#ifdef SSL_OP_NO_TLSv1 -- if(!TLSv1){ -- SSL_set_options(ssl_current_ssl,SSL_OP_NO_TLSv1); -- } --#endif --#ifdef SSL_OP_NO_TLSv1_1 -- if(!TLSv1_1){ -- SSL_set_options(ssl_current_ssl,SSL_OP_NO_TLSv1_1); -- } --#endif --#ifdef SSL_OP_NO_TLSv1_2 -- if(!TLSv1_2){ -- SSL_set_options(ssl_current_ssl,SSL_OP_NO_TLSv1_2); -- } --#endif -- - set_user_data(client_id, ssl_current_ssl); - log_debug("New client added with key '%d'", client_id); - log_debug("Binding SSL to the socket"); -@@ -2362,10 +2265,9 @@ int SSL_Socket::send_message_on_fd(int client_id, const unsigned char* send_par, - log_debug("SSL_ERROR_ZERO_RETURN is received, setting SSL SHUTDOWN mode to QUIET"); - ssl_current_client=NULL; - log_debug("leaving SSL_Socket::send_message_on_fd()"); -- return -1; -+ return 0; - default: -- log_debug("SSL error occured"); -- return -1; -+ log_error("SSL error occured"); + error = getaddrinfo(remoteHostname, remoteServicename, &hints, &res); + if (error != 0) { +@@ -1191,9 +1200,11 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch + } } - } - // avoid compiler warnings -@@ -2457,8 +2359,7 @@ int SSL_Socket::send_message_on_nonblocking_fd(int client_id, const unsigned cha - case SSL_ERROR_ZERO_RETURN: - goto client_closed_connection; - default: -- log_warning("SSL error occured"); -- return -1; -+ log_error("SSL error occured"); + +- log_debug("Using address family for socket %d: %s",socket_fd, ++ log_debug("Using address family for socket %d: %s - %s",socket_fd, + ((aip->ai_family==AF_INET)?"IPv4": +- ((aip->ai_family==AF_INET6)?"IPv6":"unknown")) ++ ((aip->ai_family==AF_INET6)?"IPv6":"unknown")), ++ ((aip->ai_protocol==IPPROTO_TCP)?"IPPROTO_TCP": ++ ((aip->ai_protocol==IPPROTO_SCTP)?"IPPROTO_SCTP":"unknown")) + ); + + +@@ -1225,6 +1236,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch + hints.ai_flags = AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = ai_family;//aip->ai_family; // NOTE: On solaris 10 if is set to aip->ai_family, getaddrinfo will crash for IPv4-mapped addresses! ++ hints.ai_protocol = ip_proto; + + error = getaddrinfo(localHostname, localServicename, &hints, &localAddrinfo); + if (error != 0) { +@@ -1390,10 +1402,13 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch } - } - -@@ -2547,11 +2448,6 @@ const char* SSL_Socket::ssl_certificate_file_name() { return "ssl_certific - const char* SSL_Socket::ssl_password_name() { return "ssl_private_key_password";} - const char* SSL_Socket::ssl_cipher_list_name() { return "ssl_allowed_ciphers_list";} - const char* SSL_Socket::ssl_verifycertificate_name() { return "ssl_verify_certificate";} --const char* SSL_Socket::ssl_disable_SSLv2() { return "ssl_disable_SSLv2";} --const char* SSL_Socket::ssl_disable_SSLv3() { return "ssl_disable_SSLv3";} --const char* SSL_Socket::ssl_disable_TLSv1() { return "ssl_disable_TLSv1";} --const char* SSL_Socket::ssl_disable_TLSv1_1() { return "ssl_disable_TLSv1_1";} --const char* SSL_Socket::ssl_disable_TLSv1_2() { return "ssl_disable_TLSv1_2";} - - void SSL_Socket::ssl_actions_to_seed_PRNG() { -@@ -2654,10 +2550,10 @@ void SSL_Socket::ssl_init_SSL() - - // check the other side's certificates - if (ssl_verify_certificate) { -- log_debug("Setting verification behaviour: verification required and do not allow to continue on failure.."); -+ log_debug("Setting verification behaviour: verification required and do not allow to continue on failure"); - SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, ssl_verify_callback); - } else { -- log_debug("Setting verification behaviour: verification not required and do allow to continue on failure.."); -+ log_debug("Setting verification behaviour: verification not required and do allow to continue on failure"); - SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_NONE, ssl_verify_callback); + log_debug( +- "connected to: host %s service %s via address family %s\n", ++ "connected to: host %s service %s via address family %s with ip_proto %s\n", + remoteHostname, remoteServicename, + ((aip->ai_family==AF_INET)?"IPv4": +- ((aip->ai_family==AF_INET6)?"IPv6":"unknown"))); ++ ((aip->ai_family==AF_INET6)?"IPv6":"unknown")), ++ ((aip->ai_protocol==IPPROTO_TCP)?"IPPROTO_TCP": ++ ((aip->ai_protocol==IPPROTO_SCTP)?"IPPROTO_SCTP":"unknown")) ++ ); + break; } + if (aip==NULL) { +@@ -1774,18 +1789,19 @@ const char* Abstract_Socket::remote_address_name() { return "destIPAddr + const char* Abstract_Socket::local_address_name() { return "serverIPAddr";} + const char* Abstract_Socket::remote_port_name() { return "destPort";} + const char* Abstract_Socket::ai_family_name() { return "ai_family";} ++const char* Abstract_Socket::ip_proto_name() { return "ip_proto";} + const char* Abstract_Socket::use_connection_ASPs_name() { return "use_connection_ASPs";} + const char* Abstract_Socket::halt_on_connection_reset_name(){ return "halt_on_connection_reset";} +-const char* Abstract_Socket::client_TCP_reconnect_name() { return "client_TCP_reconnect";} ++const char* Abstract_Socket::client_TCP_reconnect_name() { return "client_TCP_reconnect";} + const char* Abstract_Socket::TCP_reconnect_attempts_name() { return "TCP_reconnect_attempts";} +-const char* Abstract_Socket::TCP_reconnect_delay_name() { return "TCP_reconnect_delay";} ++const char* Abstract_Socket::TCP_reconnect_delay_name() { return "TCP_reconnect_delay";} + const char* Abstract_Socket::server_mode_name() { return "server_mode";} + const char* Abstract_Socket::socket_debugging_name() { return "socket_debugging";} + const char* Abstract_Socket::nagling_name() { return "nagling";} + const char* Abstract_Socket::use_non_blocking_socket_name() { return "use_non_blocking_socket";} + const char* Abstract_Socket::server_backlog_name() { return "server_backlog";} +-bool Abstract_Socket::add_user_data(int) {return true;} +-bool Abstract_Socket::remove_user_data(int) {return true;} ++bool Abstract_Socket::add_user_data(int) {return true;} ++bool Abstract_Socket::remove_user_data(int) {return true;} + bool Abstract_Socket::user_all_mandatory_configparameters_present() { return true; } -@@ -2757,7 +2653,7 @@ int SSL_Socket::ssl_getresult(int res) - return err; - } - --int SSL_Socket::ssl_verify_certificates_at_handshake(int /*preverify_ok*/, X509_STORE_CTX */*ssl_ctx*/) { -+int SSL_Socket::ssl_verify_certificates_at_handshake(int preverify_ok, X509_STORE_CTX *ssl_ctx) { - // don't care by default - return -1; - } -@@ -2765,7 +2661,7 @@ int SSL_Socket::ssl_verify_certificates_at_handshake(int /*preverify_ok*/, X50 - // Callback function used by OpenSSL. - // Called when a password is needed to decrypt the private key file. - // NOTE: not thread safe --int SSL_Socket::ssl_password_cb(char *buf, int num, int /*rwflag*/,void */*userdata*/) { -+int SSL_Socket::ssl_password_cb(char *buf, int num, int rwflag,void *userdata) { - - if (ssl_current_client!=NULL) { - char *ssl_client_password; -@@ -2795,23 +2691,18 @@ int SSL_Socket::ssl_verify_callback(int preverify_ok, X509_STORE_CTX *ssl_ctx) - ctx_pointer = SSL_get_SSL_CTX(ssl_pointer); - if (ssl_current_client!=NULL) { -- // if ssl_verifiycertificate == "no", then always accept connections -- if(((SSL_Socket *)ssl_current_client)->ssl_verify_certificate) { -- user_result=((SSL_Socket *)ssl_current_client)->ssl_verify_certificates_at_handshake(preverify_ok, ssl_ctx); -- if (user_result>=0) return user_result; -- } else { -- return 1; -- } -+ user_result=((SSL_Socket *)ssl_current_client)->ssl_verify_certificates_at_handshake(preverify_ok, ssl_ctx); -+ if (user_result>=0) return user_result; - } else { // go on with default authentication - fprintf(stderr, "Warning: no current SSL object found but ssl_verify_callback is called, programming error\n"); - } - - // if ssl_verifiycertificate == "no", then always accept connections -- if (SSL_CTX_get_verify_mode(ctx_pointer) == SSL_VERIFY_NONE) -+ if (SSL_CTX_get_verify_mode(ctx_pointer) && SSL_VERIFY_NONE) - return 1; - // if ssl_verifiycertificate == "yes", then accept connections only if the - // certificate is valid -- else if (SSL_CTX_get_verify_mode(ctx_pointer) & SSL_VERIFY_PEER) { -+ else if (SSL_CTX_get_verify_mode(ctx_pointer) && SSL_VERIFY_PEER) { - return preverify_ok; - } - // something went wrong diff --git a/ttcn/patch_abstract_socket/Abstract_Socket.hh.patch b/ttcn/patch_abstract_socket/Abstract_Socket.hh.patch index 2b4445e..bce5667 100644 --- a/ttcn/patch_abstract_socket/Abstract_Socket.hh.patch +++ b/ttcn/patch_abstract_socket/Abstract_Socket.hh.patch @@ -1,108 +1,38 @@ -diff --git a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh -old mode 100644 -new mode 100755 -index 7de8446..ad2d65d ---- a/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh -+++ b/ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src/Abstract_Socket.hh -@@ -1,28 +1,17 @@ - /****************************************************************************** --* Copyright (c) 2000-2019 Ericsson Telecom AB --* All rights reserved. This program and the accompanying materials --* are made available under the terms of the Eclipse Public License v2.0 --* which accompanies this distribution, and is available at --* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html --* --* Contributors: --* Zoltan Bibo - initial implementation and initial documentation --* Gergely Futo --* Oliver Ferenc Czerman --* Balasko Jeno --* Zoltan Bibo --* Eduard Czimbalmos --* Kulcsár Endre --* Gabor Szalai --* Jozsef Gyurusi --* Csöndes Tibor --* Zoltan Jasz --******************************************************************************/ -+ * Copyright (c) 2000-2025 Ericsson Telecom AB -+ * All rights reserved. This program and the accompanying materials -+ * are made available under the terms of the Eclipse Public License v2.0 -+ * which accompanies this distribution, and is available at -+ * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html -+ ******************************************************************************/ - // - // File: Abstract_Socket.hh - // Description: Abstract_Socket header file --// Rev: R9B -+// Rev: - // Prodnr: CNL 113 384 -+// Updated: 2010-11-24 -+// Contact: http://ttcn.ericsson.se - // +diff --git a/src/Abstract_Socket.hh b/src/Abstract_Socket.hh +index 6d7bc3d..a068662 100644 +--- a/src/Abstract_Socket.hh ++++ b/src/Abstract_Socket.hh +@@ -134,7 +134,7 @@ protected: + bool get_handle_half_close() const {return handle_half_close;} + int get_socket_fd() const; + int get_listen_fd() const {return listen_fd;} +- ++ + //set non-blocking mode + int set_non_block_mode(int fd, bool enable_nonblock); - -@@ -120,7 +109,7 @@ protected: - // Shall be called from Handle_Fd_Event() - void Handle_Socket_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error); - // Shall be called from Handle_Timeout() - for possible future development -- void Handle_Timeout_Event(double /*time_since_last_call*/) {}; -+ void Handle_Timeout_Event(double time_since_last_call) {}; - - // Shall be called from outgoing_send() - void send_outgoing(const unsigned char* message_buffer, int length, int client_id = -1); -@@ -144,9 +133,9 @@ protected: - bool increase_send_buffer(int fd, int &old_size, int& new_size); - - const char* get_local_host_name(){return local_host_name; }; -- unsigned int get_local_port_number(){return local_port_number; }; -+ const unsigned int get_local_port_number(){return local_port_number; }; - const char* get_remote_host_name(){return remote_host_name; }; -- unsigned int get_remote_port_number(){return remote_port_number; }; -+ const unsigned int get_remote_port_number(){return remote_port_number; }; - const struct sockaddr_in & get_remote_addr() {return remoteAddr; }; /* FIXME: This function is deprecated and should be removed! */ +@@ -149,6 +149,8 @@ protected: const struct sockaddr_in & get_local_addr() {return localAddr; }; /* FIXME: This function is deprecated and should be removed! */ const int& get_ai_family() const {return ai_family;} -@@ -190,15 +179,13 @@ protected: - virtual int send_message_on_nonblocking_fd(int client_id, const unsigned char *message_buffer, int message_length); - // Called after a peer is connected - virtual void peer_connected(int client_id, sockaddr_in& remote_addr); /* This function should be removed! deprecated by: */ -- virtual void peer_connected(int /*client_id*/, const char * /*host*/, const int /*port*/) {}; -+ virtual void peer_connected(int client_id, const char * host, const int port) {}; - // Called after a peer is disconnected - virtual void peer_disconnected(int client_id); - // Called when a peer shut down its fd for writing - virtual void peer_half_closed(int client_id); - // Called after a send error - virtual void report_error(int client_id, int msg_length, int sent_length, const unsigned char* msg, const char* error_text); -- // Called after a unsent message -- virtual void report_unsent(int client_id, int msg_length, int sent_length, const unsigned char* msg, const char* error_text); - - // Test port parameters - virtual const char* local_port_name(); -@@ -365,11 +352,6 @@ protected: - virtual const char* ssl_password_name(); - virtual const char* ssl_cipher_list_name(); - virtual const char* ssl_verifycertificate_name(); -- virtual const char* ssl_disable_SSLv2(); -- virtual const char* ssl_disable_SSLv3(); -- virtual const char* ssl_disable_TLSv1(); -- virtual const char* ssl_disable_TLSv1_1(); -- virtual const char* ssl_disable_TLSv1_2(); - - private: - bool ssl_verify_certificate; // verify other part's certificate or not -@@ -377,13 +359,6 @@ private: - bool ssl_initialized; // whether SSL already initialized or not - bool ssl_use_session_resumption; // use SSL sessions or not - -- bool SSLv2; -- bool SSLv3; -- bool TLSv1; -- bool TLSv1_1; -- bool TLSv1_2; -- -- - char *ssl_key_file; // private key file - char *ssl_certificate_file; // own certificate file - char *ssl_trustedCAlist_file; // trusted CA list file + void set_ai_family(int parameter_value) {ai_family=parameter_value;} ++ const int& get_ip_proto() const {return ip_proto;} ++ void set_ip_proto(int parameter_value) {ip_proto=parameter_value;} + bool get_ttcn_buffer_usercontrol() const {return ttcn_buffer_usercontrol; } + void set_nagling(bool parameter_value) {nagling=parameter_value;} + void set_server_mode(bool parameter_value) {server_mode=parameter_value;} +@@ -204,6 +206,7 @@ protected: + virtual const char* local_address_name(); + virtual const char* remote_port_name(); + virtual const char* ai_family_name(); ++ virtual const char* ip_proto_name(); + virtual const char* use_connection_ASPs_name(); + virtual const char* halt_on_connection_reset_name(); + virtual const char* client_TCP_reconnect_name(); +@@ -269,6 +272,7 @@ private: + char* remote_host_name; + unsigned int remote_port_number; + int ai_family; // address family to use ++ int ip_proto; // protocol to use (e.g. IPPROTO_TCP, IPPROTO_SCTP) + // remoteAddr and localAddr is filled when map_user is called + struct sockaddr_in remoteAddr; /* FIXME: not used! should be removed */ + struct sockaddr_in localAddr; /* FIXME: not used! should be removed */ -- GitLab From 82bb7aa1fdb1ce5147296dabb9ad43a9566cffe8 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 12 Aug 2025 16:35:06 +0200 Subject: [PATCH 002/151] Bug fixed in f_f2345; Validation of security functions f1, f1*, f_2345 & f_5* --- NAS_ETSI.code-workspace | 6 + ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc | 85 ++- ccsrc/Externals/common_ext.cc | 1 + ccsrc/Protocols/FiveG_AKA/opc.cc | 12 +- ccsrc/Protocols/FiveG_AKA/opc.hh | 5 +- ccsrc/Protocols/FiveG_AKA/rijndael.cc | 20 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 24 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 700 +++++++++++++++++++- ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn | 62 +- ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn | 2 +- ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn | 2 +- 11 files changed, 870 insertions(+), 49 deletions(-) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index e2a5ee7..c1c0e96 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -11,6 +11,12 @@ }, { "path": "../5G-AKA-simulation-in-C" + }, + { + "path": "../free5gc" + }, + { + "path": "../free5gc.util" } ], "settings": { diff --git a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc index 61e06ec..ca77731 100644 --- a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc +++ b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc @@ -15,6 +15,40 @@ namespace LIB__NG__NAS__Functions { loggers::get_instance().log_to_hexa("<<< fx__set__op: OP: ", static_cast(OP), 16); } + void fx__get__op(OCTETSTRING& p_op) { + loggers::get_instance().log_msg(">>> fx__get__op: p_op: ", p_op); + p_op = OCTETSTRING(16, static_cast(OP)); + loggers::get_instance().log_msg("<<< fx__get__op: OP: ", p_op); + } + + INTEGER fx__compute__opc(const OCTETSTRING& p_authK, OCTETSTRING& p_opc) { + loggers::get_instance().log_msg(">>> fx_compute_opc: OP: ", OCTETSTRING(16, static_cast(OP))); + + rijndael r; + r.rijndael_key_schedule(p_authK); + opc op(r, OP); + uint8_t op_c[16] = { 0x00 }; + op.compute_opc(op_c); + p_opc = OCTETSTRING(16, static_cast(op_c)); + + loggers::get_instance().log_msg("<<< fx_compute_opc: OPC: ", p_opc); + return 0; + } + + INTEGER fx__rijndael__encrypt(const OCTETSTRING& p_key, const OCTETSTRING& p_plain_text, OCTETSTRING& p_cypherer_text) { + loggers::get_instance().log_msg(">>> fx__rijndael__encrypt: p_key: ", p_key); + loggers::get_instance().log_msg(">>> fx__rijndael__encrypt: p_plain_text: ", p_plain_text); + + rijndael r; + r.rijndael_key_schedule(p_key); + uint8_t cypherer_text[16] = { 0x00 }; + r.rijndael_encrypt(static_cast(p_plain_text), cypherer_text); + p_cypherer_text = OCTETSTRING(16, static_cast(cypherer_text)); + + loggers::get_instance().log_msg("<<< fx__rijndael__encrypt: p_cypherer_text: ", p_cypherer_text); + return 0; + } + INTEGER fx__f1(const BITSTRING& p_authK, const BITSTRING& p_rand, const BITSTRING& p_sqn, const BITSTRING& p_amf, BITSTRING& p_mac_a) { loggers::get_instance().log_msg(">>> fx__f1: p_authK: ", bit2oct(p_authK)); loggers::get_instance().log_msg(">>> fx__f1: p_rand: ", bit2oct(p_rand)); @@ -25,7 +59,8 @@ namespace LIB__NG__NAS__Functions { opc op(r, OP); uint8_t op_c[16] = { 0x00 }; op.compute_opc(op_c); - + loggers::get_instance().log_to_hexa("fx__f1: op_c: ", op_c, 16); + OCTETSTRING rand = bit2oct(p_rand); uint8_t rijndael_input[16] = { 0x00 }; for (int i = 0; i < 16; i++) { @@ -33,6 +68,7 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement uint8_t temp[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, temp); + loggers::get_instance().log_to_hexa("fx__f1: Value after 1st encryption: ", temp, 16); OCTETSTRING sqn = bit2oct(p_sqn); uint8_t in1[16] = { 0x00 }; @@ -58,6 +94,8 @@ namespace LIB__NG__NAS__Functions { uint8_t out1[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, out1); + loggers::get_instance().log_to_hexa("fx__f1: Value after 2sd encryption: ", out1, 16); + for (int i = 0; i < 16; i++) { out1[i] ^= op_c[i]; } // End of 'for' statement @@ -83,6 +121,7 @@ namespace LIB__NG__NAS__Functions { opc op(r, OP); uint8_t op_c[16] = { 0x00 }; op.compute_opc(op_c); + loggers::get_instance().log_to_hexa("fx__f1star: op_c: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); uint8_t rijndael_input[16] = { 0x00 }; @@ -91,6 +130,7 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement uint8_t temp[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, temp); + loggers::get_instance().log_to_hexa("fx__f1star: Value after 1st encryption: ", temp, 16); OCTETSTRING sqn = bit2oct(p_sqn); uint8_t in1[16] = { 0x00 }; @@ -116,6 +156,8 @@ namespace LIB__NG__NAS__Functions { uint8_t out1[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, out1); + loggers::get_instance().log_to_hexa("fx__f1: Value after 2sd encryption: ", out1, 16); + for (int i = 0; i < 16; i++) { out1[i] ^= op_c[i]; } // End of 'for' statement @@ -141,6 +183,7 @@ namespace LIB__NG__NAS__Functions { opc op(r, OP); uint8_t op_c[16] = { 0x00 }; op.compute_opc(op_c); + loggers::get_instance().log_to_hexa("fx_f2345: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); uint8_t rijndael_input[16] = { 0x00 }; @@ -149,15 +192,19 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement uint8_t temp[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, temp); + loggers::get_instance().log_to_hexa("fx_f2345: Value after 1st encryption: ", temp, 16); // To obtain output block OUT2: XOR OPc and TEMP, rotate by r2=0, and XOR on the constant c2 (which is all zeroes except that the last bit is 1) for (int i = 0; i < 16; i++) { rijndael_input[i] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 1; + loggers::get_instance().log_to_hexa("fx_f2345: b entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", rijndael_input, 16); uint8_t out[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, out); + loggers::get_instance().log_to_hexa("fx_f2345: f2/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); + for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; } // End of 'for' statement @@ -166,19 +213,23 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 8; i++) { res[i] = out[i + 8]; } // End of 'for' statement + loggers::get_instance().log_to_hexa("fx_f2345: f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", res, 8); uint8_t ak[6] = { 0x00 }; for (int i = 0; i < 6; i++) { ak[i] = out[i]; } // End of 'for' statement + loggers::get_instance().log_to_hexa("fx_f2345: f5/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", ak, 6); // To obtain output block OUT3: XOR OPc and TEMP, rotate by r3=32, and XOR on the constant c3 (which is all zeroes except that the next to last bit is 1) for (int i = 0; i < 16; i++) { rijndael_input[(i + 12) % 16] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 2; - + loggers::get_instance().log_to_hexa("fx_f2345: f3/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); r.rijndael_encrypt(rijndael_input, out); + loggers::get_instance().log_to_hexa("fx_f2345: f3/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); + for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; } // End of 'for' statement @@ -187,14 +238,17 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 16; i++) { ck[i] = out[i]; } // End of 'for' statement + loggers::get_instance().log_to_hexa("fx_f2345: f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", ck, 16); // To obtain output block OUT4: XOR OPc and TEMP, rotate by r4=64, and XOR on the constant c4 (which is all zeroes except that the 2nd from last bit is 1) for (int i = 0; i < 16; i++) { rijndael_input[(i+8) % 16] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 4; - + loggers::get_instance().log_to_hexa("fx_f2345: f4/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", rijndael_input, 16); r.rijndael_encrypt(rijndael_input, out); + loggers::get_instance().log_to_hexa("fx_f2345: f4/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", out, 16); + for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; } // End of 'for' statement @@ -203,24 +257,25 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 16; i++) { ik[i] = out[i]; } // End of 'for' statement + loggers::get_instance().log_to_hexa("fx_f2345: f4/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", ik, 16); OCTETSTRING os(8, static_cast(&res[0])); p_res = oct2bit(os); - os = OCTETSTRING(16, static_cast(&ik[0])); - p_ik = oct2bit(os); os = OCTETSTRING(16, static_cast(&ck[0])); p_ck = oct2bit(os); + os = OCTETSTRING(16, static_cast(&ik[0])); + p_ik = oct2bit(os); os = OCTETSTRING(6, static_cast(&ak[0])); p_ak = oct2bit(os); - loggers::get_instance().log_msg("fx_f2345: p_res: ", p_res); - loggers::get_instance().log_msg("fx_f2345: p_ck: ", p_ck); - loggers::get_instance().log_msg("fx_f2345: p_ik: ", p_ik); - loggers::get_instance().log_msg("fx_f2345: p_ak: ", p_ak); + loggers::get_instance().log_msg("fx_f2345: p_res: ", bit2oct(p_res)); + loggers::get_instance().log_msg("fx_f2345: p_ck: ", bit2oct(p_ck)); + loggers::get_instance().log_msg("fx_f2345: p_ik: ", bit2oct(p_ik)); + loggers::get_instance().log_msg("fx_f2345: p_ak: ", bit2oct(p_ak)); return 0; } - INTEGER fx__f5star(const BITSTRING& p_authK, const BITSTRING& p_rand, BITSTRING& p_ak) { + INTEGER fx__f5star(const BITSTRING& p_authK, const BITSTRING& p_rand, BITSTRING& p_ak_s) { loggers::get_instance().log_msg(">>> fx__f5star: p_authK: ", p_authK); loggers::get_instance().log_msg(">>> fx__f5star: p_rand: ", p_rand); @@ -230,6 +285,8 @@ namespace LIB__NG__NAS__Functions { opc op(r, OP); uint8_t op_c[16] = { 0x00 }; op.compute_opc(op_c); + loggers::get_instance().log_to_hexa("fx__f5star: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", op_c, 16); + OCTETSTRING rand = bit2oct(p_rand); uint8_t rijndael_input[16] = { 0x00 }; @@ -237,6 +294,7 @@ namespace LIB__NG__NAS__Functions { rijndael_input[i] = rand[i].get_octet() ^ op_c[i]; } // End of 'for' statement uint8_t temp[16] = { 0x00 }; + loggers::get_instance().log_to_hexa("fx__f5star: Before 1st encryption: ", rijndael_input, 16); r.rijndael_encrypt(rijndael_input, temp); // To obtain output block OUT5: XOR OPc and TEMP, rotate by r5=96, and XOR on the constant c5 (which is all zeroes except that the 3rd from last bit is 1) @@ -244,9 +302,10 @@ namespace LIB__NG__NAS__Functions { rijndael_input[(i + 4) % 16] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 8; - uint8_t out[16] = { 0x00 }; + loggers::get_instance().log_to_hexa("fx__f5star: Before 2sd encryption: ", rijndael_input, 16); r.rijndael_encrypt(rijndael_input, out); + loggers::get_instance().log_to_hexa("fx__f5star: After 2sd encryption: ", out, 16); for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; } // End of 'for' statement @@ -256,8 +315,8 @@ namespace LIB__NG__NAS__Functions { ak[i] = out[i]; } OCTETSTRING os(6, static_cast(&ak[0])); - p_ak = oct2bit(os); - loggers::get_instance().log_msg("fx__f5star: p_ak: ", os); + p_ak_s = oct2bit(os); + loggers::get_instance().log_msg("fx__f5star: p_ak: ", bit2oct(p_ak_s)); return 0; } diff --git a/ccsrc/Externals/common_ext.cc b/ccsrc/Externals/common_ext.cc index 0addcb8..ea34cad 100644 --- a/ccsrc/Externals/common_ext.cc +++ b/ccsrc/Externals/common_ext.cc @@ -23,6 +23,7 @@ namespace CommonDefs { * @desc This external function gets KEY * @return The KEY * @see fx_get...() return UInt64 + * @note ETSI TS 133 220 V18.3.0 (2024-05) Annex B.2 Generic key derivation function */ //INTEGER fx__KeyDerivationFunction(INTEGER const&, BITSTRING const&, OCTETSTRING const&){ BITSTRING fx__KeyDerivationFunction(const INTEGER& p__KDF, const BITSTRING& p__Key, const OCTETSTRING& p__String){ diff --git a/ccsrc/Protocols/FiveG_AKA/opc.cc b/ccsrc/Protocols/FiveG_AKA/opc.cc index 34d3966..8f600bc 100644 --- a/ccsrc/Protocols/FiveG_AKA/opc.cc +++ b/ccsrc/Protocols/FiveG_AKA/opc.cc @@ -1,12 +1,8 @@ #include "opc.hh" void opc::compute_opc(uint8_t p_opc[16]) { - if (!_computed) { - _rijndael.rijndael_encrypt(_op, p_opc); - for (uint8_t i = 0; i < 16; i++) { - p_opc[i] ^= _op[i]; - } // End of 'for' statement - } else { - std::memcpy(p_opc, _op, 16); - } + _rijndael.rijndael_encrypt(_op, p_opc); + for (uint8_t i = 0; i < 16; i++) { + p_opc[i] ^= _op[i]; + } // End of 'for' statement } diff --git a/ccsrc/Protocols/FiveG_AKA/opc.hh b/ccsrc/Protocols/FiveG_AKA/opc.hh index eeaaf80..861adbe 100644 --- a/ccsrc/Protocols/FiveG_AKA/opc.hh +++ b/ccsrc/Protocols/FiveG_AKA/opc.hh @@ -9,11 +9,10 @@ class opc { rijndael& _rijndael; uint8_t _op[16]; - bool _computed; public: - opc(rijndael& p_rijndael): _rijndael(p_rijndael), _op(), _computed{false} { std::memcpy(_op, OP, 16); std::memset(_op, 0x00, 16); }; - opc(rijndael& p_rijndael, uint8_t p_op[16]): _rijndael(p_rijndael), _computed{true} { std::memcpy(_op, p_op, 16); }; + opc(rijndael& p_rijndael): _rijndael(p_rijndael), _op() { std::memcpy(_op, OP, 16); std::memset(_op, 0x00, 16); }; + opc(rijndael& p_rijndael, uint8_t p_op[16]): _rijndael(p_rijndael) { std::memcpy(_op, p_op, 16); }; virtual ~opc() {}; void compute_opc(uint8_t p_opc[16]); diff --git a/ccsrc/Protocols/FiveG_AKA/rijndael.cc b/ccsrc/Protocols/FiveG_AKA/rijndael.cc index 701ada5..f43e8dc 100644 --- a/ccsrc/Protocols/FiveG_AKA/rijndael.cc +++ b/ccsrc/Protocols/FiveG_AKA/rijndael.cc @@ -1,5 +1,7 @@ #include "rijndael.hh" +#include "loggers.hh" + rijndael::rijndael() { } // End of ctor @@ -8,6 +10,8 @@ rijndael::~rijndael() { } // End of dtor int rijndael::rijndael_key_schedule(const uint8_t p_key[16]) { + loggers::get_instance().log_to_hexa(">>> rijndael::rijndael_key_schedule: ", p_key, 16); + uint8_t round_const = 1; // First round p_key equals p_key @@ -29,41 +33,55 @@ int rijndael::rijndael_key_schedule(const uint8_t p_key[16]) { } // End of 'for' statement // Update round constant - round_const = XTIME[round_const]; + round_const = XTIME[round_const]; } // End of 'for' statement + loggers::get_instance().log_to_hexa("rijndael::rijndael_key_schedule: ", static_cast(&_round_keys[0][0][0]), 16); + return 0; } void rijndael::rijndael_encrypt(const uint8_t p_input[16], uint8_t p_output[16]) { + loggers::get_instance().log_to_hexa(">>> rijndael::rijndael_encrypt: ", p_input, 16); // Initialise state array from p_input byte string uint8_t state[4][4]; for (int i = 0; i < 16; i++) { state[i & 0x3][i>>2] = p_input[i]; } // End of 'for' statement + loggers::get_instance().log_rijndael_state("rijndael::rijndael_encrypt: Initial state: ", state); // Add first round_key key_add(state, _round_keys, 0); + loggers::get_instance().log_rijndael_state("rijndael::rijndael_encrypt: First round: key_add:", state); // Do lots of full rounds int r = 1; for ( ; r <= 9; r++) { + loggers::get_instance().log("rijndael::rijndael_encrypt: Round %d:",r); byte_sub(state); + loggers::get_instance().log_rijndael_state("byte_sub: ", state); shift_row(state); + loggers::get_instance().log_rijndael_state("shift_row: ", state); mix_column(state); + loggers::get_instance().log_rijndael_state("mix_column: ", state); key_add(state, _round_keys, r); + loggers::get_instance().log_rijndael_state("key_add: ", state); } // End of 'for' statement // Final round byte_sub(state); + loggers::get_instance().log_rijndael_state("rijndael::rijndael_encrypt: Final round: byte_sub: ", state); shift_row(state); + loggers::get_instance().log_rijndael_state("rijndael::rijndael_encrypt: Final round: shift_row: ", state); key_add(state, _round_keys, r); + loggers::get_instance().log_rijndael_state("rijndael::rijndael_encrypt: Final round: key_add: ", state); /* produce output byte string from state array */ for (int i = 0; i < 16; i++) { p_output[i] = state[i & 0x3][i>>2]; } // End of 'for' statement + loggers::get_instance().log_to_hexa("<<< rijndael::rijndael_encrypt: ", p_output, 16); } void rijndael::key_add(uint8_t p_state[4][4], const uint8_t p_round_keys[11][4][4], const int p_round) { diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 9a5c40c..b7f9e0e 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -59,13 +59,35 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # In this section you can specify what parts of your test suite you want to execute. #AtsImsIot_TestControl.control +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_01 +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_02 +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_03 +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_04 + +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01 + #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 -NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 +#NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index ebff74a..1df3001 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -15,24 +15,30 @@ module NG_NAS_TestCases { // LibCommon import from LibCommon_Sync all ; - // NG_NAS + // Lib3GPP + import from CommonDefs all; + + // Lib_NG_NAS import from Lib_NG_NAS_Interface all; + import from LIB_NG_NAS_Functions all; + + // NG_NAS import from NG_NAS_TCFunctions all; import from NG_NAS_Pics all; import from NG_NAS_TestConfiguration all; import from NG_NAS_TestSystem all; // LibNGAP - import from NGAP_Constants language "ASN.1:2002" all; - import from NGAP_CommonDataTypes language "ASN.1:2002" all; - import from NGAP_IEs language "ASN.1:2002" all; - import from NGAP_PDU_Contents language "ASN.1:2002" all; - import from NGAP_PDU_Descriptions language "ASN.1:2002" all; - import from NGAP_Containers language "ASN.1:2002" all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_CommonDataTypes language "ASN.1:2002" all; + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_PDU_Contents language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from NGAP_Containers language "ASN.1:2002" all; - //import from LibNGAP_TypesAndValues all; - //import from LibNGAP_Templates all; - //import from LibNGAP_Pixits all; + //import from LibNGAP_TypesAndValues all; + //import from LibNGAP_Templates all; + //import from LibNGAP_Pixits all; // NGAP_Ats //import from LibNGAP_TypesAndValues all; @@ -41,6 +47,7 @@ module NG_NAS_TestCases { //import from NGAP_TCFunctions all; //import from NGAP_Pics all; + group TC_AMF { group /*5_4_*/fiveGMM_Common_Procedures { @@ -833,4 +840,677 @@ module NG_NAS_TestCases { } // End of group TC_AMF_NGAP + group fiveG_AKA_Crypto_Functions { + + /** + * @desc Verify that OP is set correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Annex 2: Specification of the Block Cipher Algorithm Rijndael + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.3 Test Set 1 + */ + testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.3 Test Set 1 + var O16_Type v_key := '465b5ce8 b199b49f aa5f0a2e e238a6bc'O; + var O16_Type v_plain_text := 'ee36f7cf037d37d3692f7f0399e7949a'O; + var O16_Type v_cypher := '9e2980c59739da67b136355e3cede6a2'O; + + var O16_Type v_cypher_computed; + var integer v_result := f_rijndael_encrypt(v_key, v_plain_text, v_cypher_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_rijndael_encrypt' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_cypher_computed, v_cypher))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cypher_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cypher_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01 + + /** + * @desc Verify that OP is set correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Annex 2: Specification of the Block Cipher Algorithm Rijndael + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.4. Test Set 2 + */ + testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.4. Test Set 2 + var O16_Type v_key := '0396eb317b6d1c36f19c1c84cd6ffd16'O; + var O16_Type v_plain_text := '93cc3640c5d6a521d81235bd0882bf0a'O; + var O16_Type v_cypher := '009a9e0996561525f611667bbf79e226'O; + + var O16_Type v_cypher_computed; + var integer v_result := f_rijndael_encrypt(v_key, v_plain_text, v_cypher_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_rijndael_encrypt' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_cypher_computed, v_cypher))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cypher_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cypher_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_02 + + /** + * @desc Verify that OP is set correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Annex 2: Specification of the Block Cipher Algorithm Rijndael + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.5. Test Set 3 + */ + testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.5. Test Set 3 + var O16_Type v_key := 'fec86ba6eb707ed08905757b1bb44b8f'O; + var O16_Type v_plain_text := '8f7a8f0d108b7f2d97a53eacc1d958d9'O; + var O16_Type v_cypher := '5d9bce854decaf0da93d28b7e35f608c'O; + + var O16_Type v_cypher_computed; + var integer v_result := f_rijndael_encrypt(v_key, v_plain_text, v_cypher_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_rijndael_encrypt' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_cypher_computed, v_cypher))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cypher_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cypher_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_03 + + /** + * @desc Verify that OP is set correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Annex 2: Specification of the Block Cipher Algorithm Rijndael + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.6 Test Set 4 + */ + testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_04() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.6 Test Set 4 + var O16_Type v_key := '9e5944aea94b81165c82fbf9f32db751'O; + var O16_Type v_plain_text := '68c98bbfab628ec1adf2a3d90c34a751'O; + var O16_Type v_cypher := 'db2944cce8e683cd03fff19931a12135'O; + + var O16_Type v_cypher_computed; + var integer v_result := f_rijndael_encrypt(v_key, v_plain_text, v_cypher_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_rijndael_encrypt' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_cypher_computed, v_cypher))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cypher_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cypher_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_04 + + /** + * @desc Verify that OP is set correctly + * @see ETSI TS 135 205 V16.0.0 (2020-08) Clause 8.3 Analysis of the role of OP and OPc + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var O16_Type v_test; + + f_set_op(v_op); + + f_get_op(v_test); + if (not(match(v_test, v_op))) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_get_op' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fx_get_op' returned the expected value ***"); + setverdict(pass); + } + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_01 + + /** + * @desc Verify that computing of OPC is working fine + * @see ETSI TS 135 205 V16.0.0 (2020-08) Clause 8.3 Analysis of the role of OP and OPc + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var O16_Type v_opc := 'cd63cb71954a9f4e48a5994e37a02baf'O; + + var O16_Type v_opc_computed; + + f_set_op(v_op); + var integer v_result := f_compute_opc(v_K, v_opc_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_compute_opc' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_opc, v_opc_computed))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_opc_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_opc_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_01 + + /** + * @desc Verify that computing of OPC is working fine + * @see ETSI TS 135 205 V16.0.0 (2020-08) Clause 8.3 Analysis of the role of OP and OPc + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.4 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.4 Test Set 2 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var O16_Type v_opc := '53c15671c60a4b731c55b4a441c0bde2'O; + + var O16_Type v_opc_computed; + + f_set_op(v_op); + var integer v_result := f_compute_opc(v_K, v_opc_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_compute_opc' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_opc, v_opc_computed))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_opc_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_opc_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_02 + + /** + * @desc Verify that computing of OPC is working fine + * @see ETSI TS 135 205 V16.0.0 (2020-08) Clause 8.3 Analysis of the role of OP and OPc + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.5 Test Set 3 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.5 Test Set 3 + var O16_Type v_K := 'fec86ba6eb707ed08905757b1bb44b8f'O; // The long-term key: Subscriber key + var O16_Type v_op := 'dbc59adcb6f9a0ef735477b7fadf8374'O; // Operator Variant Algorithm Configuration Field + var O16_Type v_opc := '1006020f0a478bf6b699f15c062e42b3'O; + + var O16_Type v_opc_computed; + + f_set_op(v_op); + var integer v_result := f_compute_opc(v_K, v_opc_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_compute_opc' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_opc, v_opc_computed))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_opc_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_opc_computed' returned the expected value ***"); + setverdict(pass); + } + } + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_03 + + /** + * @desc Verify that the f_extract_xxx_from_autn functions are working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Clause 3.1 Definitions + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var B64_Type v_mac := oct2bit('4a9ffac354dfafb3'O); // MAC: Message Authentication Code + + // Rebuild AUTN, the Authentication Token: AUTN = SQN ⊕ AK || AMF || MAC + var B128_Type v_autn := v_sqn & v_amf & v_mac; + + // Extract SQN from v_sqn_ak and XOR it with calculated MAC + var B48_Type v_sqn_ex := f_extract_sqn_ak_from_autn(v_autn); + var B16_Type v_amf_ex := f_extract_amf_from_autn(v_autn); + var B64_Type v_mac_ex := f_extract_mac_from_autn(v_autn); + + if (not(match(v_sqn_ex, v_sqn))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_sqn_ex' mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_sqn_ex' is as expected. ***"); + } + + if (not(match(v_amf_ex, v_amf))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_amf_ex' mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_amf_ex' is as expected. ***"); + } + + if (not(match(v_mac_ex, v_mac))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_ex' mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_ex' is as expected. ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_03 + + /** + * @desc Verify that the f1 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var B64_Type v_mac_a := oct2bit('4a9ffac354dfafb3'O); // MAC-A: Network authentication code + + f_set_op(v_op); + var B64_Type v_mac_a_computed; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_mac_a_computed, v_mac_a))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_a_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_01 + + /** + * @desc Verify that the f1 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.4 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var B48_Type v_sqn := oct2bit('fd8eef40df7d'O); + var B16_Type v_amf := oct2bit('af17'O); // AMF: Authentication Management Field + var B64_Type v_mac_a := oct2bit('5df5b31807e258b0'O); // MAC-A: Network authentication code + + f_set_op(v_op); + var B64_Type v_mac_a_computed; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_mac_a_computed, v_mac_a))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_a_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_02 + + /** + * @desc Verify that the f1 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.5 Test Set 3 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := 'fec86ba6eb707ed08905757b1bb44b8f'O; // The long-term key: Subscriber key + var O16_Type v_op := 'dbc59adcb6f9a0ef735477b7fadf8374'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('9f7c8d021accf4db213ccff0c7f71a6a'O); + var B48_Type v_sqn := oct2bit('9d0277595ffc'O); + var B16_Type v_amf := oct2bit('725c'O); // AMF: Authentication Management Field + var B64_Type v_mac_a := oct2bit('9cabc3e99baf7281'O); // MAC-A: Network authentication code + + f_set_op(v_op); + var B64_Type v_mac_a_computed; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_mac_a_computed, v_mac_a))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_a_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_03 + + /** + * @desc Verify that the f1* functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var B64_Type v_mac_s := oct2bit('01cfaf9ec4e871e9'O); // MAC-S: Resynch authentication code + + f_set_op(v_op); + var B64_Type v_mac_s_computed; + var integer v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_s_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_mac_s_computed, v_mac_s))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_s_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_s_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_01 + + /** + * @desc Verify that the f1* functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.4 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var B48_Type v_sqn := oct2bit('fd8eef40df7d'O); + var B16_Type v_amf := oct2bit('af17'O); // AMF: Authentication Management Field + var B64_Type v_mac_s := oct2bit('a8c016e51ef4a343'O); // MAC-S: Resynch authentication code + + f_set_op(v_op); + var B64_Type v_mac_s_computed; + var integer v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_s_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_mac_s_computed, v_mac_s))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_s_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_s_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_02 + + /** + * @desc Verify that the f1* functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.5 Test Set 3 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := 'fec86ba6eb707ed08905757b1bb44b8f'O; // The long-term key: Subscriber key + var O16_Type v_op := 'dbc59adcb6f9a0ef735477b7fadf8374'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('9f7c8d021accf4db213ccff0c7f71a6a'O); + var B48_Type v_sqn := oct2bit('9d0277595ffc'O); + var B16_Type v_amf := oct2bit('725c'O); // AMF: Authentication Management Field + var B64_Type v_mac_s := oct2bit('95814ba2b3044324'O); // MAC-S: Resynch authentication code + + f_set_op(v_op); + var B64_Type v_mac_s_computed; + var integer v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_s_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_mac_s_computed, v_mac_s))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_s_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_s_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_03 + + /** + * @desc Verify that the f2 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987 b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('535bc878505c5e56ea44d2dffeb95fc4'O); // Integrity key + var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_res_computed, v_res))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_res_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_res_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_01 + + /** + * @desc Verify that the f3 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key + var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ck_computed, v_ck))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ck_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ck_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_01 + + /** + * @desc Verify that the f4 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key + var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ik_computed, v_ik))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ik_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ik_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_01 + + /** + * @desc Verify that the f5 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key + var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ak_computed, v_ak))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ak_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ak_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_01 + + /** + * @desc Verify that the f5* functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.3 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_ak_s := oct2bit('451e8beca43b'O); // Anonymity key for the re-synchronisation + + f_set_op(v_op); + var B48_Type v_ak_s_computed; + var integer v_result := f_f5star(oct2bit(v_K), v_rand, v_ak_s_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f5star' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ak_s_computed, v_ak_s))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ak_s_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ak_s_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01 + + } // End of group fiveG_AKA_Crypto_Functions + }// End of module NG_NAS_TestCases diff --git a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn index 581b0fa..9aa459f 100644 --- a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn @@ -167,7 +167,7 @@ module LIB_NG_NAS_Functions { return; } // Compute RES/XRES - f_5g_aka_compute_res_xres(v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type); + f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type); // Send response vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } @@ -539,6 +539,7 @@ module LIB_NG_NAS_Functions { * @param [in,out] p_ng_nas_security_params_type Built security parameters */ function f_5g_aka_compute_res_xres( + in B128_Type p_long_term_key := PX_LONG_TERM_KEY, in B128_Type p_rand, in B128_Type p_autn, in ABBA p_abba, @@ -554,12 +555,12 @@ module LIB_NG_NAS_Functions { p_ng_nas_security_params_type.AuthParams.RandValue := p_rand; p_ng_nas_security_params_type.AuthParams.AUTN := p_autn; - log("f_5g_aka_compute_res_xres: PX_USIM_SECRET_KEY=", PX_USIM_SECRET_KEY); + log("f_5g_aka_compute_res_xres: PX_LONG_TERM_KEY=", PX_LONG_TERM_KEY); // Extract SQN from v_sqn_ak and XOR it with calculated MAC - var B48_Type v_sqn_ak := substr(p_autn, 0, 48); - var B16_Type v_amf := substr(p_autn, 48, 16); - var B64_Type v_mac := substr(p_autn, 64, 64); + var B48_Type v_sqn_ak := f_extract_sqn_ak_from_autn(p_autn); + var B16_Type v_amf := f_extract_amf_from_autn(p_autn); + var B64_Type v_mac := f_extract_mac_from_autn(p_autn); log("f_5g_aka_compute_res_xres: v_sqn_ak=", v_sqn_ak); log("f_5g_aka_compute_res_xres: v_amf=", v_amf); log("f_5g_aka_compute_res_xres: v_mac=", v_mac); @@ -571,7 +572,8 @@ module LIB_NG_NAS_Functions { var B128_Type v_ik; var B48_Type v_ak; var B64_Type v_res; - if (f_f2345(PX_USIM_SECRET_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { + if (f_f2345(PX_LONG_TERM_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { + log("f_f2345 failed: "); return false; } p_ng_nas_security_params_type.AuthParams.CK := v_ck; @@ -585,11 +587,13 @@ module LIB_NG_NAS_Functions { // Verify that MAC was accepted var B64_Type v_mac_p; - if (f_f1(PX_USIM_SECRET_KEY, p_rand, v_sqn, v_amf, v_mac_p) == -1) { + if (f_f1(PX_LONG_TERM_KEY, p_rand, v_sqn, v_amf, v_mac_p) == -1) { + log("f_f1 failed: "); return false; } log("f_5g_aka_compute_res_xres: v_mac_p=", v_mac_p); if (v_mac != v_mac_p) { + log("v_mac != v_mac_p"); return false; } @@ -627,16 +631,50 @@ module LIB_NG_NAS_Functions { // ); //log("f_5g_aka_compute_res_xres: KAMF=", p_ng_nas_security_params_type.KAMF); - // TODO Generate KMAF - - log("<<< f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); return true; } // End of function f_5g_aka_compute_res_xres + + + + + function f_extract_sqn_ak_from_autn(in B128_Type p_autn) return B48_Type { + return substr(p_autn, 0, 48); + } + + function f_extract_amf_from_autn(in B128_Type p_autn) return B16_Type { + return substr(p_autn, 48, 16); + } + + function f_extract_mac_from_autn(in B128_Type p_autn) return B64_Type { + return substr(p_autn, 64, 64); + } + function f_set_op(in O16_Type p_op) { fx_set_op(p_op); } + function f_get_op(out O16_Type p_op) { + fx_get_op(p_op); + } + function f_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer { + return fx_compute_opc(p_authK, p_opc); + } + + + + + + + external function fx_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer; + function f_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer { + return fx_rijndael_encrypt(p_key, p_plain_text, p_cypherer_text); + } + + + + + function f_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer { return fx_f1(p_authK, p_rand, v_sqn, v_amf, v_mac_a); @@ -647,7 +685,7 @@ module LIB_NG_NAS_Functions { } function f_f2345(in B128_Type p_authK, in B128_Type p_rand, out B64_Type v_res, out B128_Type v_ck, out B128_Type v_ik, out B48_Type v_ak) return integer { - return fx_f2345(p_authK, p_rand, v_res, v_ik, v_ck, v_ak); + return fx_f2345(p_authK, p_rand, v_res, v_ck, v_ik, v_ak); } function f_f5star(in B128_Type p_authK, in B128_Type p_rand, out B48_Type p_ak) return integer { @@ -655,6 +693,8 @@ module LIB_NG_NAS_Functions { } external function fx_set_op(in O16_Type p_op); + external function fx_get_op(out O16_Type p_op); + external function fx_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer; external function fx_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer; external function fx_f1star(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_s) return integer; external function fx_f2345(in B128_Type p_authK, in B128_Type p_rand, out B64_Type v_res, out B128_Type v_ck, out B128_Type v_ik, out B48_Type v_ak) return integer; diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn index 59ccfc4..b6dc62c 100755 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn @@ -20,7 +20,7 @@ module Lib_NG_NAS_Pixits { modulepar O16_Type PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O; - modulepar B128_Type PX_USIM_SECRET_KEY := oct2bit('00000000000000000000000000000000'O); + modulepar B128_Type PX_LONG_TERM_KEY := oct2bit('00000000000000000000000000000000'O); modulepar NAS_PlmnId PX_PLMN := '000000'O; diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn index 627d996..78f6ccd 100644 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn @@ -443,7 +443,7 @@ module Lib_NG_NAS_Templates { template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := *, template ExtdCAGInfoList p_ExtdCAGInfoList := *, - template NSAG_Info p_NsagInfo + template NSAG_Info p_NsagInfo := * ) := { /* 24.501 cl. 8.2.7 */ /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ registration_Accept := { -- GitLab From ff1a5e5c744d6d883fc002aceb17c4f9271aa6f6 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 19 Aug 2025 12:21:32 +0200 Subject: [PATCH 003/151] Enhance security tests group --- ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc | 44 +- ccsrc/Externals/common_ext.cc | 180 ++-- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 76 +- titan-test-system-framework | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 86 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 890 +++++++++++++++++- ttcn/Lib3GPP/Common/CommonDefs.ttcn | 2 + .../NG_NAS/NG_NAS_SecurityFunctions.ttcn | 62 +- ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn | 80 +- 9 files changed, 1231 insertions(+), 191 deletions(-) diff --git a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc index ca77731..e79682e 100644 --- a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc +++ b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc @@ -106,7 +106,7 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement OCTETSTRING os(8, static_cast(&mac_a[0])); p_mac_a = oct2bit(os); - loggers::get_instance().log_msg("fx__f1star: p_mac_a: ", os); + loggers::get_instance().log_msg("fx__f1: p_mac_a: ", os); return 0; } @@ -174,8 +174,8 @@ namespace LIB__NG__NAS__Functions { } INTEGER fx__f2345(const BITSTRING& p_authK, const BITSTRING& p_rand, BITSTRING& p_res, BITSTRING& p_ck, BITSTRING& p_ik, BITSTRING& p_ak) { - loggers::get_instance().log_msg(">>> fx_f2345: p_authK: ", p_authK); - loggers::get_instance().log_msg(">>> fx_f2345: p_rand: ", p_rand); + loggers::get_instance().log_msg(">>> fx__f2345: p_authK: ", bit2oct(p_authK)); + loggers::get_instance().log_msg(">>> fx__f2345: p_rand: ", bit2oct(p_rand)); rijndael r; OCTETSTRING authK = bit2oct(p_authK); @@ -183,7 +183,7 @@ namespace LIB__NG__NAS__Functions { opc op(r, OP); uint8_t op_c[16] = { 0x00 }; op.compute_opc(op_c); - loggers::get_instance().log_to_hexa("fx_f2345: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", op_c, 16); + loggers::get_instance().log_to_hexa("fx__f2345: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); uint8_t rijndael_input[16] = { 0x00 }; @@ -192,18 +192,18 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement uint8_t temp[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, temp); - loggers::get_instance().log_to_hexa("fx_f2345: Value after 1st encryption: ", temp, 16); + loggers::get_instance().log_to_hexa("fx__f2345: Value after 1st encryption: ", temp, 16); // To obtain output block OUT2: XOR OPc and TEMP, rotate by r2=0, and XOR on the constant c2 (which is all zeroes except that the last bit is 1) for (int i = 0; i < 16; i++) { rijndael_input[i] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 1; - loggers::get_instance().log_to_hexa("fx_f2345: b entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", rijndael_input, 16); + loggers::get_instance().log_to_hexa("fx__f2345: b entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", rijndael_input, 16); uint8_t out[16] = { 0x00 }; r.rijndael_encrypt(rijndael_input, out); - loggers::get_instance().log_to_hexa("fx_f2345: f2/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f2/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; @@ -213,22 +213,22 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 8; i++) { res[i] = out[i + 8]; } // End of 'for' statement - loggers::get_instance().log_to_hexa("fx_f2345: f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", res, 8); + loggers::get_instance().log_to_hexa("fx__f2345: f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", res, 8); uint8_t ak[6] = { 0x00 }; for (int i = 0; i < 6; i++) { ak[i] = out[i]; } // End of 'for' statement - loggers::get_instance().log_to_hexa("fx_f2345: f5/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", ak, 6); + loggers::get_instance().log_to_hexa("fx__f2345: f5/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", ak, 6); // To obtain output block OUT3: XOR OPc and TEMP, rotate by r3=32, and XOR on the constant c3 (which is all zeroes except that the next to last bit is 1) for (int i = 0; i < 16; i++) { rijndael_input[(i + 12) % 16] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 2; - loggers::get_instance().log_to_hexa("fx_f2345: f3/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f3/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); r.rijndael_encrypt(rijndael_input, out); - loggers::get_instance().log_to_hexa("fx_f2345: f3/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f3/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", out, 16); for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; @@ -238,16 +238,16 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 16; i++) { ck[i] = out[i]; } // End of 'for' statement - loggers::get_instance().log_to_hexa("fx_f2345: f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", ck, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", ck, 16); // To obtain output block OUT4: XOR OPc and TEMP, rotate by r4=64, and XOR on the constant c4 (which is all zeroes except that the 2nd from last bit is 1) for (int i = 0; i < 16; i++) { rijndael_input[(i+8) % 16] = temp[i] ^ op_c[i]; } // End of 'for' statement rijndael_input[15] ^= 4; - loggers::get_instance().log_to_hexa("fx_f2345: f4/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", rijndael_input, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f4/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", rijndael_input, 16); r.rijndael_encrypt(rijndael_input, out); - loggers::get_instance().log_to_hexa("fx_f2345: f4/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", out, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f4/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", out, 16); for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; @@ -257,7 +257,7 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 16; i++) { ik[i] = out[i]; } // End of 'for' statement - loggers::get_instance().log_to_hexa("fx_f2345: f4/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", ik, 16); + loggers::get_instance().log_to_hexa("fx__f2345: f4/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", ik, 16); OCTETSTRING os(8, static_cast(&res[0])); p_res = oct2bit(os); @@ -267,10 +267,10 @@ namespace LIB__NG__NAS__Functions { p_ik = oct2bit(os); os = OCTETSTRING(6, static_cast(&ak[0])); p_ak = oct2bit(os); - loggers::get_instance().log_msg("fx_f2345: p_res: ", bit2oct(p_res)); - loggers::get_instance().log_msg("fx_f2345: p_ck: ", bit2oct(p_ck)); - loggers::get_instance().log_msg("fx_f2345: p_ik: ", bit2oct(p_ik)); - loggers::get_instance().log_msg("fx_f2345: p_ak: ", bit2oct(p_ak)); + loggers::get_instance().log_msg("fx__f2345: p_res: ", bit2oct(p_res)); + loggers::get_instance().log_msg("fx__f2345: p_ck: ", bit2oct(p_ck)); + loggers::get_instance().log_msg("fx__f2345: p_ik: ", bit2oct(p_ik)); + loggers::get_instance().log_msg("fx__f2345: p_ak: ", bit2oct(p_ak)); return 0; } @@ -286,7 +286,6 @@ namespace LIB__NG__NAS__Functions { uint8_t op_c[16] = { 0x00 }; op.compute_opc(op_c); loggers::get_instance().log_to_hexa("fx__f5star: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", op_c, 16); - OCTETSTRING rand = bit2oct(p_rand); uint8_t rijndael_input[16] = { 0x00 }; @@ -294,7 +293,6 @@ namespace LIB__NG__NAS__Functions { rijndael_input[i] = rand[i].get_octet() ^ op_c[i]; } // End of 'for' statement uint8_t temp[16] = { 0x00 }; - loggers::get_instance().log_to_hexa("fx__f5star: Before 1st encryption: ", rijndael_input, 16); r.rijndael_encrypt(rijndael_input, temp); // To obtain output block OUT5: XOR OPc and TEMP, rotate by r5=96, and XOR on the constant c5 (which is all zeroes except that the 3rd from last bit is 1) @@ -303,9 +301,9 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement rijndael_input[15] ^= 8; uint8_t out[16] = { 0x00 }; - loggers::get_instance().log_to_hexa("fx__f5star: Before 2sd encryption: ", rijndael_input, 16); + loggers::get_instance().log_to_hexa("fx__f5star: f5*/c entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", rijndael_input, 16); r.rijndael_encrypt(rijndael_input, out); - loggers::get_instance().log_to_hexa("fx__f5star: After 2sd encryption: ", out, 16); + loggers::get_instance().log_to_hexa("fx__f5star: f5*/d entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", out, 16); for (int i = 0; i < 16; i++) { out[i] ^= op_c[i]; } // End of 'for' statement diff --git a/ccsrc/Externals/common_ext.cc b/ccsrc/Externals/common_ext.cc index ea34cad..dfd722e 100644 --- a/ccsrc/Externals/common_ext.cc +++ b/ccsrc/Externals/common_ext.cc @@ -1,62 +1,118 @@ -#include -#include -#include -#include - -#include "CommonDefs.hh" - -#include "base_time.hh" -//#include "converter.hh" -#include "loggers.hh" - -#include "hmac.hh" - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif -#define earthRadius 6378137.0L -#define rbis = ((double)(earthRadius * M_PI / 180)) - -namespace CommonDefs { - - /** - * @desc This external function gets KEY - * @return The KEY - * @see fx_get...() return UInt64 - * @note ETSI TS 133 220 V18.3.0 (2024-05) Annex B.2 Generic key derivation function - */ - //INTEGER fx__KeyDerivationFunction(INTEGER const&, BITSTRING const&, OCTETSTRING const&){ - BITSTRING fx__KeyDerivationFunction(const INTEGER& p__KDF, const BITSTRING& p__Key, const OCTETSTRING& p__String){ - loggers::get_instance().log_msg(">>> fx__KeyDerivationFunction: p__KDF: ", p__KDF); - loggers::get_instance().log_msg(">>> fx__KeyDerivationFunction: p__Key: ", bit2oct(p__Key)); - - hmac h; // hash_algorithms::sha_256: p__KDF == 1 (tsc_KDF_HMAC_SHA_256 see CommonDefs.ttcn) - OCTETSTRING res; - if (h.generate(p__String, bit2oct(p__Key), res) == -1) { - loggers::get_instance().error("fx__KeyDerivationFunction: Key derivation failed"); - return int2bit(0, 0); - } - - loggers::get_instance().log_msg("<<< fx__KeyDerivationFunction: res: ", res); - return oct2bit(res); - } - /** - * @desc This external function gets the current time since 01/01/1970 in UTC format - * @return The current time since 01/01/1970 in UTC format in milliseconds - * @see fx_getSystemTime() return UInt64 - */ -//INTEGER fx__GetSystemTime(CommonDefs::Struct__tm__Type&, INTEGER&){ -void fx__GetSystemTime(CommonDefs::Struct__tm__Type& p__Struct__tm, INTEGER& p__TimezoneInfo){ - const time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - tm* now = std::localtime(&t); - p__Struct__tm = Struct__tm__Type(now->tm_sec, now->tm_min, now->tm_hour, now->tm_mday, now->tm_mon, now->tm_year, now->tm_wday, now->tm_yday, now->tm_isdst); - p__TimezoneInfo = 0; // TODO FSCOM - - return; -} -//void fx__CalculateFCS32(BITSTRING const&) { - BITSTRING fx__CalculateFCS32(const BITSTRING& p__TMSI){ -return int2bit(0, 0); -} - -} // namespace CommonDefs +#include +#include +#include +#include + +#include "CommonDefs.hh" + +#include "base_time.hh" +//#include "converter.hh" +#include "loggers.hh" + +#include "sha256.hh" +#include "hmac.hh" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#define earthRadius 6378137.0L +#define rbis = ((double)(earthRadius * M_PI / 180)) + +namespace CommonDefs { + + /** + * @desc This external function gets KEY + * @return The KEY + * @see fx_get...() return UInt64 + * @note ETSI TS 133 220 V18.3.0 (2024-05) Annex B.2 Generic key derivation function + */ + //INTEGER fx__KeyDerivationFunction(INTEGER const&, BITSTRING const&, OCTETSTRING const&){ + BITSTRING fx__KeyDerivationFunction(const INTEGER& p__KDF, const BITSTRING& p__Key, const OCTETSTRING& p__String){ + loggers::get_instance().log_msg(">>> fx__KeyDerivationFunction: p__KDF: ", p__KDF); + loggers::get_instance().log_msg(">>> fx__KeyDerivationFunction: p__Key: ", bit2oct(p__Key)); + loggers::get_instance().log_msg(">>> fx__KeyDerivationFunction: p__String: ", p__String); + + if (p__KDF == 1) { // tsc_KDF_HMAC_SHA_256 see CommonDefs.ttcn + hmac h; + OCTETSTRING res; + if (h.generate(p__String, bit2oct(p__Key), res, false) == -1) { + loggers::get_instance().error("fx__KeyDerivationFunction: Key derivation failed"); + return int2bit(0, 0); + } + + loggers::get_instance().log_msg("<<< fx__KeyDerivationFunction: res: ", res); + return oct2bit(res); + } else { + loggers::get_instance().error("fx__KeyDerivationFunction: Unsupported KDF: %d", p__KDF); + return int2bit(0, 0); + } + } + + /** + * @desc This external function compute the SHA 256 hash of a string + * @param p__String The string to hash + * @return The SHA 256 hash of the specified string + * @see fx_sha256(in octetstring p_String) return B256_Type + */ + BITSTRING fx__sha256(const OCTETSTRING& p__String){ + loggers::get_instance().log_msg(">>> fx__sha256: p__String: ", p__String); + + sha256 sha; + OCTETSTRING res; + if (sha.generate(p__String, res) == -1) { + loggers::get_instance().error("fx__sha256: Key derivation failed"); + return int2bit(0, 0); + } + + loggers::get_instance().log_msg("<<< fx__sha256: res: ", res); + return oct2bit(res); + } + + /** + * @desc This external function gets the current time since 01/01/1970 in UTC format + * @return The current time since 01/01/1970 in UTC format in milliseconds + * @see fx_getSystemTime() return UInt64 + */ + //INTEGER fx__GetSystemTime(CommonDefs::Struct__tm__Type&, INTEGER&){ + void fx__GetSystemTime(CommonDefs::Struct__tm__Type& p__Struct__tm, INTEGER& p__TimezoneInfo){ + const time_t t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + tm* now = std::localtime(&t); + p__Struct__tm = Struct__tm__Type(now->tm_sec, now->tm_min, now->tm_hour, now->tm_mday, now->tm_mon, now->tm_year, now->tm_wday, now->tm_yday, now->tm_isdst); + p__TimezoneInfo = 0; // TODO FSCOM + + return; + } + //void fx__CalculateFCS32(BITSTRING const&) { + BITSTRING fx__CalculateFCS32(const BITSTRING& p__TMSI){ + loggers::get_instance().log_msg(">>> fx__CalculateFCS32: p__TMSI: ", p__TMSI); + + // Sanity checks + if (p__TMSI.lengthof() == 0) { + loggers::get_instance().error("fx__CalculateFCS32: Empty TMSI"); + return int2bit(0, 0); + } + + OCTETSTRING os = bit2oct(p__TMSI); + const unsigned char *data = static_cast(os); + if (data == NULL) { + loggers::get_instance().error("fx__CalculateFCS32: Failed to get data buffer"); + return int2bit(0, 0); + } + unsigned int crc = 0xffffffff; + for (size_t i = 0; i < os.lengthof(); i++) { + unsigned int val = (crc ^ os[i].get_octet()) & 0xFF; + for(size_t j = 0; j < 8; j++){ + val = val & 0x1 ? (val >> 1) ^ 0xEDB88320 : val >> 1; // 0xEDB88320 is the reverse of 0x04C11DB7 + } // End of 'for' statement + crc = val ^ crc >> 8; + } // End of 'for' statement + crc ^= 0xffffffff; + + crc = ((crc & 0xFF) << 24) | ((crc & 0xFF00) << 8) | ((crc & 0xFF0000) >> 8) | ((crc & 0xFF000000) >> 24); // Reverse the bits of the CRC value + OCTETSTRING crc_os(4, (const unsigned char*)&crc); + loggers::get_instance().log_msg("fx__CalculateFCS32: crc: ", crc_os); + + return oct2bit(crc_os); + } + +} // namespace CommonDefs diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index b7f9e0e..a5961f3 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -10,9 +10,16 @@ LibNGAP_Pixits.PX_AMF_NAME := "Kontron5G-amf" LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 0 LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O +LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B -Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B -Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O +Lib_NG_NAS_Pixits.PX_LONG_TERM_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B +Lib_NG_NAS_Pixits.PX_PLMN := '000000'O; + + +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] # In this section you can specify the name of the log file and the classes of events @@ -59,30 +66,8 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # In this section you can specify what parts of your test suite you want to execute. #AtsImsIot_TestControl.control -#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_01 -#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_02 -#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_03 -#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_04 - -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_02 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_03 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_03 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_02 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_03 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_02 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_03 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01 - #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 -#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +###########################NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 @@ -104,6 +89,47 @@ NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DRG_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_DRG_REQ_03 + +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_01 +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_02 +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_03 +#NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_04 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_02_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_04_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_05_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_11 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_01 +#G_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 + [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the # [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. diff --git a/titan-test-system-framework b/titan-test-system-framework index 9ed59eb..f8843ac 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit 9ed59ebd3c0a769688262f2370f6d3c3507b2a5f +Subproject commit f8843ac9740f8efe537f4938918920c8e8f8e692 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 7fa779a..fca5346 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -64,7 +64,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -83,7 +83,7 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - '111'B, + '100'B, -, ?, // Authentication_parameter_RAND ? // Authentication_parameter_AUTN @@ -92,6 +92,9 @@ module NG_NAS_TCFunctions { ) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + } else { + setverdict(pass); + log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REQUEST ***"); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -111,10 +114,10 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -131,6 +134,9 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + } else { + setverdict(pass); + log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -152,7 +158,7 @@ module NG_NAS_TCFunctions { var integer v_start_time_ms; // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -214,7 +220,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -279,7 +285,7 @@ module NG_NAS_TCFunctions { var NAS_KsiValue ngKSI; // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); f_decode_5G_NAS_DL_Message(vc_recvNAS_PDU, v_NG_NAS_DL_Message_Type); @@ -343,7 +349,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -410,9 +416,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -453,10 +459,10 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -494,10 +500,10 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -543,9 +549,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_await_NGInitialContextSetupRequest_send_NGInitialContextSetupRespone(); f_send_NGUERadioCApabilityInfoIndication(); @@ -611,9 +617,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -726,9 +732,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -848,9 +854,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -971,9 +977,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1089,9 +1095,9 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthorizationRequest_send_NasAuthorizationResponse(); + f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1207,7 +1213,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1369,7 +1375,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1487,7 +1493,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1549,7 +1555,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1615,7 +1621,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); //USER REGISTRATION log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1669,7 +1675,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1751,7 +1757,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1819,7 +1825,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1842,7 +1848,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1865,7 +1871,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1888,7 +1894,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1911,7 +1917,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_NGAP_gnb_init(); + f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 1df3001..c8f0cb8 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -17,6 +17,11 @@ module NG_NAS_TestCases { // Lib3GPP import from CommonDefs all; + // Lib3GPP/NAS + import from NAS_CommonTypeDefs all; + import from NAS_AuthenticationCommon all; + // Lib3GPP/NG_NAS + import from NG_NAS_SecurityFunctions all; // Lib_NG_NAS import from Lib_NG_NAS_Interface all; @@ -850,7 +855,7 @@ module NG_NAS_TestCases { testcase TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 3.3 Test Set 1 - var O16_Type v_key := '465b5ce8 b199b49f aa5f0a2e e238a6bc'O; + var O16_Type v_key := '465b5ce8b199b49faa5f0a2ee238a6bc'O; var O16_Type v_plain_text := 'ee36f7cf037d37d3692f7f0399e7949a'O; var O16_Type v_cypher := '9e2980c59739da67b136355e3cede6a2'O; @@ -1338,9 +1343,9 @@ module NG_NAS_TestCases { var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table - var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987 b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table - var B128_Type v_ik := oct2bit('535bc878505c5e56ea44d2dffeb95fc4'O); // Integrity key + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key f_set_op(v_op); @@ -1353,7 +1358,7 @@ module NG_NAS_TestCases { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } else { - if (not(match(v_res_computed, v_res))) { + if (not(match(v_res_computed, v_xres))) { log("*** " & __SCOPE__ & ": ERROR: 'v_res_computed' did not return the expected value. ***"); setverdict(fail); } else { @@ -1365,6 +1370,44 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_01 + /** + * @desc Verify that the f2 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B64_Type v_xres := oct2bit('d3a628ed988620f0'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('58c433ff 7a7082ac d424220f 2b67c556'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('21a8c1f929702adb3e738488b9f5c5da'O); // Integrity key + var B48_Type v_ak := oct2bit('c47783995f72'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_res_computed, v_xres))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_res_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_res_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_06_02 + /** * @desc Verify that the f3 functions is working correctly * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework @@ -1376,7 +1419,7 @@ module NG_NAS_TestCases { var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key @@ -1403,6 +1446,44 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_01 + /** + * @desc Verify that the f3 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B64_Type v_xres := oct2bit('d3a628ed988620f0'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('58c433ff 7a7082ac d424220f 2b67c556'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('21a8c1f929702adb3e738488b9f5c5da'O); // Integrity key + var B48_Type v_ak := oct2bit('c47783995f72'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ck_computed, v_ck))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ck_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ck_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_07_02 + /** * @desc Verify that the f4 functions is working correctly * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework @@ -1414,7 +1495,7 @@ module NG_NAS_TestCases { var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key @@ -1441,6 +1522,44 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_01 + /** + * @desc Verify that the f4 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B64_Type v_xres := oct2bit('d3a628ed988620f0'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('58c433ff 7a7082ac d424220f 2b67c556'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('21a8c1f929702adb3e738488b9f5c5da'O); // Integrity key + var B48_Type v_ak := oct2bit('c47783995f72'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ik_computed, v_ik))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ik_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ik_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_08_02 + /** * @desc Verify that the f5 functions is working correctly * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework @@ -1452,7 +1571,7 @@ module NG_NAS_TestCases { var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var B64_Type v_res := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key @@ -1479,6 +1598,45 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_01 + /** + * @desc Verify that the f5 functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B64_Type v_xres := oct2bit('d3a628ed988620f0'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('58c433ff 7a7082ac d424220f 2b67c556'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('21a8c1f929702adb3e738488b9f5c5da'O); // Integrity key + var B48_Type v_ak := oct2bit('c47783995f72'O); // Anonymity key + + f_set_op(v_op); + var B64_Type v_res_computed; + var B128_Type v_ck_computed; + var B128_Type v_ik_computed; + var B48_Type v_ak_computed; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_res_computed, v_ck_computed, v_ik_computed, v_ak_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ak_computed, v_ak))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ak_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ak_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_02 + /** * @desc Verify that the f5* functions is working correctly * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework @@ -1488,12 +1646,12 @@ module NG_NAS_TestCases { // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.3 Test Set 1 var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key - var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var B48_Type v_ak_s := oct2bit('451e8beca43b'O); // Anonymity key for the re-synchronisation + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_ak_s := oct2bit('451e8beca43b'O); // Anonymity key for the re-synchronisation f_set_op(v_op); - var B48_Type v_ak_s_computed; + var B48_Type v_ak_s_computed; var integer v_result := f_f5star(oct2bit(v_K), v_rand, v_ak_s_computed); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f5star' returned an error code: " & int2str(v_result) & ". ***"); @@ -1511,6 +1669,714 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_01 - } // End of group fiveG_AKA_Crypto_Functions + /** + * @desc Verify that the f5* functions is working correctly + * @see ETSI TS 135 206 V16.0.0 (2020-08) Clause 4.1 Algorithm Framework + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.3 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.3 Test Set 1 + var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); + var O16_Type v_op := 'ff53bade17df5d4e793073ce9d7579fa'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_ak_s := oct2bit('30f1197061c1'O); // Anonymity key for the re-synchronisation + + f_set_op(v_op); + var B48_Type v_ak_s_computed; + var integer v_result := f_f5star(oct2bit(v_K), v_rand, v_ak_s_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f5star' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } else { + if (not(match(v_ak_s_computed, v_ak_s))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_ak_s_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_ak_s_computed' returned the expected value ***"); + } + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_10_02 + + /** + * @desc Verify that the KeyDerivationFunctions is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_11() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var B256_Type v_Ks := oct2bit('efa09b59f3995f1a4ec7e99816290253c01ce4d774b21e1e141379d59c665ee3'O); // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var octetstring v_S := '06D540050123456789000f00000002'O; + var B256_Type v_derived_key := oct2bit('0c01ec8210931fdaa57448583b69e8f0ce99db7560d07dd3719765d26bf4c12f'O); + + var B256_Type v_derived_key_computed := fx_KeyDerivationFunction(1, v_Ks, v_S); + if (not(match(v_derived_key_computed, v_derived_key))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_derived_key_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_derived_key_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_11 + + /** + * @desc Verify that the fl_GetServingNetworkName function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var octetstring v_P0 := fl_GetServingNetworkName(v_PLMN, v_NID); + log("v_P0 =", oct2char(v_P0)); + if (v_P0 != '35473A6D6E633030312E6D63633030312E336770706E6574776F726B2E6F72673A303030313338'O) { + log("*** " & __SCOPE__ & ": ERROR: 'fl_GetServingNetworkName' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fl_GetServingNetworkName' returned: " & oct2char(v_P0) & " ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_01 + + /** + * @desc Verify that the fl_GetServingNetworkName function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var NAS_PlmnId v_PLMN := '641010'O; // PLMN ID: 001-01 + var octetstring v_P0 := fl_GetServingNetworkName(v_PLMN); + log("v_P0 =", oct2char(v_P0)); + if (v_P0 != '35473a6d6e633031312e6d63633436302e336770706e6574776f726b2e6f7267'O) { + log("*** " & __SCOPE__ & ": ERROR: 'fl_GetServingNetworkName' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fl_GetServingNetworkName' returned: " & oct2char(v_P0) & " ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02 + + // 13: fl_GetNAI + + /** + * @desc Verify that the fx__CalculateFCS32 function is working correctly + * @see https://crccalc.com/?crc=aaaaaaaaaaaa5555555555550004deadbeef&method=CRC-32&datatype=hex&outtype=hex + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var bitstring v_crc := oct2bit('855D5CB0'O); + + var bitstring v_crc_computed := fx_CalculateFCS32(oct2bit('aaaaaaaaaaaa5555555555550004deadbeef'O)); + log(v_crc); + log(v_crc_computed); + if (not(match(v_crc_computed, v_crc))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_crc_computed' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_crc_computed' returned: ", bit2oct(v_crc_computed), " ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_01 + + /** + * @desc Verify that the fx__CalculateFCS32 function is working correctly + * @see https://crccalc.com/?crc=35473A6D6E633030312E6D63633030312E336770706E6574776F726B2E6F72673A303030313338&method=CRC-32&datatype=hex&outtype=hex + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var bitstring v_crc := oct2bit('C2FE72FD'O); + + var bitstring v_crc_computed := fx_CalculateFCS32(oct2bit('35473A6D6E633030312E6D63633030312E336770706E6574776F726B2E6F72673A303030313338'O)); + log(match(v_crc_computed, v_crc)); + if (not(match(v_crc_computed, v_crc))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_crc_computed' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_crc_computed' returned: ", bit2oct(v_crc_computed), " ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 + + /** + * @desc Verify that the KAUSF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var B48_Type v_sqn_ak := oct2bit('000102030405'O); // SQN: Sequence Number + var B16_Type v_amf := oct2bit('0000'O); // Dummy value + var B64_Type v_mac_a := oct2bit('0000000000000000'O); // Dummy value + var B128_Type v_ck := oct2bit('4a3b7c89acbd1234ef567890abcdef12'O); + var B128_Type v_ik := oct2bit('9f1e2345ac7890fab345678912345678'O); + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + + var Common_AuthenticationParams_Type v_auth_params; + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := oct2bit('69EC2C51E14725BCCB24562470C25BE38C45701DCEBB6EF38B48ACE1082FE3C0'O); + var B256_Type v_k_ausf_computed := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + if (not(match(v_k_ausf_computed, v_k_ausf))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_ausf_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_k_ausf_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01 + + /** + * @desc Verify that the CK' and IK' derivation function is working correctly + * @see ETSI TS 133 402 V16.0.0 (2020-08) A.2 Function for the derivation of CK’, IK’ from CK, IK + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.3 CK' and IK' derivation function + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var B48_Type v_sqn_ak := oct2bit('000102030405'O); // SQN: Sequence Number + var B16_Type v_amf := oct2bit('0000'O); // Dummy value + var B64_Type v_mac_a := oct2bit('0000000000000000'O); // Dummy value + var B128_Type v_ck := oct2bit('4a3b7c89acbd1234ef567890abcdef12'O); + var B128_Type v_ik := oct2bit('9f1e2345ac7890fab345678912345678'O); + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var B128_Type v_ck_p := oct2bit('23e5e46389721ca3a3abe4a0c9e60efd'O); + var B128_Type v_ik_p := oct2bit('fce88fcd5e9e293ba6adaa5934c3687c'O); + + var B256_Type v_derived_key := oct2bit('23e5e46389721ca3a3abe4a0c9e60efdfce88fcd5e9e293ba6adaa5934c3687c'O); + + var Common_AuthenticationParams_Type v_auth_params; + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_derived_key_computed := f_NG_Authentication_A3(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + if (not(match(v_derived_key_computed, v_derived_key))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_derived_key_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_derived_key_computed' returned the expected value: ", v_derived_key_computed, " ***"); + var B128_Type v_Ck_computed := substr (v_derived_key_computed, 0, 128); + log("*** " & __SCOPE__ & ": v_Ck_computed: ", v_Ck_computed, " ***"); + var B128_Type v_Ik_computed := substr (v_derived_key_computed, 128, 128); + log("*** " & __SCOPE__ & ": v_Ik_computed: ", v_Ik_computed, " ***"); + if (not(match(v_Ck_computed, v_ck_p))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_Ck_computed' did not return the expected value. ***"); + setverdict(fail); + } + if (not(match(v_Ik_computed, v_ik_p))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_Ik_computed' did not return the expected value. ***"); + setverdict(fail); + } + + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01 + + /** + * @desc Verify that the RES* and XRES* derivation functions are working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://www.eurecom.fr/publication/6408/download/comsys-publi-6408.pdf + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From https://www.eurecom.fr/publication/6408/download/comsys-publi-6408.pdf DATA 1 + var O16_Type v_K := '00112233445566778899aabbccddeeff'O; // The long-term key: Subscriber key + var O16_Type v_op := '000102030405060708090a0b0c0d0e0f'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('6a8959fb188c73308d679f7bc8313d65'O); + var B48_Type v_sqn_ak := oct2bit('97779b305686'O); + var NAS_PlmnId v_PLMN := '641010'O; // PLMN ID: 641-010 + + f_set_op(v_op); + + var B64_Type v_xres := oct2bit('6283ace5e894a0ad'O); + var B64_Type v_xres_computed; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres_computed, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + if (not(match(v_xres_computed, v_xres))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_xres_computed' did not return the expected value. ***"); + setverdict(fail); + } + + var B256_Type v_Ks := oct2bit('12757da1c0747d4a88b7d8b86446244b7f64a6ccf95b98b25e9a41f007037d86'O); + var B256_Type v_Ks_computed := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + if (not(match(v_Ks_computed, v_Ks))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_Ks_computed' did not return the expected value. ***"); + setverdict(fail); + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B64_Type v_RESstar := oct2bit('03f8627a00448408'O); + var B64_Type v_XRESstar := oct2bit('6f35398f7c56df32'O); + + var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks); + var B64_Type v_RESstar_computed := substr(v_res, 0, 64); + var B64_Type v_XRESstar_computed := substr(v_res, 64, 64); + if (not(match(v_RESstar_computed, v_RESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_RESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_RESstar_computed' returned the expected value ***"); + } + if (not(match(v_XRESstar_computed, v_XRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_XRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_XRESstar_computed' returned the expected value ***"); + } + + var octetstring v_S := '6b35473a6d6e633031312e6d63633436302e336770706e6574776f726b2e6f726700206a8959fb188c73308d679f7bc8313d6500106283ace5e894a0ad0008'O; + var B256_Type v_k_ausf := oct2bit('117cc3da749fb0b92c6fc4f4547a1e7af9499391028d80d75bfe88eb813ead4c'O); + var B256_Type v_k_ausf_computed := fx_KeyDerivationFunction(1, v_Ks, v_S); + if (not(match(v_k_ausf_computed, v_k_ausf))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_ausf_computed' did not return the expected value. ***"); + setverdict(fail); + } + var B256_Type v_k_ausf_A2 := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN); + log("v_k_ausf (f_NG_Authentication_A2): ", bit2oct(v_k_ausf_A2)); + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 + + /** + * @desc Verify that the RES* and XRES* derivation functions are working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B64_Type v_RESstar := oct2bit('03F8627A00448408'O); + var B64_Type v_XRESstar := oct2bit('6F35398F7C56DF32'O); + + var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_NID); + var B64_Type v_RESstar_computed := substr(v_res, 0, 64); + var B64_Type v_XRESstar_computed := substr(v_res, 64, 64); + log("v_RESstar_computed =", v_RESstar_computed); + log("v_XRESstar_computed =", v_XRESstar_computed); + if (not(match(v_RESstar_computed, v_RESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_RESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_RESstar_computed' returned the expected value ***"); + } + if (not(match(v_XRESstar_computed, v_XRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_XRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_XRESstar_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 + + /** + * @desc Verify that the RES* and XRES* derivation functions are working correctly with Kontron Wireshark captures + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From Kontron Wireshark captures: UI=001014444333000 + var O16_Type v_K := '00000000000000000000000000000000'O; // The long-term key: Subscriber key + var O16_Type v_op := '00000000000000000000000000000000'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('807df0fdd3ef28786d10f425df603f3b'O); + var B48_Type v_sqn_ak := oct2bit('b22bfb46d847'O); + var B16_Type v_amf := oct2bit('8000'O); // AMF: Authentication Management Field + var B64_Type v_mac_a := oct2bit('5cd041c2fc08f6da'O); + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + + f_set_op(v_op); + + var B64_Type v_mac_a_computed; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + if (not(match(v_mac_a_computed, v_mac_a))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B64_Type v_RESstar := oct2bit('a7c39d021cc80709'O); + var B64_Type v_XRESstar := oct2bit('60775ce133f05be3'O); + + var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks); + var B64_Type v_RESstar_computed := substr(v_res, 0, 64); + var B64_Type v_XRESstar_computed := substr(v_res, 64, 64); + log("v_RESstar_computed =", v_RESstar_computed); + log("v_XRESstar_computed =", v_XRESstar_computed); + if (not(match(v_RESstar_computed, v_RESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_RESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_RESstar_computed' returned the expected value ***"); + } + if (not(match(v_XRESstar_computed, v_XRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_XRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_XRESstar_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 + + /** + * @desc Verify that the HRES* and HXRES* derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.6 KSEAF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_NID); + var B64_Type v_RESstar := substr(v_res, 0, 64); + var B64_Type v_XRESstar := substr(v_res, 64, 64); + log("v_RESstar: ", bit2oct(v_RESstar)); + log("v_XRESstar: ", bit2oct(v_XRESstar)); + + // Using RES* + var B64_Type v_HRESstar := oct2bit('73DE4773A2C4222A'O); + var B64_Type v_HXRESstar := oct2bit('8E36B2B676510129'O); + var B128_Type v_hres := f_NG_Authentication_A5(v_rand, v_RESstar, tsc_KDF_HMAC_SHA_256, v_Ks); + var B64_Type v_HRESstar_computed := substr(v_hres, 0, 64); + var B64_Type v_HXRESstar_computed := substr(v_hres, 64, 64); + log("v_HRESstar_computed: ", bit2oct(v_HRESstar_computed)); + log("v_HXRESstar_computed: ", bit2oct(v_HXRESstar_computed)); + if (not(match(v_HRESstar_computed, v_HRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_HRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_HRESstar_computed' returned the expected value ***"); + } + if (not(match(v_HXRESstar_computed, v_HXRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_HXRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_HXRESstar_computed' returned the expected value ***"); + } + + var bitstring v_S := v_rand & v_HXRESstar; + var B256_Type v_sha256 := fx_sha256(bit2oct(v_S)); + log("v_sha256: ", bit2oct(v_sha256)); + log("High 128 bits (1): ", bit2oct(substr(v_sha256, 0, 128))); + log("Low 128 bits (1) : ", bit2oct(substr(v_sha256, 128, 128))); + + // Using XRES* + v_HRESstar := oct2bit('4DF167EA4AF5720C'O); + v_HXRESstar := oct2bit('66597478359DA9FA'O); + v_hres := f_NG_Authentication_A5(v_rand, v_XRESstar, tsc_KDF_HMAC_SHA_256, v_Ks); + v_HRESstar_computed := substr(v_hres, 0, 64); + v_HXRESstar_computed := substr(v_hres, 64, 64); + log("v_HRESstar_computed: ", bit2oct(v_HRESstar_computed)); + log("v_HXRESstar_computed: ", bit2oct(v_HXRESstar_computed)); + if (not(match(v_HRESstar_computed, v_HRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_HRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_HRESstar_computed' returned the expected value ***"); + } + if (not(match(v_HXRESstar_computed, v_HXRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_HXRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_HXRESstar_computed' returned the expected value ***"); + } + + v_S := v_rand & v_HXRESstar; + v_sha256 := fx_sha256(bit2oct(v_S)); + log("v_sha256: ", bit2oct(v_sha256)); + log("High 128 bits (2): ", bit2oct(substr(v_sha256, 0, 128))); + log("Low 128 bits (2) : ", bit2oct(substr(v_sha256, 128, 128))); + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 + + /** + * @desc Verify that the KSEAF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.6 KSEAF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + log("v_k_ausf: ", bit2oct(v_k_ausf)); + + var B256_Type v_k_seaf := oct2bit('B435F90FEA784700244C12804C53E087E0E2B90C8E9DDCE76EC4D3811FDEB901'O); + var B256_Type v_k_seaf_computed := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); + if (not(match(v_k_seaf_computed, v_k_seaf))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_seaf_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_k_seaf_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 + + /** + * @desc Verify that the KAMF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.7 KAMF derivation function + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + // var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + // var octetstring v_S := '06D540050123456789000f00000002'O; + // var B256_Type v_k_aus := fx_KeyDerivationFunction(1, v_Ks, v_S); + // var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_aus, tsc_KDF_HMAC_SHA_256, v_NID); + + // var charstring v_supi := "460110123456789"; + // var octetstring v_abba := '0000'O; // ETSI TS 133 501 V16.18.0 (2024-04) A.7.1 ABBA parameter values + // var B256_Type v_k_amf := int2bit(0, 256); // Expected KAMF value + // var B256_Type v_k_amf_computed := f_NG_Authentication_A7(v_supi, v_k_seaf, v_abba, tsc_KDF_HMAC_SHA_256); + // if (not(match(v_k_amf_computed, v_k_amf))) { + // log("*** " & __SCOPE__ & ": ERROR: 'v_k_amf_computed' did not return the expected value. ***"); + // setverdict(fail); + // } else { + // log("*** " & __SCOPE__ & ": 'v_k_amf_computed' returned the expected value ***"); + // } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 + + } // End of group fiveG_AKA_Crypto_Functions }// End of module NG_NAS_TestCases diff --git a/ttcn/Lib3GPP/Common/CommonDefs.ttcn b/ttcn/Lib3GPP/Common/CommonDefs.ttcn index 2a54ee4..64c4a92 100644 --- a/ttcn/Lib3GPP/Common/CommonDefs.ttcn +++ b/ttcn/Lib3GPP/Common/CommonDefs.ttcn @@ -1311,6 +1311,8 @@ module CommonDefs { SHA-256 encoding algorithm used as KEY Description Function @status APPROVED (LTE) */ + external function fx_sha256(octetstring p_String) return B256_Type; + external function fx_CalculateFCS32 (bitstring p_TMSI) return B32_Type; /* Cyclic Redundancy Check calculation according to ITU-T Recommendation V.42 of CRC-32 Algorithm @sic R5-172046 sic@ */ //---------------------------------------------------------------------------- diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn index 5a90d5b..9198e0e 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn @@ -234,14 +234,19 @@ module NG_NAS_SecurityFunctions { { var charstring v_MNC := ""; var hexstring v_PLMN_hexstring := oct2hex(p_NAS_PlmnId); + log("fl_Nas2SNN_MNC: p_NAS_PlmnId=", p_NAS_PlmnId); + log("fl_Nas2SNN_MNC: v_PLMN_hexstring=", v_PLMN_hexstring); if (v_PLMN_hexstring[2] == 'F'H) { v_MNC := "0"; } + log("fl_Nas2SNN_MNC: v_MNC (1)=", v_MNC); v_MNC := v_MNC & hex2str(v_PLMN_hexstring[5]) & hex2str(v_PLMN_hexstring[4]); + log("fl_Nas2SNN_MNC: v_MNC (2)=", v_MNC); if (v_PLMN_hexstring[2] != 'F'H) { // add last digit if not F v_MNC := v_MNC & hex2str(v_PLMN_hexstring[2]); } + log("fl_Nas2SNN_MNC: v_MNC (3)=", v_MNC); return v_MNC; } @@ -255,8 +260,14 @@ module NG_NAS_SecurityFunctions { { var charstring v_MCC; var hexstring v_PLMN_hexstring := oct2hex(p_NAS_PlmnId); + log("fl_Nas2SNN_MCC: p_NAS_PlmnId=", p_NAS_PlmnId); + log("fl_Nas2SNN_MCC: v_PLMN_hexstring=", v_PLMN_hexstring); + log("fl_Nas2SNN_MCC: v_PLMN_hexstring[1]=", v_PLMN_hexstring[1]); + log("fl_Nas2SNN_MCC: v_PLMN_hexstring[0]=", v_PLMN_hexstring[0]); + log("fl_Nas2SNN_MCC: v_PLMN_hexstring[3]=", v_PLMN_hexstring[3]); v_MCC := hex2str(v_PLMN_hexstring[1]) & hex2str(v_PLMN_hexstring[0]) & hex2str(v_PLMN_hexstring[3]); + log("fl_Nas2SNN_MCC: v_MCC=", v_MCC); return v_MCC; } @@ -313,18 +324,28 @@ module NG_NAS_SecurityFunctions { var octetstring v_S; var octetstring v_P0; + log(">>> f_NG_Authentication_A2: p_PLMN=", p_PLMN); + log(">>> f_NG_Authentication_A2: p_AuthParams=", p_AuthParams); + log(">>> f_NG_Authentication_A2: p_KDF=", p_KDF); + log(">>> f_NG_Authentication_A2: p_Ks=", bit2oct(p_Ks)); + // Generation of String v_S := const_S6A_FC; + log("f_NG_Authentication_A2 (1): v_S=", v_S); //FC = 0x6A v_P0 := fl_GetServingNetworkName(p_PLMN, p_NID); // @sic R5s220753 sic@ v_S := (v_S & v_P0); + log("f_NG_Authentication_A2 (2): v_S=", v_S); //P0 = serving network ID v_S := (v_S & int2oct(lengthof(v_P0), 2)) ; + log("f_NG_Authentication_A2 (3): v_S=", v_S); //L0 = length of serving network ID (i.e. 0x00 0x03) v_S := ( v_S & ( substr (( bit2oct ( p_AuthParams.AUTN )) , 0,6 ))); + log("f_NG_Authentication_A2 (4): v_S=", v_S); //P1 = SQN XOR AK // to have MSB 6 bytes which is SQN xor AK and truncated as SQN xor AK is first 6 bytes of AUTN v_S := ( v_S & '0006'O ); + log("f_NG_Authentication_A2 (5): v_S=", v_S); //L1 = length of SQN XOR AK (i.e. 0x00 0x06) return fx_KeyDerivationFunction( p_KDF, p_Ks, v_S ); } @@ -350,18 +371,28 @@ module NG_NAS_SecurityFunctions { var octetstring v_S; var octetstring v_P0; + log(">>> f_NG_Authentication_A3: p_PLMN=", p_PLMN); + log(">>> f_NG_Authentication_A3: p_AuthParams=", p_AuthParams); + log(">>> f_NG_Authentication_A3: p_KDF=", p_KDF); + log(">>> f_NG_Authentication_A3: p_Ks=", bit2oct(p_Ks)); + // Generation of String v_S := const_S20_FC; + log("f_NG_Authentication_A3 (1): v_S=", v_S); //FC = 0x20 v_P0 := fl_GetServingNetworkName(p_PLMN, p_NID); // @sic R5s220753 sic@ v_S := (v_S & v_P0); + log("f_NG_Authentication_A3 (2): v_S=", v_S); //P0 = serving network ID v_S := (v_S & int2oct(lengthof(v_P0), 2)) ; + log("f_NG_Authentication_A3 (3): v_S=", v_S); //L0 = length of serving network ID (i.e. 0x00 0x03) v_S := ( v_S & ( substr (( bit2oct ( p_AuthParams.AUTN )) , 0,6 ))); + log("f_NG_Authentication_A3 (4): v_S=", v_S); //P1 = SQN XOR AK // to have MSB 6 bytes which is SQN xor AK and truncated as SQN xor AK is first 6 bytes of AUTN v_S := ( v_S & '0006'O ); + log("f_NG_Authentication_A3 (5): v_S=", v_S); //L1 = length of SQN XOR AK (i.e. 0x00 0x06) return fx_KeyDerivationFunction( p_KDF, p_Ks, v_S ); } @@ -391,37 +422,33 @@ module NG_NAS_SecurityFunctions { log(">>> f_NG_Authentication_A4: p_PLMN=", p_PLMN); log(">>> f_NG_Authentication_A4: p_AuthParams=", p_AuthParams); log(">>> f_NG_Authentication_A4: p_KDF=", p_KDF); - log(">>> f_NG_Authentication_A4: p_Key=", p_Key); - + log(">>> f_NG_Authentication_A4: p_Key=", bit2oct(p_Key)); // Generation of String v_S := const_S6B_FC; //FC = 0x6B v_P0 := fl_GetServingNetworkName(p_PLMN, p_NID); // @sic R5s220753 sic@ - log("f_NG_Authentication_A4: v_P0=", v_P0); + log("f_NG_Authentication_A4 (1): v_P0=", v_P0); v_S := (v_S & v_P0); - log("f_NG_Authentication_A4: v_S=", v_S); + log("f_NG_Authentication_A4 (2): v_S=", v_S); //P0 = serving network ID v_S := (v_S & int2oct(lengthof(v_P0), 2)) ; - log("f_NG_Authentication_A4: v_S=", v_S); + log("f_NG_Authentication_A4 (3): v_S=", v_S); //L0 = length of serving network ID v_S := ( v_S & bit2oct ( p_AuthParams.RandValue ) ); - log("f_NG_Authentication_A4: v_S=", v_S); + log("f_NG_Authentication_A4 (4): v_S=", v_S); //P1 = RAND v_S := ( v_S & '0010'O ); //L1 = length of RAND (i.e. 0x00 0x10) - log("f_NG_Authentication_A4: v_S=", v_S); + log("f_NG_Authentication_A4 (5): v_S=", v_S); v_S := ( v_S & bit2oct (substr(p_AuthParams.XRES, 0, px_NAS_5GC_XRES_Length*8))); // @sic R5s190394 sic@ - log("f_NG_Authentication_A4: v_S=", v_S); + log("f_NG_Authentication_A4 (6): v_S=", v_S); //P2 = RES or XRES v_S := ( v_S & int2oct(px_NAS_5GC_XRES_Length, 2) ); // @sic R5w190117 sic@ - log("f_NG_Authentication_A4: v_S=", v_S); + log("f_NG_Authentication_A4 (7): v_S=", v_S); //L2 = length of RES/XRES (e.g. 0x00 0x10) - var bitstring bs := fx_KeyDerivationFunction(p_KDF, p_Key, v_S); // Already 128 bits length - - return bs; - //return substr(fx_KeyDerivationFunction(p_KDF, p_Key, v_S), 128, 128); + return substr(fx_KeyDerivationFunction(p_KDF, p_Key, v_S), 128, 128); // returns LSB 128 bits[truncated] of the key generated } @@ -439,19 +466,26 @@ module NG_NAS_SecurityFunctions { function f_NG_Authentication_A6(NAS_PlmnId p_PLMN, B256_Type p_KAUSF, KDF_Type p_KDF_Type, - template (omit) hexstring p_NID := omit) return B256_Type + template (omit) hexstring p_NID := omit) return B256_Type { const octetstring const_S6C_FC :='6C'O; var octetstring v_S; var octetstring v_P0; + log(">>> f_NG_Authentication_A6: p_PLMN=", p_PLMN); + log(">>> f_NG_Authentication_A6: p_KAUSF=", bit2oct(p_KAUSF)); + log(">>> f_NG_Authentication_A6: p_KDF_Type=", p_KDF_Type); + // Generation of String v_S := const_S6C_FC; + log("f_NG_Authentication_A6 (1): v_S=", v_S); //FC = 0x6C v_P0 := fl_GetServingNetworkName(p_PLMN, p_NID); // @sic R5s220753 sic@ v_S := (v_S & v_P0); + log("f_NG_Authentication_A6 (2): v_S=", v_S); //P0 = serving network ID v_S := (v_S & int2oct(lengthof(v_P0), 2)) ; + log("f_NG_Authentication_A6 (3): v_S=", v_S); //L0 = length of serving network ID return fx_KeyDerivationFunction(p_KDF_Type, p_KAUSF, v_S); diff --git a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn index 9aa459f..a4b727f 100644 --- a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn @@ -140,16 +140,16 @@ module LIB_NG_NAS_Functions { } /** - * @desc Function to await NAS AuthorizationRequest message and send AuthorizationResponse message with security computation for future encryption + * @desc Function to await NAS AuthenticationRequest message and send AuthenticationResponse message with security computation for future encryption */ - function f_await_NasAuthorizationRequest_send_NasAuthorizationResponse() runs on NGNASComponent { - // Await request for authorization + function f_await_NasAuthenticationRequest_send_NasAuthenticationResponse() runs on NGNASComponent { + // Await request for authentication f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, - ? // AuthorizationRequest + ? // AuthenticationRequest ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; @@ -167,7 +167,10 @@ module LIB_NG_NAS_Functions { return; } // Compute RES/XRES - f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type); + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } // Send response vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } @@ -561,9 +564,9 @@ module LIB_NG_NAS_Functions { var B48_Type v_sqn_ak := f_extract_sqn_ak_from_autn(p_autn); var B16_Type v_amf := f_extract_amf_from_autn(p_autn); var B64_Type v_mac := f_extract_mac_from_autn(p_autn); - log("f_5g_aka_compute_res_xres: v_sqn_ak=", v_sqn_ak); - log("f_5g_aka_compute_res_xres: v_amf=", v_amf); - log("f_5g_aka_compute_res_xres: v_mac=", v_mac); + log("f_5g_aka_compute_res_xres: v_sqn_ak=", bit2oct(v_sqn_ak)); + log("f_5g_aka_compute_res_xres: v_amf=", bit2oct(v_amf)); + log("f_5g_aka_compute_res_xres: v_mac=", bit2oct(v_mac)); // Set OP f_set_op(PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION); @@ -573,17 +576,17 @@ module LIB_NG_NAS_Functions { var B48_Type v_ak; var B64_Type v_res; if (f_f2345(PX_LONG_TERM_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { - log("f_f2345 failed: "); + log("f_f2345 failed"); return false; } p_ng_nas_security_params_type.AuthParams.CK := v_ck; - log("f_5g_aka_compute_res_xres: CK=", p_ng_nas_security_params_type.AuthParams.CK); + log("f_5g_aka_compute_res_xres: CK=", bit2oct(p_ng_nas_security_params_type.AuthParams.CK)); p_ng_nas_security_params_type.AuthParams.IK := v_ik; - log("f_5g_aka_compute_res_xres: IK=", p_ng_nas_security_params_type.AuthParams.IK); + log("f_5g_aka_compute_res_xres: IK=", bit2oct(p_ng_nas_security_params_type.AuthParams.IK)); p_ng_nas_security_params_type.Ks := p_ng_nas_security_params_type.AuthParams.CK & p_ng_nas_security_params_type.AuthParams.IK; - log("f_5g_aka_compute_res_xres: Ks=", p_ng_nas_security_params_type.Ks); + log("f_5g_aka_compute_res_xres: Ks=", bit2oct(p_ng_nas_security_params_type.Ks)); var B48_Type v_sqn := v_sqn_ak xor4b v_ak; - log("f_5g_aka_compute_res_xres: v_sqn=", v_sqn); + log("f_5g_aka_compute_res_xres: v_sqn=", bit2oct(v_sqn)); // Verify that MAC was accepted var B64_Type v_mac_p; @@ -591,7 +594,7 @@ module LIB_NG_NAS_Functions { log("f_f1 failed: "); return false; } - log("f_5g_aka_compute_res_xres: v_mac_p=", v_mac_p); + log("f_5g_aka_compute_res_xres: v_mac_p=", bit2oct(v_mac_p)); if (v_mac != v_mac_p) { log("v_mac != v_mac_p"); return false; @@ -639,6 +642,55 @@ module LIB_NG_NAS_Functions { + + //-------------------------------------------------------------------------- + /* + * @desc HRES* and HXRES* derivation function + * As per annex A.5 of 33.501 + * @param p_AuthParams + * @param p_KAUSF + * @param p_KDF_Type + * @param p_NID (default value: omit) + * @return B256_Type + */ + function f_NG_Authentication_A5( + in B128_Type p_RAND, + in B64_Type p_XRESstar, + KDF_Type p_KDF_Type, + B256_Type p_Key + ) return B128_Type + { + const octetstring const_S6C_FC :='6C'O; + var octetstring v_S; + var octetstring v_P0; + var octetstring v_P1; + + log(">>> f_NG_Authentication_A5: p_RAND=", bit2oct(p_RAND)); + log(">>> f_NG_Authentication_A5: p_XRESstar=", bit2oct(p_XRESstar)); + log(">>> f_NG_Authentication_A5: p_KDF=", p_KDF_Type); + log(">>> f_NG_Authentication_A5: p_Key=", bit2oct(p_Key)); + + v_S := bit2oct(p_RAND) & bit2oct(p_XRESstar); + log("f_NG_Authentication_A5: v_S=", v_S); + + //return substr(fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S), 128, 128); + return substr(fx_sha256(v_S), 128, 128); + }; + + + + + + + + + + + + + + + function f_extract_sqn_ak_from_autn(in B128_Type p_autn) return B48_Type { return substr(p_autn, 0, 48); } -- GitLab From d1eeee77e84786c6b1004e83f2003e6e4fc05c62 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 20 Aug 2025 10:49:11 +0200 Subject: [PATCH 004/151] Finalyse TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 --- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 4 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 134 ++++++++++++++------------ 2 files changed, 76 insertions(+), 62 deletions(-) diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index a5961f3..12c2011 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -123,10 +123,10 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #G_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index c8f0cb8..c5af3f0 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -1495,7 +1495,7 @@ module NG_NAS_TestCases { var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key @@ -1605,7 +1605,6 @@ module NG_NAS_TestCases { */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_09_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { - // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 2 var O16_Type v_K := '0396eb317b6d1c36f19c1c84cd6ffd16'O; // The long-term key: Subscriber key var B128_Type v_rand := oct2bit('c00d603103dcee52c4478119494202e8'O); @@ -1713,7 +1712,7 @@ module NG_NAS_TestCases { var B256_Type v_derived_key := oct2bit('0c01ec8210931fdaa57448583b69e8f0ce99db7560d07dd3719765d26bf4c12f'O); var B256_Type v_derived_key_computed := fx_KeyDerivationFunction(1, v_Ks, v_S); - if (not(match(v_derived_key_computed, v_derived_key))) { + if (not(match(v_derived_key_computed, v_derived_key))) { // Verified by https://cryptii.com/pipes/hmac log("*** " & __SCOPE__ & ": ERROR: 'v_derived_key_computed' did not return the expected value. ***"); setverdict(fail); } else { @@ -1819,21 +1818,28 @@ module NG_NAS_TestCases { testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 - var B48_Type v_sqn_ak := oct2bit('000102030405'O); // SQN: Sequence Number - var B16_Type v_amf := oct2bit('0000'O); // Dummy value - var B64_Type v_mac_a := oct2bit('0000000000000000'O); // Dummy value - var B128_Type v_ck := oct2bit('4a3b7c89acbd1234ef567890abcdef12'O); - var B128_Type v_ik := oct2bit('9f1e2345ac7890fab345678912345678'O); - var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 - var hexstring v_NID := '000138'H; // NID: Network Identifier - - var Common_AuthenticationParams_Type v_auth_params; - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); // SQN: Sequence Number + var B16_Type v_amf := oct2bit('b9b9'O); + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key + var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key + var B64_Type v_mac_a := oct2bit('9cabc3e99baf7281'O); // MAC-A: Network authentication code + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + + f_set_op(v_op); + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK - var B256_Type v_k_ausf := oct2bit('69EC2C51E14725BCCB24562470C25BE38C45701DCEBB6EF38B48ACE1082FE3C0'O); + var B256_Type v_k_ausf := oct2bit('F42CFB5BCF426A3715BB5412E16F1177DB0EECF1EC2A21AE9826E941CA2B23EC'O); var B256_Type v_k_ausf_computed := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); if (not(match(v_k_ausf_computed, v_k_ausf))) { log("*** " & __SCOPE__ & ": ERROR: 'v_k_ausf_computed' did not return the expected value. ***"); @@ -1856,20 +1862,27 @@ module NG_NAS_TestCases { testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 - var B48_Type v_sqn_ak := oct2bit('000102030405'O); // SQN: Sequence Number - var B16_Type v_amf := oct2bit('0000'O); // Dummy value - var B64_Type v_mac_a := oct2bit('0000000000000000'O); // Dummy value - var B128_Type v_ck := oct2bit('4a3b7c89acbd1234ef567890abcdef12'O); - var B128_Type v_ik := oct2bit('9f1e2345ac7890fab345678912345678'O); - var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 - var hexstring v_NID := '000138'H; // NID: Network Identifier - var B128_Type v_ck_p := oct2bit('23e5e46389721ca3a3abe4a0c9e60efd'O); - var B128_Type v_ik_p := oct2bit('fce88fcd5e9e293ba6adaa5934c3687c'O); + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); // SQN: Sequence Number + var B16_Type v_amf := oct2bit('b9b9'O); + var B64_Type v_xres := oct2bit('a54211d5e3ba50bf'O); // Response. f2/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ck := oct2bit('b40ba9a3c58b2a05bbf0d987b21bf8cb'O); // Confidentiality key. f3/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 table + var B128_Type v_ik := oct2bit('f769bcd751044604127672711c6d3441'O); // Integrity key + var B48_Type v_ak := oct2bit('aa689c648370'O); // Anonymity key + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var B128_Type v_ck_p := oct2bit('8b9be2d9e808246a2f3ad44094c374fe'O); + var B128_Type v_ik_p := oct2bit('154fad1c3c57a85cbdbbcf7db7549f03'O); + var B64_Type v_mac_a := oct2bit('0000000000000000'O); // Dummy value - var B256_Type v_derived_key := oct2bit('23e5e46389721ca3a3abe4a0c9e60efdfce88fcd5e9e293ba6adaa5934c3687c'O); + f_set_op(v_op); + + var B256_Type v_derived_key := oct2bit('8B9BE2D9E808246A2F3AD44094C374FE154FAD1C3C57A85CBDBBCF7DB7549F03'O); - var Common_AuthenticationParams_Type v_auth_params; - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; @@ -1909,11 +1922,11 @@ module NG_NAS_TestCases { testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { // From https://www.eurecom.fr/publication/6408/download/comsys-publi-6408.pdf DATA 1 - var O16_Type v_K := '00112233445566778899aabbccddeeff'O; // The long-term key: Subscriber key - var O16_Type v_op := '000102030405060708090a0b0c0d0e0f'O; // Operator Variant Algorithm Configuration Field - var B128_Type v_rand := oct2bit('6a8959fb188c73308d679f7bc8313d65'O); - var B48_Type v_sqn_ak := oct2bit('97779b305686'O); - var NAS_PlmnId v_PLMN := '641010'O; // PLMN ID: 641-010 + var O16_Type v_K := '00112233445566778899aabbccddeeff'O; // The long-term key: Subscriber key + var O16_Type v_op := '000102030405060708090a0b0c0d0e0f'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('6a8959fb188c73308d679f7bc8313d65'O); + var B48_Type v_sqn_ak := oct2bit('97779b305686'O); + var NAS_PlmnId v_PLMN := '641010'O; // PLMN ID: 641-010 f_set_op(v_op); @@ -2023,7 +2036,7 @@ module NG_NAS_TestCases { } var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; v_auth_params.XRES := v_xres; @@ -2098,7 +2111,7 @@ module NG_NAS_TestCases { } var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; v_auth_params.XRES := v_xres; @@ -2175,7 +2188,7 @@ module NG_NAS_TestCases { var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; v_auth_params.XRES := v_xres; @@ -2292,7 +2305,7 @@ module NG_NAS_TestCases { var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; v_auth_params.XRES := v_xres; @@ -2322,7 +2335,7 @@ module NG_NAS_TestCases { */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { - // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.3 Test Set 1 + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field @@ -2330,7 +2343,8 @@ module NG_NAS_TestCases { var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 var hexstring v_NID := '000138'H; // NID: Network Identifier - + var charstring v_supi := "001014444333000"; + f_set_op(v_op); var B64_Type v_mac_a; @@ -2340,13 +2354,7 @@ module NG_NAS_TestCases { setverdict(fail); stop; } - var B64_Type v_mac_s; - v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } + var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; @@ -2355,23 +2363,29 @@ module NG_NAS_TestCases { if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); - stop; } - // var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK - // var octetstring v_S := '06D540050123456789000f00000002'O; - // var B256_Type v_k_aus := fx_KeyDerivationFunction(1, v_Ks, v_S); - // var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_aus, tsc_KDF_HMAC_SHA_256, v_NID); - - // var charstring v_supi := "460110123456789"; - // var octetstring v_abba := '0000'O; // ETSI TS 133 501 V16.18.0 (2024-04) A.7.1 ABBA parameter values - // var B256_Type v_k_amf := int2bit(0, 256); // Expected KAMF value - // var B256_Type v_k_amf_computed := f_NG_Authentication_A7(v_supi, v_k_seaf, v_abba, tsc_KDF_HMAC_SHA_256); - // if (not(match(v_k_amf_computed, v_k_amf))) { - // log("*** " & __SCOPE__ & ": ERROR: 'v_k_amf_computed' did not return the expected value. ***"); - // setverdict(fail); - // } else { - // log("*** " & __SCOPE__ & ": 'v_k_amf_computed' returned the expected value ***"); - // } + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + + var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); + + var B256_Type v_k_amf := oct2bit('9379A99B1ED68C2F0643EBA74692E617563A21CDA85C5619D8686CF661FC8995'O); // KAMF: Authentication Management Field Key + var B256_Type v_k_amf_computed := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) + if (not(match(v_k_amf_computed, v_k_amf))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_amf_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_k_amf_computed' returned the expected value ***"); + } + setverdict(pass) -- GitLab From 2f44ab13e8cb350d993ff3db260e317e9641ead2 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 22 Aug 2025 07:36:15 +0200 Subject: [PATCH 005/151] Add cfg file etc/Ats_NG_NAS/AtsNGAP_GNB.cfg_ --- etc/Ats_NG_NAS/AtsNGAP_GNB.cfg_ | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 etc/Ats_NG_NAS/AtsNGAP_GNB.cfg_ diff --git a/etc/Ats_NG_NAS/AtsNGAP_GNB.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_GNB.cfg_ new file mode 100644 index 0000000..7f8b8a2 --- /dev/null +++ b/etc/Ats_NG_NAS/AtsNGAP_GNB.cfg_ @@ -0,0 +1,64 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +NAS_Pics.PICS_NAS_GNB_IUT := true +NAS_Pics.PICS_NAS_AMF_IUT := false + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/Ats_NG_NAS/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. +system.NGAP_gNB_1.params := "NAS/NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/5g_reg.pcapng)" +system.N2_gNBaMF_P.params := "NAS/NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/5g_reg.pcapng)" +#aMFNASComponent.N2_gNBaMF_P.params := "NAS/SCTP_FILE/IP_FILE/ETH/PCAP_FILE(file=../captures/free5gc.pcap)" + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 -- GitLab From 5751263675c5752d841c013503897b07939a07cc Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 2 Sep 2025 10:30:28 +0200 Subject: [PATCH 006/151] Add NASKenc/NASKint test cases --- ccsrc/Externals/NG_security_ext.cc | 1 - etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 6 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 269 +++++++++++++++++- .../EUTRA_NR_SecurityFunctions.ttcn | 5 + .../NG_NAS/NG_NAS_SecurityFunctions.ttcn | 18 ++ 5 files changed, 296 insertions(+), 3 deletions(-) diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index db85ed3..44e82a3 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -11,7 +11,6 @@ #include "base_time.hh" //#include "converter.hh" #include "loggers.hh" -//#include "xml_converters.hh" //namespace NG__SecurityDefinitionsAndExternalFunctions { diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 12c2011..bebf49f 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -125,10 +125,14 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 +########NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index c5af3f0..3291c4a 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -17,12 +17,17 @@ module NG_NAS_TestCases { // Lib3GPP import from CommonDefs all; + // Lib3GPP/NAS import from NAS_CommonTypeDefs all; import from NAS_AuthenticationCommon all; + // Lib3GPP/NG_NAS import from NG_NAS_SecurityFunctions all; + // Lib3GPP/Common4G5G + import from EUTRA_NR_SecurityFunctions all; + // Lib_NG_NAS import from Lib_NG_NAS_Interface all; import from LIB_NG_NAS_Functions all; @@ -2343,7 +2348,7 @@ module NG_NAS_TestCases { var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 var hexstring v_NID := '000138'H; // NID: Network Identifier - var charstring v_supi := "001014444333000"; + var charstring v_supi := "001014444333000"; f_set_op(v_op); @@ -2391,6 +2396,268 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 + /** + * @desc Verify that the KAMF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Clause 5.11.1.1 Ciphering algorithm identifier values + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.8 Algorithm key derivation functions + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var charstring v_supi := "001014444333000"; + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); + var B256_Type v_k_amf := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) + + var B128_Type v_k_nas_enc := oct2bit('38254CAFDE124D5156041D8B640CD341'O); // KNASenc: NAS Cyphering Key + var B128_Type v_k_nas_enc_computed := f_NG_Authentication_A8(tsc_NAS_Enc_Alg, + '0010'B, //128-NEA2 128-bit AES based algorithm + v_k_amf, + tsc_KDF_HMAC_SHA_256) + if (not(match(v_k_nas_enc_computed, v_k_nas_enc))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_nas_enc_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_k_nas_enc_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 + + /** + * @desc Verify that the KAMF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Clause 5.11.1.1 Ciphering algorithm identifier values + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.8 Algorithm key derivation functions + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var charstring v_supi := "001014444333000"; + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); + var B256_Type v_k_amf := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) + + var B128_Type v_k_nas_enc := oct2bit('94F7B2EC0D79F26D593C352328A92281'O); // KNASenc: NAS Cyphering Key + var B128_Type v_k_nas_enc_computed := f_NG_Authentication_A8(tsc_NAS_Int_Alg, + '0010'B, //128-NEA2 128-bit AES based algorithm + v_k_amf, + tsc_KDF_HMAC_SHA_256) + if (not(match(v_k_nas_enc_computed, v_k_nas_enc))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_nas_enc_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_k_nas_enc_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 + + /** + * @desc Verify that the KAMF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.17 SoR-MAC-IAUSF generation function + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var charstring v_supi := "001014444333000"; + var O1_Type v_sor_header := '00'O; // FIXME Not sure about this value + var O2_Type v_counter_sor := '0000'O; // FIXME Not sure about this value + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + + var B128_Type v_sor_mac_i_ausf := oct2bit('14FAA726B4F25EBFC0CC58877B42CDC8'O); // SoR-MAC-Iausf + var B128_Type v_sor_mac_i_ausf_computed := f_NG_Authentication_A17(v_sor_header, v_k_ausf, v_counter_sor, -, tsc_KDF_HMAC_SHA_256) + if (not(match(v_sor_mac_i_ausf_computed, v_sor_mac_i_ausf))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_sor_mac_i_ausf_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_sor_mac_i_ausf_computed' returned the expected value ***"); + } + + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 + + /** + * @desc Verify that the KAMF derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) A.18 SoR-MAC-IUE generation function + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var charstring v_supi := "001014444333000"; + var O2_Type v_counter := '0000'O; // FIXME Not sure about this value + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + + var B128_Type v_so_r_mac_iue := oct2bit('F38A33C13CF17CFDA4FCA7BDBEDB760A'O); // SoR-MAC-Iue + var B128_Type v_so_r_mac_iue_computed := f_NG_Authentication_A18(v_k_ausf, v_counter, tsc_KDF_HMAC_SHA_256) + log("v_so_r_mac_iue_computed=", v_so_r_mac_iue_computed); + if (not(match(v_so_r_mac_iue_computed, v_so_r_mac_iue))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_so_r_mac_iue_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_so_r_mac_iue_computed' returned the expected value ***"); + } + + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 + } // End of group fiveG_AKA_Crypto_Functions }// End of module NG_NAS_TestCases diff --git a/ttcn/Lib3GPP/Common4G5G/EUTRA_NR_SecurityFunctions.ttcn b/ttcn/Lib3GPP/Common4G5G/EUTRA_NR_SecurityFunctions.ttcn index fb87157..b43a57f 100644 --- a/ttcn/Lib3GPP/Common4G5G/EUTRA_NR_SecurityFunctions.ttcn +++ b/ttcn/Lib3GPP/Common4G5G/EUTRA_NR_SecurityFunctions.ttcn @@ -153,14 +153,19 @@ module EUTRA_NR_SecurityFunctions { var octetstring v_S; // Generation of String v_S := const_S69_FC; + log("f_NG_Authentication_A8 (1): v_S=", v_S); //FC = 0x69 v_S := ( v_S & int2oct ( p_AlgTypeDistg, 1 ) ); + log("f_NG_Authentication_A8 (2): v_S=", v_S); //P0 = algorithm type distinguisher v_S := ( v_S & '0001'O ); + log("f_NG_Authentication_A8 (3): v_S=", v_S); //L0 = length of algorithm type distinguisher (i.e. 0x00 0x01)) v_S := ( v_S & bit2oct ( p_Alg ) ); + log("f_NG_Authentication_A8 (4): v_S=", v_S); //P1 = algorithm identity v_S := ( v_S & '0001'O ); + log("f_NG_Authentication_A8 (5): v_S=", v_S); //L1 = length of algorithm identity (i.e. 0x00 0x01) return substr(fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S), 128, 128); diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn index 9198e0e..d48da5d 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn @@ -514,14 +514,19 @@ module NG_NAS_SecurityFunctions { // Generation of String v_S := const_S6D_FC; + log("f_NG_Authentication_A7 (1): v_S=", v_S); //FC = 0x6D v_S := (v_S & v_P0); + log("f_NG_Authentication_A7 (2): v_S=", v_S); //P0 = serving network ID v_S := (v_S & int2oct(lengthof(v_P0), 2)) ; + log("f_NG_Authentication_A7 (3): v_S=", v_S); //L0 = length of SUPI v_S := (v_S & v_P1); + log("f_NG_Authentication_A7 (4): v_S=", v_S); //P0 = serving network ID v_S := (v_S & int2oct(lengthof(v_P1), 2)) ; + log("f_NG_Authentication_A7 (5): v_S=", v_S); //L1 = length of ABBA return fx_KeyDerivationFunction(p_KDF_Type, p_KSEAF, v_S); @@ -550,19 +555,27 @@ module NG_NAS_SecurityFunctions { // Generation of String v_S := const_S77_FC; + log("f_NG_Authentication_A17 (1): v_S=", v_S); //FC = 0x77 v_S := (v_S & p_SoRHeader); + log("f_NG_Authentication_A17 (2): v_S=", v_S); //P0 = SOR Header v_S := (v_S & '0001'O); + log("f_NG_Authentication_A17 (3): v_S=", v_S); //L0 = length of SOR Header v_S := (v_S & p_Counter); + log("f_NG_Authentication_A17 (4): v_S=", v_S); //P1 = Counter v_S := (v_S & '0002'O) ; + log("f_NG_Authentication_A17 (5): v_S=", v_S); //L1 = length of Counter if (lengthof (p_PLMNandAccessTechnologyList) > 0) { //P2 & L2 are optional v_S := (v_S & p_PLMNandAccessTechnologyList); + log("f_NG_Authentication_A17 (6-1): v_S=", v_S); v_S := (v_S & int2oct(lengthof(p_PLMNandAccessTechnologyList), 2)) ; + log("f_NG_Authentication_A17 (6-2): v_S=", v_S); } + log("f_NG_Authentication_A17 (7): v_S=", v_S); return substr(fx_KeyDerivationFunction(p_KDF_Type, p_KAUSF, v_S), 128, 128); // returns LSB 128 bits[truncated] of the key generated } @@ -586,14 +599,19 @@ module NG_NAS_SecurityFunctions { // Generation of String v_S := const_S78_FC; + log("f_NG_Authentication_A18 (1): v_S=", v_S); //FC = 0x78 v_S := (v_S & '01'O); + log("f_NG_Authentication_A18 (2): v_S=", v_S); //P0 = SOR Ack v_S := (v_S & '0001'O); + log("f_NG_Authentication_A18 (3): v_S=", v_S); //L0 = length of SOR Ack v_S := (v_S & p_Counter); + log("f_NG_Authentication_A18 (4): v_S=", v_S); //P1 = Counter v_S := (v_S & '0002'O) ; + log("f_NG_Authentication_A18 (5): v_S=", v_S); //L1 = length of Counter return substr(fx_KeyDerivationFunction(p_KDF_Type, p_KAUSF, v_S), 128, 128); -- GitLab From dbd690a74afff416e9ad0ded5c88b3505763a7a7 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 4 Sep 2025 08:59:36 +0200 Subject: [PATCH 007/151] =?UTF-8?q?Review=20verdict;=20Starting=20NAS=20?= =?UTF-8?q?=C3=AFntegrity=20&=20ciphering=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NAS_ETSI.code-workspace | 6 + ccsrc/Externals/NG_security_ext.cc | 171 +++++++++++++----- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 10 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 132 ++++++++++---- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 166 +++++++++++++---- ...curityDefinitionsAndExternalFunctions.ttcn | 34 ++-- ttcn/Lib3GPP/NasEmulation/module.mk | 5 +- ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn | 33 +++- ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn | 2 + ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn | 2 +- 10 files changed, 420 insertions(+), 141 deletions(-) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index c1c0e96..c1b2adb 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -17,6 +17,12 @@ }, { "path": "../free5gc.util" + }, + { + "path": "../5G_ciphered_NAS_decipher_tool" + }, + { + "path": "../../frameworks/CryptoMobile/CryptoMobile" } ], "settings": { diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index 44e82a3..a577eb1 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -1,44 +1,127 @@ -#include -#include -#include -#include - -//#include "NG_SecurityDefinitionsAndExternalFunctions.hh" -#include "NG_NAS_SecurityFunctions.hh" -//#include "NR_RRC_ASN1_Definitions.hh" -#include "CommonDefs.hh" - -#include "base_time.hh" -//#include "converter.hh" -#include "loggers.hh" - - -//namespace NG__SecurityDefinitionsAndExternalFunctions { -namespace NG__NAS__SecurityFunctions { - - /** - * @desc This external function ... - * @return The ... - * @see fx_get...() return ... - */ - -//BITSTRING fx__NR__AsIntegrityAlgorithm(const OCTETSTRING &a, const NR__RRC__ASN1__Definitions::IntegrityProtAlgorithm& b, const BITSTRING &c, const OCTETSTRING &d, const BITSTRING &e, const INTEGER &f){ -//return int2bit(0, 0); -//} - -OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_EncodedNasPdu, const BITSTRING& p_IntegrityAlgorithm, const BITSTRING& p_KNASint, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ -return int2oct(0, 0); -} - -OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId){ -return int2oct(0, 0); -} - -OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId){ -return int2oct(0, 0); -} - - - -} // namespace NG__NAS__SecurityFunctions - // namespace NG__SecurityDefinitionsAndExternalFunctions +#include +#include +#include +#include + +#include +#include + +//#include "NG_SecurityDefinitionsAndExternalFunctions.hh" +#include "NG_NAS_SecurityFunctions.hh" +//#include "NR_RRC_ASN1_Definitions.hh" +#include "CommonDefs.hh" + +#include "base_time.hh" +//#include "converter.hh" +#include "loggers.hh" + + +namespace NG__SecurityDefinitionsAndExternalFunctions { + + /** + * @desc This external function ... + * @return The ... + * @see fx_get...() return ... + */ + +//BITSTRING fx__NR__AsIntegrityAlgorithm(const OCTETSTRING &a, const NR__RRC__ASN1__Definitions::IntegrityProtAlgorithm& b, const BITSTRING &c, const OCTETSTRING &d, const BITSTRING &e, const INTEGER &f){ +//return int2bit(0, 0); +//} +OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_EncodedNasPdu, const BITSTRING& p_IntegrityAlgorithm, const BITSTRING& p_KNASint, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ +return int2oct(0, 0); +} + +OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_EncodedNasPdu: ", p_EncodedNasPdu); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_CipheringAlgorithm: ", bit2oct(p_CipheringAlgorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_KNASenc: ", bit2oct(p_KNASenc)); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_NasCount: ", p_NasCount); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_BearerId: ", bit2oct(p_BearerId)); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_Direction: ", p_Direction); + + // sanity checks + if (p_CipheringAlgorithm.lengthof() != 4)/* || (p_CipheringAlgorithm.get_value() != 0b0001)*/ { + /// 0b0001 = EEA2 (AES-128) + loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Wrong length"); + return int2oct(0, 0); + } else if (p_KNASenc.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasCiphering: p_KNASenc: Wrong length"); + return int2oct(0, 0); + } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasCiphering: p_NasCount/p_BearerId: Wrong length"); + return int2oct(0, 0); + } + + // Cypher key + const unsigned char* key = (const unsigned char*)bit2oct(p_KNASenc); + + // Construct IV (counter block) as per 3GPP TS 33.501 Annex C.3 + const unsigned char iv_length = 16; + unsigned char iv[iv_length] = {0}; + const unsigned char* nas_count = (const unsigned char*)p_NasCount; + iv[0] = nas_count[0]; + iv[1] = nas_count[1]; + iv[2] = nas_count[2]; + iv[3] = nas_count[3]; + // BearerId: 5 bits, Direction: 1 bit (LSB) + unsigned char bearer_dir = ((*((const unsigned char*)bit2oct(p_BearerId)) & 0x1F) << 3) | (((unsigned char)p_Direction.get_long_long_val() & 0x01) << 2); + loggers::get_instance().log("fx__NG__NasCiphering: bearer_dir=0x%02x", bearer_dir); + iv[4] = bearer_dir; + unsigned int u = p_EncodedNasPdu.lengthof(); + loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: p_EncodedNasPdu.lengthof()=", (unsigned char*)&u, 4); + loggers::get_instance().log("fx__NG__NasCiphering: >> 8 %02x=", u >> 8); + loggers::get_instance().log("fx__NG__NasCiphering: >> 16 %02x=", u >> 16); + loggers::get_instance().log("fx__NG__NasCiphering: >> 24 %02x=", u >> 24); + loggers::get_instance().log("fx__NG__NasCiphering: << 8 %02x=", u << 8); + OCTETSTRING data_len = int2oct(p_EncodedNasPdu.lengthof(), 4); + const unsigned char* data_len_ = (const unsigned char*)data_len; + iv[5] = data_len_[0]; + iv[6] = data_len_[1]; + iv[7] = data_len_[2]; + iv[8] = data_len_[3]; + // Remaining bytes are zero (already set) + loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: iv=", iv, iv_length); + + // Prepare input/output + const unsigned char* plaintext = (const unsigned char*)p_EncodedNasPdu; + int plaintext_len = p_EncodedNasPdu.lengthof(); + std::vector ciphertext(plaintext_len); + loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: plaintext=", plaintext, plaintext_len); + + // OpenSSL AES-CTR encryption + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + int outlen1 = 0, outlen2 = 0; + if (!ctx) { + loggers::get_instance().error("fx__NG__NasCiphering: EVP_CIPHER_CTX_new failed"); + return int2oct(0, 0); + } + if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv) != 1) { + loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptInit_ex failed"); + EVP_CIPHER_CTX_free(ctx); + return int2oct(0, 0); + } + if (EVP_EncryptUpdate(ctx, ciphertext.data(), &outlen1, plaintext, plaintext_len) != 1) { + loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptUpdate failed"); + EVP_CIPHER_CTX_free(ctx); + return int2oct(0, 0); + } + if (EVP_EncryptFinal_ex(ctx, ciphertext.data() + outlen1, &outlen2) != 1) { + loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptFinal_ex failed"); + EVP_CIPHER_CTX_free(ctx); + return int2oct(0, 0); + } + EVP_CIPHER_CTX_free(ctx); + + OCTETSTRING result = OCTETSTRING(outlen1 + outlen2, (const unsigned char*)ciphertext.data()); + loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: result: ", result); + return result; +} + +OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ +return int2oct(0, 0); +} + + + +} // namespace NG__NAS__SecurityFunctions + // namespace NG__SecurityDefinitionsAndExternalFunctions diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index bebf49f..699a50e 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -12,6 +12,7 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O Lib_NG_NAS_Pixits.PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O @@ -67,14 +68,14 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #AtsImsIot_TestControl.control #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 -###########################NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 -#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 +NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_02 @@ -129,10 +130,11 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index fca5346..69518e1 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -90,11 +90,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + setverdict(fail); } else { - setverdict(pass); log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REQUEST ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -132,11 +132,11 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + setverdict(fail); } else { - setverdict(pass); log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -197,8 +197,8 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST, v_message) == true) { - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } } [] tc_noac.timeout { @@ -262,8 +262,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -328,8 +331,11 @@ module NG_NAS_TCFunctions { complement(ngKSI) ), v_message) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -391,8 +397,11 @@ module NG_NAS_TCFunctions { ), v_message ) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_IDENTITY_REQUEST ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -438,8 +447,11 @@ module NG_NAS_TCFunctions { mw_NG_SECURITY_MODE_COMMAND, v_message ) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMMAND ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -478,8 +490,11 @@ module NG_NAS_TCFunctions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message_is_encrypted(vc_recvNAS_PDU) == false) { - setverdict(fail); log("*** " & __SCOPE__ & ": FAIL: Message is not encrypted ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Message is encrypted ***"); + setverdict(pass); } // FIXME FSCOM Add NAS_PDU message check f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -578,22 +593,24 @@ module NG_NAS_TCFunctions { ))))); // Await PDU SESSION ESTABLISHMENT ACCEPT with NAS encrypted payload f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // PDU SESSION ESTABLISHMENT ACCEPT - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, - v_message - ) == false) { - setverdict(fail); - return; - } + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // PDU SESSION ESTABLISHMENT ACCEPT + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, + v_message + ) == false) { + setverdict(fail); + return; + } else { + setverdict(pass); + } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -715,6 +732,8 @@ module NG_NAS_TCFunctions { ), v_message) == false) { setverdict(fail); + } else { + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -834,8 +853,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -956,11 +977,12 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); + setverdict(pass); } - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -1075,8 +1097,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -1193,8 +1217,10 @@ module NG_NAS_TCFunctions { ), v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_ACCEPT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -1317,8 +1343,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_REJECT match. ***"); + setverdict(pass); } + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log(vc_recvNGAP_PDU); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -1469,7 +1499,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_REGISTRATION_REJECT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -1535,7 +1568,10 @@ module NG_NAS_TCFunctions { ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_ACCEPT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -1597,7 +1633,10 @@ module NG_NAS_TCFunctions { ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_ACCEPT match. ***"); + setverdict(pass) } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -1656,8 +1695,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); + setverdict(pass); } + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -1706,9 +1749,12 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); + setverdict(pass); } - //Not sent sesponse and again wait for deregistration_request + //Not sent response and again wait for deregistration_request f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( @@ -1738,7 +1784,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -1791,7 +1840,10 @@ module NG_NAS_TCFunctions { )) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: NG_DEREGISTRATION_REQUEST_MT match. ***"); + setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 3291c4a..3fdf5f6 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -28,6 +28,9 @@ module NG_NAS_TestCases { // Lib3GPP/Common4G5G import from EUTRA_NR_SecurityFunctions all; + // Lib3GPP/NasEmulation + import from NG_SecurityDefinitionsAndExternalFunctions all; + // Lib_NG_NAS import from Lib_NG_NAS_Interface all; import from LIB_NG_NAS_Functions all; @@ -1707,12 +1710,12 @@ module NG_NAS_TestCases { /** * @desc Verify that the KeyDerivationFunctions is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_11() runs on gNB_NGNAS_NGAPComponent system TestAdapter { - var B256_Type v_Ks := oct2bit('efa09b59f3995f1a4ec7e99816290253c01ce4d774b21e1e141379d59c665ee3'O); // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := oct2bit('efa09b59f3995f1a4ec7e99816290253c01ce4d774b21e1e141379d59c665ee3'O); // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var octetstring v_S := '06D540050123456789000f00000002'O; var B256_Type v_derived_key := oct2bit('0c01ec8210931fdaa57448583b69e8f0ce99db7560d07dd3719765d26bf4c12f'O); @@ -1730,7 +1733,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the fl_GetServingNetworkName function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -1751,7 +1754,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the fl_GetServingNetworkName function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -1816,7 +1819,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the KAUSF derivation function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE * @see https://cryptii.com/pipes/hmac */ @@ -1843,7 +1846,7 @@ module NG_NAS_TestCases { v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_k_ausf := oct2bit('F42CFB5BCF426A3715BB5412E16F1177DB0EECF1EC2A21AE9826E941CA2B23EC'O); var B256_Type v_k_ausf_computed := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); if (not(match(v_k_ausf_computed, v_k_ausf))) { @@ -1861,7 +1864,7 @@ module NG_NAS_TestCases { * @desc Verify that the CK' and IK' derivation function is working correctly * @see ETSI TS 133 402 V16.0.0 (2020-08) A.2 Function for the derivation of CK’, IK’ from CK, IK * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.3 CK' and IK' derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.3 CK' and IK' derivation function * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -1891,7 +1894,7 @@ module NG_NAS_TestCases { v_auth_params.CK := v_ck; v_auth_params.IK := v_ik; - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_derived_key_computed := f_NG_Authentication_A3(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); if (not(match(v_derived_key_computed, v_derived_key))) { log("*** " & __SCOPE__ & ": ERROR: 'v_derived_key_computed' did not return the expected value. ***"); @@ -1919,7 +1922,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the RES* and XRES* derivation functions are working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.4 RES* and XRES* derivation function * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE * @see https://www.eurecom.fr/publication/6408/download/comsys-publi-6408.pdf * @see https://cryptii.com/pipes/hmac @@ -1952,7 +1955,7 @@ module NG_NAS_TestCases { } var B256_Type v_Ks := oct2bit('12757da1c0747d4a88b7d8b86446244b7f64a6ccf95b98b25e9a41f007037d86'O); - var B256_Type v_Ks_computed := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks_computed := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK if (not(match(v_Ks_computed, v_Ks))) { log("*** " & __SCOPE__ & ": ERROR: 'v_Ks_computed' did not return the expected value. ***"); setverdict(fail); @@ -1998,7 +2001,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the RES* and XRES* derivation functions are working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.4 RES* and XRES* derivation function * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE * @see https://cryptii.com/pipes/hmac */ @@ -2039,7 +2042,7 @@ module NG_NAS_TestCases { setverdict(fail); stop; } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2074,7 +2077,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the RES* and XRES* derivation functions are working correctly with Kontron Wireshark captures - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.4 RES* and XRES* derivation function * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE * @see https://cryptii.com/pipes/hmac */ @@ -2114,7 +2117,7 @@ module NG_NAS_TestCases { setverdict(fail); stop; } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2149,7 +2152,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the HRES* and HXRES* derivation function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.6 KSEAF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.6 KSEAF derivation function * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE * @see https://cryptii.com/pipes/hmac */ @@ -2190,7 +2193,7 @@ module NG_NAS_TestCases { setverdict(fail); stop; } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side @@ -2265,7 +2268,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the KSEAF derivation function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.6 KSEAF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.6 KSEAF derivation function * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE * @see https://cryptii.com/pipes/hmac */ @@ -2307,7 +2310,7 @@ module NG_NAS_TestCases { setverdict(fail); stop; } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side @@ -2335,7 +2338,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the KAMF derivation function is working correctly * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.7 KAMF derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.7 KAMF derivation function * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2377,7 +2380,7 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); @@ -2397,10 +2400,10 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 /** - * @desc Verify that the KAMF derivation function is working correctly + * @desc Verify that the KNASenc derivation function is working correctly * @see ETSI TS 133 501 V16.18.0 (2024-04) Clause 5.11.1.1 Ciphering algorithm identifier values * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.8 Algorithm key derivation functions + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.8 Algorithm key derivation functions * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2442,7 +2445,7 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); var B256_Type v_k_amf := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) @@ -2464,10 +2467,10 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 /** - * @desc Verify that the KAMF derivation function is working correctly + * @desc Verify that the KNASint derivation function is working correctly * @see ETSI TS 133 501 V16.18.0 (2024-04) Clause 5.11.1.1 Ciphering algorithm identifier values * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.8 Algorithm key derivation functions + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.8 Algorithm key derivation functions * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2509,7 +2512,7 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); var B256_Type v_k_amf := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) @@ -2531,9 +2534,9 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 /** - * @desc Verify that the KAMF derivation function is working correctly + * @desc Verify that the SoR-MAC-IAUSF derivation function is working correctly * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.17 SoR-MAC-IAUSF generation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.17 SoR-MAC-IAUSF generation function * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2577,7 +2580,7 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); var B128_Type v_sor_mac_i_ausf := oct2bit('14FAA726B4F25EBFC0CC58877B42CDC8'O); // SoR-MAC-Iausf @@ -2595,9 +2598,9 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 /** - * @desc Verify that the KAMF derivation function is working correctly + * @desc Verify that the SoR-MAC-IUE derivation function is working correctly * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) A.18 SoR-MAC-IUE generation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.18 SoR-MAC-IUE generation function * @see https://cryptii.com/pipes/hmac */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2640,7 +2643,7 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); var B128_Type v_so_r_mac_iue := oct2bit('F38A33C13CF17CFDA4FCA7BDBEDB760A'O); // SoR-MAC-Iue @@ -2658,6 +2661,105 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 + /** + * @desc Verify that the NAS cypher function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex D (normative): Algorithms for ciphering and integrity protection + * @see https://calctools.online/en/crypto/aes + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_k_nas_enc := '1770e0a7c7efb241b2b1f3bc3c9f1ce5'O; // Cypher key + var NasCount_Type v_nas_count := '00000005'O; // NAS Count: 5 + var bitstring v_nas_enc_alg := '0010'B ; // 128-NEA2 128-bit AES based algorithm + var B5_Type v_bearer_id := '00001'B; // Bearer ID: 0 (Signalling) + var octetstring v_plain_text := '02017f6508fae201b745e1a68f'O; + var octetstring v_cyphered_text := 'fb849d6f238efda541d2ddecd9'O; // Expected cyphered text + + var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 0) + if (not(match(v_cyphered_text_computed, v_cyphered_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cyphered_text_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01 + + /** + * @desc Verify that the NAS cypher function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex D (normative): Algorithms for ciphering and integrity protection + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 + var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key + var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); + var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field + var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); + var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + var hexstring v_NID := '000138'H; // NID: Network Identifier + var charstring v_supi := "001014444333000"; + var bitstring v_nas_enc_alg := '0010'B ; // 128-NEA2 128-bit AES based algorithm + var bitstring v_bearer_id := '00000'B; // Bearer ID: 0 (Signalling) + var NasCount_Type v_nas_count := '00000000'O; // NAS Count: 0 + + f_set_op(v_op); + + var B64_Type v_mac_a; + var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK + var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); + var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); + var B256_Type v_k_amf := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) + var B128_Type v_k_nas_enc := f_NG_Authentication_A8(tsc_NAS_Enc_Alg, + v_nas_enc_alg, + v_k_amf, + tsc_KDF_HMAC_SHA_256) + + var octetstring v_raw_pdu := 'CAFEDECA'O; + var octetstring v_cyphered_nas_pdu := ''O; + var octetstring v_cyphered_nas_pdu_computed := fx_NG_NasCiphering(v_raw_pdu, v_nas_enc_alg, v_k_nas_enc, v_nas_count, v_bearer_id, tsc_DirectionDL) + if (not(match(v_cyphered_nas_pdu_computed, v_cyphered_nas_pdu))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_nas_pdu_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cyphered_nas_pdu_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02 + } // End of group fiveG_AKA_Crypto_Functions }// End of module NG_NAS_TestCases diff --git a/ttcn/Lib3GPP/NasEmulation/NG_SecurityDefinitionsAndExternalFunctions.ttcn b/ttcn/Lib3GPP/NasEmulation/NG_SecurityDefinitionsAndExternalFunctions.ttcn index c529252..767e22e 100644 --- a/ttcn/Lib3GPP/NasEmulation/NG_SecurityDefinitionsAndExternalFunctions.ttcn +++ b/ttcn/Lib3GPP/NasEmulation/NG_SecurityDefinitionsAndExternalFunctions.ttcn @@ -14,24 +14,26 @@ module NG_SecurityDefinitionsAndExternalFunctions { import from CommonDefs all; //============================================================================ - external function fx_NG_NasIntegrityAlgorithm(octetstring p_EncodedNasPdu, - B4_Type p_IntegrityAlgorithm, - B128_Key_Type p_KNASint, - NasCount_Type p_NasCount, - B5_Type p_BearerId, - MAC_Direction_Type p_Direction) return MessageAuthenticationCode; + external function fx_NG_NasIntegrityAlgorithm(in octetstring p_EncodedNasPdu, + in B4_Type p_IntegrityAlgorithm, + in B128_Key_Type p_KNASint, + in NasCount_Type p_NasCount, + in B5_Type p_BearerId, + in MAC_Direction_Type p_Direction) return MessageAuthenticationCode; - external function fx_NG_NasCiphering(octetstring p_EncodedNasPdu, - B4_Type p_CipheringAlgorithm, - B128_Key_Type p_KNASenc, - NasCount_Type p_NasCount, - B5_Type p_BearerId) return octetstring; + external function fx_NG_NasCiphering(in octetstring p_EncodedNasPdu, + in B4_Type p_CipheringAlgorithm, + in B128_Key_Type p_KNASenc, + in NasCount_Type p_NasCount, + in B5_Type p_BearerId, + in MAC_Direction_Type p_Direction := 0) return octetstring; - external function fx_NG_NasDeciphering(octetstring p_CipheredNasMsg, - B4_Type p_CipheringAlgorithm, - B128_Key_Type p_KNASenc, - NasCount_Type p_NasCount, - B5_Type p_BearerId) return octetstring; + external function fx_NG_NasDeciphering(in octetstring p_CipheredNasMsg, + in B4_Type p_CipheringAlgorithm, + in B128_Key_Type p_KNASenc, + in NasCount_Type p_NasCount, + in B5_Type p_BearerId, + in MAC_Direction_Type p_Direction := 0) return octetstring; //---------------------------------------------------------------------------- } diff --git a/ttcn/Lib3GPP/NasEmulation/module.mk b/ttcn/Lib3GPP/NasEmulation/module.mk index 17a9b84..28027c1 100644 --- a/ttcn/Lib3GPP/NasEmulation/module.mk +++ b/ttcn/Lib3GPP/NasEmulation/module.mk @@ -1,6 +1,8 @@ sources:= \ NasEmu_Common4G5G.ttcn \ - NG_NasEmu_CtrlAspTypes.ttcn + NG_NasEmu_CtrlAspTypes.ttcn \ + NG_SecurityDefinitionsAndExternalFunctions.ttcn + #NasEmu5G_AspTypes_NR.ttcn \ #NasEmu5G_Component_NR_BASE.ttcn \ @@ -10,4 +12,3 @@ sources:= \ #NG_NasEmu_Common.ttcn \ #NG_NasEmu_CtrlAspTypes.ttcn \ #NG_NasEmu_CtrlFunctions.ttcn \ - #NG_SecurityDefinitionsAndExternalFunctions.ttcn diff --git a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn index a4b727f..c9b492f 100644 --- a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn @@ -137,6 +137,8 @@ module LIB_NG_NAS_Functions { setverdict(fail); return; } + + setverdict(pass); } /** @@ -166,11 +168,15 @@ module LIB_NG_NAS_Functions { setverdict(fail); return; } + setverdict(pass); + // Compute RES/XRES if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } + setverdict(pass); + // Send response vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } @@ -214,6 +220,13 @@ module LIB_NG_NAS_Functions { setverdict(fail); return; } + // Extract security parameters + if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + + setverdict(pass); } function f_await_NasSecurityModeCommand_send_NasSecurityModeComplete() runs on NGNASComponent { @@ -235,6 +248,8 @@ module LIB_NG_NAS_Functions { setverdict(fail); return; } + + setverdict(pass); // Send SecurityModeComplete vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, @@ -432,7 +447,9 @@ module LIB_NG_NAS_Functions { } log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); if (ischosen(v_message.security_Protected_Nas_Message)) { - if (v_message.security_Protected_Nas_Message.securityHeaderType == '0010'B) { + if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) + // NOthing to do, message is not cyphered + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) // TODO Cyphered message // Decipher NAS container // v_NonCleartextString := fx_NG_NasDeciphering(v_NonCleartextString, @@ -595,7 +612,7 @@ module LIB_NG_NAS_Functions { return false; } log("f_5g_aka_compute_res_xres: v_mac_p=", bit2oct(v_mac_p)); - if (v_mac != v_mac_p) { + if (PX_CHECK_SECURITY and (v_mac != v_mac_p)) { log("v_mac != v_mac_p"); return false; } @@ -638,7 +655,19 @@ module LIB_NG_NAS_Functions { return true; } // End of function f_5g_aka_compute_res_xres + function f_5g_security_context( + in template (value) NG_SECURITY_MODE_COMMAND p_ng_security_mode_command, + inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type + ) return boolean { + log(">>> f_5g_security_context: ", p_ng_security_mode_command); + // Set security parameters + p_ng_nas_security_params_type.NAS_Integrity.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.integrityType); + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.cipheringType); + + log("<<< f_5g_security_context: ", p_ng_nas_security_params_type); + return true; + } // End of function f_5g_security_context diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn index b6dc62c..9f91ee9 100755 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn @@ -14,6 +14,8 @@ module Lib_NG_NAS_Pixits { import from CommonDefs all; import from NAS_CommonTypeDefs all; + modulepar boolean PX_CHECK_SECURITY := true; + modulepar B4_Type PX_SUPI_FORMAT := '0000'B; modulepar octetstring PX_SUPI_DIGITS := '00f110214300014444330302'O; diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn index 78f6ccd..1148ff5 100644 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn @@ -728,7 +728,7 @@ module Lib_NG_NAS_Templates { messageType := tsc_MT_NG_SecurityModeCommand, /* cl. 9.7 M V 1 */ nasSecurityAlgorithms := p_Algs, /* cl. 9.11.3.34 M V 1 */ spareHalfOctet2 := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ - ngNasKSI := {iei := ?, tsc := ?, nasKeySetId := p_KeySetId}, // FIXME FSCOM To be enhanced + ngNasKSI := {iei := *, tsc := ?, nasKeySetId := p_KeySetId}, // FIXME FSCOM To be enhanced ueSecurityCapability := p_UECap, /* cl. 9.11.3.54 M LV 3-9 */ imeisvRequest := p_IMEISV, /* cl. 9.11.3.28 O TV 1 IEI=E */ epsSecurityAlgorithms := p_EPSAlgs, /* cl. 9.11.3.25 O TV 2 IEI=57 */ -- GitLab From 88fa0e09e32fe956a3fb37326ea3143436991c79 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 5 Sep 2025 08:30:26 +0200 Subject: [PATCH 008/151] Add function to force OPc instead of deriving it from OP & K --- ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc | 55 ++++++++++++++++----- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 15 +++--- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 12 ++--- ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn | 39 +++++++++++---- 4 files changed, 86 insertions(+), 35 deletions(-) diff --git a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc index e79682e..4f0cd28 100644 --- a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc +++ b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc @@ -8,6 +8,8 @@ namespace LIB__NG__NAS__Functions { static uint8_t OP[16] = {0}; // FIXME FSCOM To be refined. This is a Q&D implementation + static uint8_t OPc[16] = {0}; // FIXME FSCOM To be refined. This is a Q&D implementation + static bool FORCE_OPC = false; void fx__set__op(const OCTETSTRING& p_op) { loggers::get_instance().log_msg(">>> fx__set__op: p_op: ", p_op); @@ -16,14 +18,25 @@ namespace LIB__NG__NAS__Functions { } void fx__get__op(OCTETSTRING& p_op) { - loggers::get_instance().log_msg(">>> fx__get__op: p_op: ", p_op); p_op = OCTETSTRING(16, static_cast(OP)); loggers::get_instance().log_msg("<<< fx__get__op: OP: ", p_op); } + void fx__force__opc(const OCTETSTRING& p_opc) { + loggers::get_instance().log_msg(">>> fx__force__opc: p_opc: ", p_opc); + std::memcpy(OPc, static_cast(p_opc), 16); + FORCE_OPC = true; + loggers::get_instance().log_to_hexa("<<< fx__force__opc: OPc: ", static_cast(OPc), 16); + } + INTEGER fx__compute__opc(const OCTETSTRING& p_authK, OCTETSTRING& p_opc) { loggers::get_instance().log_msg(">>> fx_compute_opc: OP: ", OCTETSTRING(16, static_cast(OP))); + if (FORCE_OPC) { + loggers::get_instance().log_msg("<<< fx_compute_opc: OPC (forced): ", OCTETSTRING(16, static_cast(OPc))); + p_opc = OCTETSTRING(16, static_cast(OPc)); + return 0; + } rijndael r; r.rijndael_key_schedule(p_authK); opc op(r, OP); @@ -56,9 +69,13 @@ namespace LIB__NG__NAS__Functions { rijndael r; OCTETSTRING authK = bit2oct(p_authK); r.rijndael_key_schedule(authK); - opc op(r, OP); + OCTETSTRING os; + fx__compute__opc(authK, os); uint8_t op_c[16] = { 0x00 }; - op.compute_opc(op_c); + std::memcpy(op_c, static_cast(os), 16); + // opc op(r, OP); + // uint8_t op_c[16] = { 0x00 }; + // op.compute_opc(op_c); loggers::get_instance().log_to_hexa("fx__f1: op_c: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); @@ -104,7 +121,7 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 8; i++) { mac_a[i] = out1[i]; } // End of 'for' statement - OCTETSTRING os(8, static_cast(&mac_a[0])); + os = OCTETSTRING(8, static_cast(&mac_a[0])); p_mac_a = oct2bit(os); loggers::get_instance().log_msg("fx__f1: p_mac_a: ", os); @@ -118,9 +135,13 @@ namespace LIB__NG__NAS__Functions { rijndael r; OCTETSTRING authK = bit2oct(p_authK); r.rijndael_key_schedule(authK); - opc op(r, OP); + OCTETSTRING os; + fx__compute__opc(authK, os); uint8_t op_c[16] = { 0x00 }; - op.compute_opc(op_c); + std::memcpy(op_c, static_cast(os), 16); + // opc op(r, OP); + // uint8_t op_c[16] = { 0x00 }; + // op.compute_opc(op_c); loggers::get_instance().log_to_hexa("fx__f1star: op_c: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); @@ -166,7 +187,7 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 8; i++) { mac_s[i] = out1[i + 8]; } // End of 'for' statement - OCTETSTRING os(8, static_cast(&mac_s[0])); + os = OCTETSTRING(8, static_cast(&mac_s[0])); p_mac_s = oct2bit(os); loggers::get_instance().log_msg("fx__f1star: p_mac_s: ", os); @@ -180,9 +201,13 @@ namespace LIB__NG__NAS__Functions { rijndael r; OCTETSTRING authK = bit2oct(p_authK); r.rijndael_key_schedule(authK); - opc op(r, OP); + OCTETSTRING os; + fx__compute__opc(authK, os); uint8_t op_c[16] = { 0x00 }; - op.compute_opc(op_c); + std::memcpy(op_c, static_cast(os), 16); + // opc op(r, OP); + // uint8_t op_c[16] = { 0x00 }; + // op.compute_opc(op_c); loggers::get_instance().log_to_hexa("fx__f2345: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 5.x Test Set table: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); @@ -259,7 +284,7 @@ namespace LIB__NG__NAS__Functions { } // End of 'for' statement loggers::get_instance().log_to_hexa("fx__f2345: f4/e entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", ik, 16); - OCTETSTRING os(8, static_cast(&res[0])); + os = OCTETSTRING(8, static_cast(&res[0])); p_res = oct2bit(os); os = OCTETSTRING(16, static_cast(&ck[0])); p_ck = oct2bit(os); @@ -282,9 +307,13 @@ namespace LIB__NG__NAS__Functions { rijndael r; OCTETSTRING authK = bit2oct(p_authK); r.rijndael_key_schedule(authK); - opc op(r, OP); + OCTETSTRING os; + fx__compute__opc(authK, os); uint8_t op_c[16] = { 0x00 }; - op.compute_opc(op_c); + std::memcpy(op_c, static_cast(os), 16); + // opc op(r, OP); + // uint8_t op_c[16] = { 0x00 }; + // op.compute_opc(op_c); loggers::get_instance().log_to_hexa("fx__f5star: a entry in ETSI TS 135 207 V16.0.0 (2020-08) Clause 6.x Test Set table: ", op_c, 16); OCTETSTRING rand = bit2oct(p_rand); @@ -312,7 +341,7 @@ namespace LIB__NG__NAS__Functions { for (int i = 0; i < 6; i++) { ak[i] = out[i]; } - OCTETSTRING os(6, static_cast(&ak[0])); + os = OCTETSTRING(6, static_cast(&ak[0])); p_ak_s = oct2bit(os); loggers::get_instance().log_msg("fx__f5star: p_ak: ", bit2oct(p_ak_s)); diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 699a50e..1ef9059 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -68,14 +68,14 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #AtsImsIot_TestControl.control #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 -NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 -NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 +#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_02 @@ -121,12 +121,15 @@ NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_01 -#G_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_16_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 -########NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 +# Eurecom publiction "Security Analysis of 5G Authentication" +# https://eprint.iacr.org/2022/1623.pdf +# Verdict fail +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 3fdf5f6..578e676 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2050,14 +2050,14 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B64_Type v_RESstar := oct2bit('03F8627A00448408'O); - var B64_Type v_XRESstar := oct2bit('6F35398F7C56DF32'O); + var B64_Type v_RESstar := oct2bit('53D333860BCDFA0C'O); + var B64_Type v_XRESstar := oct2bit('55FB0452F974E0C9'O); var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_NID); var B64_Type v_RESstar_computed := substr(v_res, 0, 64); var B64_Type v_XRESstar_computed := substr(v_res, 64, 64); - log("v_RESstar_computed =", v_RESstar_computed); - log("v_XRESstar_computed =", v_XRESstar_computed); + log("v_RESstar_computed =", bit2oct(v_RESstar_computed)); + log("v_XRESstar_computed =", bit2oct(v_XRESstar_computed)); if (not(match(v_RESstar_computed, v_RESstar))) { log("*** " & __SCOPE__ & ": ERROR: 'v_RESstar_computed' did not return the expected value. ***"); setverdict(fail); @@ -2085,14 +2085,14 @@ module NG_NAS_TestCases { // From Kontron Wireshark captures: UI=001014444333000 var O16_Type v_K := '00000000000000000000000000000000'O; // The long-term key: Subscriber key - var O16_Type v_op := '00000000000000000000000000000000'O; // Operator Variant Algorithm Configuration Field + var O16_Type v_opc := '00000000000000000000000000000000'O; // Operator Variant Algorithm Configuration Field var B128_Type v_rand := oct2bit('807df0fdd3ef28786d10f425df603f3b'O); var B48_Type v_sqn_ak := oct2bit('b22bfb46d847'O); var B16_Type v_amf := oct2bit('8000'O); // AMF: Authentication Management Field var B64_Type v_mac_a := oct2bit('5cd041c2fc08f6da'O); var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 - f_set_op(v_op); + f_force_opc(v_opc); var B64_Type v_mac_a_computed; var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a_computed); diff --git a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn index c9b492f..0811ffa 100644 --- a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn @@ -732,31 +732,49 @@ module LIB_NG_NAS_Functions { return substr(p_autn, 64, 64); } + /** + * @desc Set operator variant algorithm configuration + * @param [in] p_op Operator variant algorithm configuration + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ function f_set_op(in O16_Type p_op) { fx_set_op(p_op); } + /** + * @desc Get operator variant algorithm configuration + * @param [out] p_op Operator variant algorithm configuration + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ function f_get_op(out O16_Type p_op) { fx_get_op(p_op); } + /** + * @desc Derived OP from from OP and K (subscriber key) + * @param [in] p_authK The subscriber key + * @param [out] p_opc The derived OP from from OP and K + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ function f_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer { return fx_compute_opc(p_authK, p_opc); } + /** + * @desc Force the value of OPc. In this case, OP is ignored. + * @param [in] p_opc The derived OP from from OP and K + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ + function f_force_opc(in O16_Type p_opc) { + fx_force_opc(p_opc); + } - - - - - + /** + * @desc Encryption according to the cryptographic kernel function Rijndael. + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3 + */ external function fx_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer; function f_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer { return fx_rijndael_encrypt(p_key, p_plain_text, p_cypherer_text); } - - - - - function f_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer { return fx_f1(p_authK, p_rand, v_sqn, v_amf, v_mac_a); } @@ -775,6 +793,7 @@ module LIB_NG_NAS_Functions { external function fx_set_op(in O16_Type p_op); external function fx_get_op(out O16_Type p_op); + external function fx_force_opc(in O16_Type p_op); external function fx_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer; external function fx_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer; external function fx_f1star(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_s) return integer; -- GitLab From 81a24e59cb160599f5af1b77660c74ba1a6d8305 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 30 Sep 2025 16:44:26 +0200 Subject: [PATCH 009/151] Rename some PIXITs; Addimg logs in LIB_NG_NAS_Functions_ext.cc; Add PIXIT to force usage of OPc instead of OP --- ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc | 4 ++ etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 34 +++++++--- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 74 ++++++++++++--------- ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn | 32 +++++---- ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn | 20 +++++- 5 files changed, 105 insertions(+), 59 deletions(-) diff --git a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc index 4f0cd28..033f42a 100644 --- a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc +++ b/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc @@ -65,6 +65,8 @@ namespace LIB__NG__NAS__Functions { INTEGER fx__f1(const BITSTRING& p_authK, const BITSTRING& p_rand, const BITSTRING& p_sqn, const BITSTRING& p_amf, BITSTRING& p_mac_a) { loggers::get_instance().log_msg(">>> fx__f1: p_authK: ", bit2oct(p_authK)); loggers::get_instance().log_msg(">>> fx__f1: p_rand: ", bit2oct(p_rand)); + loggers::get_instance().log_msg(">>> fx__f1: p_sqn: ", bit2oct(p_sqn)); + loggers::get_instance().log_msg(">>> fx__f1: p_amf: ", bit2oct(p_amf)); rijndael r; OCTETSTRING authK = bit2oct(p_authK); @@ -131,6 +133,8 @@ namespace LIB__NG__NAS__Functions { INTEGER fx__f1star(const BITSTRING& p_authK, const BITSTRING& p_rand, const BITSTRING& p_sqn, const BITSTRING& p_amf, BITSTRING& p_mac_s) { loggers::get_instance().log_msg(">>> fx__f1star: p_authK: ", bit2oct(p_authK)); loggers::get_instance().log_msg(">>> fx__f1star: p_rand: ", bit2oct(p_rand)); + loggers::get_instance().log_msg(">>> fx__f1: p_sqn: ", bit2oct(p_sqn)); + loggers::get_instance().log_msg(">>> fx__f1: p_amf: ", bit2oct(p_amf)); rijndael r; OCTETSTRING authK = bit2oct(p_authK); diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 1ef9059..2c6a877 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -12,12 +12,17 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B -Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false -Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B -Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O -Lib_NG_NAS_Pixits.PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O -Lib_NG_NAS_Pixits.PX_LONG_TERM_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B -Lib_NG_NAS_Pixits.PX_PLMN := '000000'O; +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := true +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +# OP +Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O +# OPc +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := '00000000000000000000000000000000'O +Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true + +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B +Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) @@ -67,14 +72,23 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # In this section you can specify what parts of your test suite you want to execute. #AtsImsIot_TestControl.control +# Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 +# Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +# Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 +# Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 +# Verify that the IUT sends a new AUTHENTICATION REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 +# Verify that the IUT sends a new IDENTITY REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 +# Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 -#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +# Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration +NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +# Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 #NG_NAS_TestCases.TC_5GNAS_AMF_REG_ACC_01 @@ -127,9 +141,9 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Eurecom publiction "Security Analysis of 5G Authentication" # https://eprint.iacr.org/2022/1623.pdf # Verdict fail -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 578e676..dfc54d9 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -96,7 +96,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_01 /** - * @desc Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context + * @desc Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI * @see ETSI TS 124 501 [1], Clause 5.4.1.3.5 and 8.2.5 */ testcase TC_5GNAS_AMF_AUT_REQ_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -124,7 +124,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_02 /** - * @desc Verify that the IUT stops re-sending an AUTHENTICATION REQUEST message if no AUTHENTICATION RESPONSE message is received on the fifth expiry of timer T3560 + * @desc Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1 */ testcase TC_5GNAS_AMF_AUT_REQ_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -1938,7 +1938,7 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_xres := oct2bit('6283ace5e894a0ad'O); + var B64_Type v_xres := oct2bit('609696B02F696DDF'O); var B64_Type v_xres_computed; var B128_Type v_ck; var B128_Type v_ik; @@ -2018,30 +2018,32 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B64_Type v_mac_s; - v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B64_Type v_xres; - var B128_Type v_ck; - var B128_Type v_ik; - var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_s); if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side @@ -2049,7 +2051,7 @@ module NG_NAS_TestCases { v_auth_params.IK := v_ik; v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - + var B64_Type v_RESstar := oct2bit('53D333860BCDFA0C'O); var B64_Type v_XRESstar := oct2bit('55FB0452F974E0C9'O); @@ -2094,29 +2096,21 @@ module NG_NAS_TestCases { f_force_opc(v_opc); - var B64_Type v_mac_a_computed; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a_computed); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - if (not(match(v_mac_a_computed, v_mac_a))) { - log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } + log("v_xres =", bit2oct(v_xres)); + log("v_ck =", bit2oct(v_ck)); + log("v_ik =", bit2oct(v_ik)); + log("v_ak =", bit2oct(v_ak)); + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side @@ -2125,14 +2119,28 @@ module NG_NAS_TestCases { v_auth_params.XRES := v_xres; v_auth_params.XRESLength := lengthof(v_xres); - var B64_Type v_RESstar := oct2bit('a7c39d021cc80709'O); - var B64_Type v_XRESstar := oct2bit('60775ce133f05be3'O); + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a_computed; + v_result := f_f1(oct2bit(v_K), v_rand, /*v_ak*/v_sqn, v_amf, v_mac_a_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + if (not(match(v_mac_a_computed, v_mac_a))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); + setverdict(fail); + stop; + } + var B64_Type v_RESstar := oct2bit('26F37F6C2DC1E002'O); + var B64_Type v_XRESstar := oct2bit('A3FB2BF1A695413A'O); var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks); var B64_Type v_RESstar_computed := substr(v_res, 0, 64); var B64_Type v_XRESstar_computed := substr(v_res, 64, 64); - log("v_RESstar_computed =", v_RESstar_computed); - log("v_XRESstar_computed =", v_XRESstar_computed); + log("v_RESstar_computed =", bit2oct(v_RESstar_computed)); + log("v_XRESstar_computed =", bit2oct(v_XRESstar_computed)); if (not(match(v_RESstar_computed, v_RESstar))) { log("*** " & __SCOPE__ & ": ERROR: 'v_RESstar_computed' did not return the expected value. ***"); setverdict(fail); diff --git a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn index 0811ffa..2809b66 100644 --- a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn @@ -279,12 +279,14 @@ module LIB_NG_NAS_Functions { ))))); } - function f_terminate_NasRegistrationRequest_with_reject() runs on NGNASComponent { + function f_terminate_NasRegistrationRequest_with_reject( + in NAS_CauseValue_Type p_nas_cause_value := tsc_EmmCause_IllegalMe + ) runs on NGNASComponent { // Send error message vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( m_GMM_GSM_Cause( -, - tsc_EmmCause_IllegalMe // '00000110'B; + p_nas_cause_value )); vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); f_send_NGAP_PDU( @@ -559,12 +561,12 @@ module LIB_NG_NAS_Functions { * @param [in,out] p_ng_nas_security_params_type Built security parameters */ function f_5g_aka_compute_res_xres( - in B128_Type p_long_term_key := PX_LONG_TERM_KEY, + in B128_Type p_subscription_key := PX_SUBSCRIPTION_KEY, in B128_Type p_rand, in B128_Type p_autn, in ABBA p_abba, in NAS_PlmnId p_PLMN, - in hexstring p_NID, + in template (omit) hexstring p_NID := omit, inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type ) return boolean { log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); @@ -575,7 +577,7 @@ module LIB_NG_NAS_Functions { p_ng_nas_security_params_type.AuthParams.RandValue := p_rand; p_ng_nas_security_params_type.AuthParams.AUTN := p_autn; - log("f_5g_aka_compute_res_xres: PX_LONG_TERM_KEY=", PX_LONG_TERM_KEY); + log("f_5g_aka_compute_res_xres: PX_SUBSCRIPTION_KEY=", PX_SUBSCRIPTION_KEY); // Extract SQN from v_sqn_ak and XOR it with calculated MAC var B48_Type v_sqn_ak := f_extract_sqn_ak_from_autn(p_autn); @@ -586,13 +588,17 @@ module LIB_NG_NAS_Functions { log("f_5g_aka_compute_res_xres: v_mac=", bit2oct(v_mac)); // Set OP - f_set_op(PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION); + if (PX_FORCE_USING_OPERATOR_SECRET_KEY == false) { + f_set_op(PX_OPERATOR_KEY); + } else { + f_force_opc(PX_OPERATOR_SECRET_KEY); + } // Calculate RES, CK, IK and AK in one step var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; var B64_Type v_res; - if (f_f2345(PX_LONG_TERM_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { + if (f_f2345(PX_SUBSCRIPTION_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { log("f_f2345 failed"); return false; } @@ -605,15 +611,15 @@ module LIB_NG_NAS_Functions { var B48_Type v_sqn := v_sqn_ak xor4b v_ak; log("f_5g_aka_compute_res_xres: v_sqn=", bit2oct(v_sqn)); - // Verify that MAC was accepted - var B64_Type v_mac_p; - if (f_f1(PX_LONG_TERM_KEY, p_rand, v_sqn, v_amf, v_mac_p) == -1) { + // Verify that MAC-A was accepted + var B64_Type v_mac_a; + if (f_f1(PX_SUBSCRIPTION_KEY, p_rand, v_sqn, v_amf, v_mac_a) == -1) { log("f_f1 failed: "); return false; } - log("f_5g_aka_compute_res_xres: v_mac_p=", bit2oct(v_mac_p)); - if (PX_CHECK_SECURITY and (v_mac != v_mac_p)) { - log("v_mac != v_mac_p"); + log("f_5g_aka_compute_res_xres: v_mac_a=", bit2oct(v_mac_a)); + if (PX_CHECK_SECURITY and (v_mac != v_mac_a)) { + log("v_mac != v_mac_a"); return false; } diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn index 9f91ee9..023fef5 100755 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn @@ -20,9 +20,23 @@ module Lib_NG_NAS_Pixits { modulepar octetstring PX_SUPI_DIGITS := '00f110214300014444330302'O; - modulepar O16_Type PX_USIM_OPERATOR_VARIANT_ALGORITHM_CONFIGURATION := '00000000000000000000000000000000'O; - - modulepar B128_Type PX_LONG_TERM_KEY := oct2bit('00000000000000000000000000000000'O); + /** + * @desc Operator Key (OP) + */ + modulepar O16_Type PX_OPERATOR_KEY := '00000000000000000000000000000000'O; + + /** + * @desc OPc is derived from OP and K + * OPc is used in 3GPP AKA algorithm + */ + modulepar O16_Type PX_OPERATOR_SECRET_KEY := '00000000000000000000000000000000'O; + + modulepar boolean PX_FORCE_USING_OPERATOR_SECRET_KEY := false + + /** + * @desc Subscription key (K) + */ + modulepar B128_Type PX_SUBSCRIPTION_KEY := oct2bit('00000000000000000000000000000000'O); modulepar NAS_PlmnId PX_PLMN := '000000'O; -- GitLab From 655c747dddbc051e41eed61a3d557dfbad109c69 Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 30 Oct 2025 12:45:12 +0100 Subject: [PATCH 010/151] added amf ngnascomponent --- ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn index 6e66fe4..c8b48ac 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn @@ -107,6 +107,31 @@ module NG_NAS_TestConfiguration{ f_setVerdict(v_ret); } // End of function f_cf_NGAP_2gNB_Up*/ + /** + * @desc Creates test configuration of cf_NGNAS_gNB - AMF is SUT + * @param p_NGNAS_Component_gnb + */ + function f_cf_NGNAS_aMF_Up( + out aMF_NGNAS_NGAPComponent p_NGNAS_Component_amf + ) runs on aMF_NGNAS_NGAPComponent system TestAdapter { + //Variables + var FncRetCode v_ret := e_success; + + //Create + p_NGNAS_Component_amf := aMF_NGNAS_NGAPComponent.create ; + + // Connect mtc sync port + connect(self:syncPort, self:syncPort); + // Connect client sync port + connect(p_NGNAS_Component_amf:syncPort, self:syncPort) ; + //Map + map(p_NGNAS_Component_amf:N2_gNBaMF_P, system:NGAP_AMF); + + activate(a_mtc_shutdown()); + + f_setVerdict(v_ret); + } // End of function f_cf_NG_NAS_aMF_Up + } // End of group cfUp group cfDown { -- GitLab From 37d61b0587547a97b45ade61962f48a708482688 Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 30 Oct 2025 12:45:22 +0100 Subject: [PATCH 011/151] added amf ngnascomponent --- ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn index 35fd618..62cbd00 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn @@ -42,6 +42,10 @@ module NG_NAS_TestSystem { type component gNB_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { //component variables } // End of type component gNBNGAPComponent + + type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { + //component variables + } // End of type component gNBNGAPComponent //Not defined because tests implemented for network side //type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { -- GitLab From d2c308706afa6b7666e9a6311f54f136139e926f Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 20 Nov 2025 14:43:15 +0100 Subject: [PATCH 012/151] Reorganize ttcn/LibNGAP ttcn/Lib_NG_NAS; Start reviewing AtsNGAP adding NAS & Security checks (==> NAS dependencies) --- NAS_ETSI.code-workspace | 3 - UE Registration.plantuml | 256 + ...ons_ext.cc => Lib_NG_NAS_Functions_ext.cc} | 7 +- ccsrc/Externals/module.mk | 7 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 4 +- etc/Ats_NG_NAS/AtsNGAP_GNB.cgf_ | 64 - titan-test-system-framework | 2 +- ttcn/AtsNGAP/NGAP_Pics.ttcn | 2 + ttcn/AtsNGAP/NGAP_Steps.ttcn | 212 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 6765 +++++++++++++++++ ttcn/AtsNGAP/NGAP_TestCases.ttcn | 3756 +++++++++ ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn | 2 +- ttcn/AtsNGAP/NGAP_TestControl.ttcn | 27 + ttcn/AtsNGAP/module.mk | 42 + ttcn/AtsNGAP/module.mk_ | 26 - ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 14 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 5 +- ttcn/Ats_NG_NAS/module.mk | 53 +- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 6 + ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 430 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 924 +++ .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 18 +- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 2 +- ttcn/LibNGAP/module.mk | 1 + ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn | 811 -- .../{ => lib}/Lib_NG_NAS_Pixits.ttcn | 0 .../lib/Lib_NG_NAS_Security_Functions.ttcn | 438 ++ .../{ => lib}/Lib_NG_NAS_Templates.ttcn | 268 +- .../{ => lib}/NG_NAS_BaseTemplates.ttcn | 0 .../{ => lib}/NG_NAS_EncdecDeclarations | 0 .../lib_system/Lib_NG_NAS_Functions.ttcn | 282 + .../Lib_NG_NAS_Interface.ttcn | 13 - ttcn/Lib_NG_NAS/module.mk | 11 +- 33 files changed, 13109 insertions(+), 1342 deletions(-) create mode 100644 UE Registration.plantuml rename ccsrc/Externals/{LIB_NG_NAS_Functions_ext.cc => Lib_NG_NAS_Functions_ext.cc} (98%) delete mode 100644 etc/Ats_NG_NAS/AtsNGAP_GNB.cgf_ create mode 100644 ttcn/AtsNGAP/NGAP_TCFunctions.ttcn create mode 100644 ttcn/AtsNGAP/NGAP_TestCases.ttcn create mode 100644 ttcn/AtsNGAP/NGAP_TestControl.ttcn create mode 100644 ttcn/AtsNGAP/module.mk delete mode 100644 ttcn/AtsNGAP/module.mk_ create mode 100644 ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn delete mode 100644 ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn rename ttcn/Lib_NG_NAS/{ => lib}/Lib_NG_NAS_Pixits.ttcn (100%) create mode 100644 ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn rename ttcn/Lib_NG_NAS/{ => lib}/Lib_NG_NAS_Templates.ttcn (95%) rename ttcn/Lib_NG_NAS/{ => lib}/NG_NAS_BaseTemplates.ttcn (100%) rename ttcn/Lib_NG_NAS/{ => lib}/NG_NAS_EncdecDeclarations (100%) create mode 100644 ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn rename ttcn/Lib_NG_NAS/{ => lib_system}/Lib_NG_NAS_Interface.ttcn (67%) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index c1b2adb..bea1ea2 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -3,9 +3,6 @@ { "path": "." }, - { - "path": "../ngap" - }, { "path": "../../frameworks/titan/titan.core" }, diff --git a/UE Registration.plantuml b/UE Registration.plantuml new file mode 100644 index 0000000..3353526 --- /dev/null +++ b/UE Registration.plantuml @@ -0,0 +1,256 @@ +@startuml +title 5G UE Registration Procedure for Voice and Data Access (3GPP Release 16) + +skinparam backgroundColor #FEFEFE +skinparam sequenceArrowThickness 2 +skinparam roundcorner 10 +skinparam maxmessagesize 200 +skinparam sequenceParticipant underline + +actor UE +participant "gNB/ng-eNB (SUT) 242.39" as RAN +participant "AMF (IUT) 242.37" as AMF +participant AUSF +participant UDM +participant PCF +participant SMF +participant UPF +participant DN + +== RRC Connection Establishment == +UE -> RAN: RRC Setup Request +activate RAN +RAN -> UE: RRC Setup +deactivate RAN +UE -> RAN: RRC Setup Complete + +== Initial Registration Request == +UE -> RAN: NAS: Registration Request\n(Registration Type: Initial,\n5G-GUTI/SUCI, Requested NSSAI,\nUE Security Capability) +activate RAN +RAN -> AMF: INITIAL UE MESSAGE\n(Registration Request, User Location Info,\nRRC Establishment Cause, 5G-S-TMSI) +activate AMF +deactivate RAN + +== UE Identity Retrieval (if SUCI provided) == +AMF -> UDM: Nudm_UECM_Registration (SUCI) +activate UDM +UDM -> AMF: SUPI, Subscription Data +deactivate UDM + +== Authentication == +AMF -> AUSF: Nausf_UEAuthentication_Authenticate Request (SUPI) +activate AUSF +AUSF -> UDM: Nudm_Authentication_Get Request +activate UDM +UDM -> AUSF: Authentication Vector (5G AV) +deactivate UDM +AUSF -> AMF: 5G AV (RAND, AUTN, HXRES*) +deactivate AUSF + +AMF -> RAN: DOWNLINK NAS TRANSPORT\n(Authentication Request: RAND, AUTN) +activate RAN +RAN -> UE: NAS: Authentication Request +deactivate RAN + +UE -> UE: Compute RES*\nDerive KAUSF, KSEAF +UE -> RAN: NAS: Authentication Response (RES*) +activate RAN +RAN -> AMF: UPLINK NAS TRANSPORT\n(Authentication Response: RES*) +deactivate RAN + +AMF -> AMF: Verify RES* vs HXRES*\nDerive KAMF +AMF -> AUSF: Nausf_UEAuthentication_Authenticate Response (RES*) +activate AUSF +AUSF -> AMF: Authentication Result (Success) +deactivate AUSF + +== NAS Security Mode Command == +AMF -> AMF: Derive NAS Keys\n(KNASenc, KNASint) +AMF -> RAN: DOWNLINK NAS TRANSPORT\n(Security Mode Command:\nNAS Security Algorithms,\nngKSI, Replayed UE Security Capabilities) +activate RAN +RAN -> UE: NAS: Security Mode Command +deactivate RAN + +UE -> UE: Derive NAS Keys\nVerify Security Algorithms +UE -> RAN: NAS: Security Mode Complete\n[NAS Protected with Integrity & Ciphering] +activate RAN +RAN -> AMF: UPLINK NAS TRANSPORT\n(Security Mode Complete) +deactivate RAN + +note over UE, AMF: All subsequent NAS messages are integrity protected and ciphered + +== Subscription Data Retrieval == +AMF -> UDM: Nudm_SDM_Get (Access and Mobility Subscription Data) +activate UDM +UDM -> AMF: Subscription Data\n(Subscribed S-NSSAIs, DNN Configuration,\nSubscribed UE-AMBR, RFSP Index) +deactivate UDM + +AMF -> UDM: Nudm_SDM_Subscribe (SDM Subscription) +activate UDM +UDM -> AMF: SDM Subscription Confirmation +deactivate UDM + +== Policy Association == +AMF -> PCF: Npcf_AMPolicyControl_Create\n(SUPI, DNN, S-NSSAI) +activate PCF +PCF -> UDM: Nudm_SDM_Get (Policy Data) +activate UDM +UDM -> PCF: Policy Data +deactivate UDM +PCF -> AMF: AM Policy (Access and Mobility Policy,\nUE-AMBR, RFSP Index) +deactivate PCF + +== Registration Accept == +AMF -> AMF: Allocate 5G-GUTI,\nSelect Allowed NSSAI,\nDetermine Registration Area + +AMF -> RAN: INITIAL CONTEXT SETUP REQUEST\n(5G-GUTI, Allowed NSSAI, UE Security Capability,\nSecurity Key, UE Aggregate Maximum Bit Rate,\nMobility Restrictions, Registration Accept) +activate RAN + +RAN -> RAN: Generate gNB Security Keys\n(KgNBenc, KgNBint)\nfrom KAMF + +== AS Security Mode Command == +RAN -> UE: RRC: Security Mode Command\n(AS Security Algorithms) +UE -> UE: Derive AS Keys\n(KgNBenc, KgNBint) +UE -> RAN: RRC: Security Mode Complete + +note over UE, RAN: All subsequent RRC and UP messages are protected + +== Registration Accept Delivery == +RAN -> UE: NAS: Registration Accept\n(5G-GUTI, Registration Area,\nAllowed NSSAI, TAI List,\nMobility Restrictions, T3512) + +UE -> UE: Store 5G-GUTI,\nAllowed NSSAI,\nRegistration Area + +UE -> RAN: NAS: Registration Complete +RAN -> AMF: UPLINK NAS TRANSPORT\n(Registration Complete) + +RAN -> AMF: INITIAL CONTEXT SETUP RESPONSE\n(PDU Session Resource Setup List) +deactivate RAN +deactivate AMF + +note over UE, AMF: UE is now registered for mobility management + +== PDU Session Establishment for Data == +UE -> RAN: NAS: UL NAS Transport\n(PDU Session Establishment Request:\nPDU Session ID, S-NSSAI, DNN="internet",\nPDU Session Type=IPv4v6) +activate RAN +RAN -> AMF: UPLINK NAS TRANSPORT\n(PDU Session Establishment Request) +activate AMF +deactivate RAN + +== SMF Selection and Session Creation == +AMF -> SMF: Nsmf_PDUSession_CreateSMContext\n(SUPI, DNN, S-NSSAI, PDU Session ID) +activate SMF + +SMF -> UDM: Nudm_SDM_Get (Session Management Subscription Data) +activate UDM +UDM -> SMF: SM Subscription Data\n(Subscribed DNN Configuration,\nSession-AMBR, 5QI, ARP) +deactivate UDM + +SMF -> PCF: Npcf_SMPolicyControl_Create\n(SUPI, DNN, S-NSSAI, IP Address) +activate PCF +PCF -> SMF: SM Policy\n(PCC Rules, QoS, Charging Rules) +deactivate PCF + +SMF -> SMF: Select UPF,\nAllocate IP Address,\nCreate QoS Rules + +== N2 PDU Session Resource Setup == +SMF -> AMF: Namf_Communication_N1N2MessageTransfer\n(N2 SM Information: QoS Flows, UL/DL Tunnels) +AMF -> RAN: PDU SESSION RESOURCE SETUP REQUEST\n(PDU Session ID, S-NSSAI, QoS Flows,\nUL NG-U TNL Info, NAS: PDU Session Establishment Accept) +activate RAN + +RAN -> RAN: Establish DRBs,\nMap QoS Flows to DRBs + +== PDU Session Accept Delivery == +RAN -> UE: RRC: RRC Reconfiguration\n(DRB Configuration, QoS Flow Mapping) +RAN -> UE: NAS: DL NAS Transport\n(PDU Session Establishment Accept:\nPDU Session ID, PDU Session Type,\nSSC Mode, QoS Rules, QoS Flow Descriptions,\nAllocated IPv4/IPv6 Address) + +UE -> UE: Configure DRBs,\nConfigure IP Address,\nStore QoS Rules + +UE -> RAN: RRC: RRC Reconfiguration Complete +UE -> RAN: NAS: UL NAS Transport\n(PDU Session Establishment Accept Ack) + +== N3 Tunnel Setup == +RAN -> AMF: PDU SESSION RESOURCE SETUP RESPONSE\n(DL NG-U TNL Info, QoS Flows Setup List) +deactivate RAN + +AMF -> SMF: Nsmf_PDUSession_UpdateSMContext\n(N2 SM Information: DL Tunnel Info) + +SMF -> UPF: N4 Session Establishment Request\n(PDR, FAR, QER, URR for UL/DL) +activate UPF +UPF -> SMF: N4 Session Establishment Response +deactivate UPF + +SMF -> AMF: Nsmf_PDUSession_UpdateSMContext Response +deactivate SMF +deactivate AMF + +note over UE, UPF: User Plane is established for data services + +== PDU Session Establishment for IMS (Voice) == +UE -> RAN: NAS: UL NAS Transport\n(PDU Session Establishment Request:\nPDU Session ID, S-NSSAI, DNN="ims",\nPDU Session Type=IPv4v6, Request Type=Initial) +activate RAN +RAN -> AMF: UPLINK NAS TRANSPORT\n(PDU Session Establishment Request) +activate AMF +deactivate RAN + +AMF -> SMF: Nsmf_PDUSession_CreateSMContext\n(SUPI, DNN="ims", S-NSSAI, PDU Session ID) +activate SMF + +SMF -> UDM: Nudm_SDM_Get (IMS Session Management Data) +activate UDM +UDM -> SMF: IMS SM Subscription Data +deactivate UDM + +SMF -> PCF: Npcf_SMPolicyControl_Create\n(SUPI, DNN="ims", S-NSSAI) +activate PCF +PCF -> SMF: IMS SM Policy\n(QoS for IMS Signaling and Media) +deactivate PCF + +SMF -> SMF: Select UPF for IMS,\nAllocate IP Address for IMS,\nCreate QoS Rules for VoNR + +SMF -> AMF: Namf_Communication_N1N2MessageTransfer\n(N2 SM Information for IMS Session) +AMF -> RAN: PDU SESSION RESOURCE SETUP REQUEST\n(PDU Session ID, QoS Flows for IMS,\nUL NG-U TNL Info, PDU Session Establishment Accept) +activate RAN + +RAN -> UE: NAS: DL NAS Transport\n(PDU Session Establishment Accept for IMS:\nAllocated IP Address, QoS Rules for Voice) + +UE -> UE: Configure IMS PDU Session,\nStore P-CSCF Address + +UE -> RAN: NAS: UL NAS Transport\n(PDU Session Establishment Accept Ack) + +RAN -> AMF: PDU SESSION RESOURCE SETUP RESPONSE\n(DL NG-U TNL Info for IMS) +deactivate RAN + +AMF -> SMF: Nsmf_PDUSession_UpdateSMContext\n(N2 SM Information for IMS) +SMF -> UPF: N4 Session Establishment Request (IMS PDR/FAR/QER) +activate UPF +UPF -> SMF: N4 Session Establishment Response +deactivate UPF + +SMF -> AMF: Nsmf_PDUSession_UpdateSMContext Response +deactivate SMF +deactivate AMF + +note over UE, UPF: IMS PDU Session established for Voice over NR (VoNR) + +== IMS Registration (for Voice Services) == +UE -> UPF: SIP REGISTER (via IMS PDU Session) +activate UPF +UPF -> DN: Forward to IMS (P-CSCF) +activate DN +DN -> DN: IMS Authentication\nand Registration +DN -> UPF: SIP 200 OK (Registration Successful) +deactivate DN +UPF -> UE: SIP 200 OK +deactivate UPF + +note over UE, DN: UE is now registered for IMS Voice Services\nand Data Services are active + +== Data Flow == +UE <-> UPF: User Plane Data Traffic\n(N3 Tunnel via gNB) +activate UPF +UPF <-> DN: N6 Interface (Internet) +activate DN +deactivate DN +deactivate UPF + +@enduml diff --git a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc b/ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc similarity index 98% rename from ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc rename to ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc index 033f42a..bd1a018 100644 --- a/ccsrc/Externals/LIB_NG_NAS_Functions_ext.cc +++ b/ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc @@ -1,11 +1,11 @@ -#include "LIB_NG_NAS_Functions.hh" +#include "Lib_NG_NAS_Functions.hh" #include "loggers.hh" #include "rijndael.hh" #include "opc.hh" -namespace LIB__NG__NAS__Functions { +namespace Lib__NG__NAS__Security__Functions { static uint8_t OP[16] = {0}; // FIXME FSCOM To be refined. This is a Q&D implementation static uint8_t OPc[16] = {0}; // FIXME FSCOM To be refined. This is a Q&D implementation @@ -352,4 +352,5 @@ namespace LIB__NG__NAS__Functions { return 0; } -} // End of namespace LIB__NG__NAS__Functions +} // End of namespace namespace Lib__NG__NAS__Security__Functions { + diff --git a/ccsrc/Externals/module.mk b/ccsrc/Externals/module.mk index 4701f00..5a31951 100644 --- a/ccsrc/Externals/module.mk +++ b/ccsrc/Externals/module.mk @@ -1,7 +1,6 @@ sources := \ - common_ext.cc \ - NG_security_ext.cc \ - LIB_NG_NAS_Functions_ext.cc - + common_ext.cc \ + NG_security_ext.cc \ + Lib_NG_NAS_Functions_ext.cc includes := . diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 2c6a877..9df3481 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -73,7 +73,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #AtsImsIot_TestControl.control # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context -#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 +NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure @@ -87,7 +87,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration -NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 diff --git a/etc/Ats_NG_NAS/AtsNGAP_GNB.cgf_ b/etc/Ats_NG_NAS/AtsNGAP_GNB.cgf_ deleted file mode 100644 index 7f8b8a2..0000000 --- a/etc/Ats_NG_NAS/AtsNGAP_GNB.cgf_ +++ /dev/null @@ -1,64 +0,0 @@ -[MODULE_PARAMETERS] -# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. - -NAS_Pics.PICS_NAS_GNB_IUT := true -NAS_Pics.PICS_NAS_AMF_IUT := false - -[LOGGING] -# In this section you can specify the name of the log file and the classes of events -# you want to log into the file or display on console (standard error). - -LogFile := "../logs/Ats_NG_NAS/%e.%h-%r.%s" -FileMask := LOG_ALL | USER | DEBUG | MATCHING -ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING -#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE -#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE -LogSourceInfo := Stack -LogEntityName:= Yes -LogEventTypes:= Yes -#TimeStampFormat := DateTime - -[TESTPORT_PARAMETERS] -# In this section you can specify parameters that are passed to Test Ports. -system.NGAP_gNB_1.params := "NAS/NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/5g_reg.pcapng)" -system.N2_gNBaMF_P.params := "NAS/NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/5g_reg.pcapng)" -#aMFNASComponent.N2_gNBaMF_P.params := "NAS/SCTP_FILE/IP_FILE/ETH/PCAP_FILE(file=../captures/free5gc.pcap)" - -[DEFINE] -# In this section you can create macro definitions, -# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. - -[INCLUDE] -# To use configuration settings given in other configuration files, -# the configuration files just need to be listed in this section, with their full or relative pathnames. - -[ORDERED_INCLUDE] -# To use configuration settings given in other configuration files, -# the configuration files just need to be listed in this section, with their full or relative pathnames. - -[EXTERNAL_COMMANDS] -# This section can define external commands (shell scripts) to be executed by the ETS -# whenever a control part or test case is started or terminated. - -#BeginTestCase := "" -#EndTestCase := "" -#BeginControlPart := "" -#EndControlPart := "" - -[EXECUTE] -# In this section you can specify what parts of your test suite you want to execute. -#AtsImsIot_TestControl.control - -[GROUPS] -# In this section you can specify groups of hosts. These groups can be used inside the -# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. - -[COMPONENTS] -# This section consists of rules restricting the location of created PTCs. - -[MAIN_CONTROLLER] -# The options herein control the behavior of MC. -KillTimer := 10.0 -LocalAddress := 127.0.0.1 -TCPPort := 12000 -NumHCs := 1 diff --git a/titan-test-system-framework b/titan-test-system-framework index f8843ac..5babbea 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit f8843ac9740f8efe537f4938918920c8e8f8e692 +Subproject commit 5babbea3f94b54c322ba8fba42e6b6c6a16270be diff --git a/ttcn/AtsNGAP/NGAP_Pics.ttcn b/ttcn/AtsNGAP/NGAP_Pics.ttcn index 4706723..636d3dc 100644 --- a/ttcn/AtsNGAP/NGAP_Pics.ttcn +++ b/ttcn/AtsNGAP/NGAP_Pics.ttcn @@ -140,4 +140,6 @@ module NGAP_Pics { modulepar boolean PICS_A4_15_2 := false; //AMF - RIM information Transfer procedure - DOWNLINK RIM INFORMATION TRANSFER } // End of group PICS_A4 + modulepar boolean PICS_OFFLINE_MODE := false; // If true, the test system runs in offline mode (no SUT connection) + } // End of module NGAP_Pics diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index a850a23..076994a 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -14,12 +14,12 @@ module NGAP_Steps { // LibNGAP import from LibNGAP_Steps all; import from LibNGAP_Interface all; + import from LibNGAP_Functions all; import from LibNGAP_Pixits all; - import from LibNGAP_Templates all; - // NGAP_Ats + // AtsNGAP import from NGAP_Pixits all; - + import from NGAP_Pics all; group GlobalSteps { @@ -61,83 +61,6 @@ module NGAP_Steps { vc_SUT_address := PX_NGAP_SUT_IPADDR; vc_SUT_port := PX_NGAP_SUT_PORT; - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - PX_PLMN_IDENTITY, - PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit - )), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - PX_SD,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit - ) - }, - PX_PAGING_DRX - ) - ) - ); - - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGSetupResponse(-,-,-,-) - ) - ); - // f_recv_NGAP_PDU( - // mw_ngap_succMsg( - // mw_n2_NGSetupResponse( - // ?, - // { - // mw_servedGUAMIItem( - // mw_gUAMI( - // ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, - // ?,//template (present) AMFRegionID p_aMFRegionID := ?, - // ?,//template (present) AMFSetID p_aMFSetID := ?, - // ?,//template (present) AMFPointer p_aMFPointer := ?, - // *//template GUAMI.iE_Extensions p_iE_Extensions := * - // ),//template (present) GUAMI p_gUAMI := ?, - // *,//template AMFName p_backupAMFName := *, - // *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * - // ) - // },//template (present) ServedGUAMIList p_servedGUAMIList := ?, - // ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, - // { - // mw_pLMNSupportItem( - // ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, - // { - // mw_sliceSupportItem( - // mw_s_NSSAI( - // ?,//template (present) SST p_sST := ?, - // *,//template SD p_sD := *, - // *//template S_NSSAI.iE_Extensions p_iE_Extensions := * - // ),//template (present) S_NSSAI p_s_NSSAI := ?, - // ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * - // ) - // },//template (present) SliceSupportList p_sliceSupportList := ?, - // *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * - // ) - // }//template (present) PLMNSupportList p_plmnSuppList := ? - // ) - // ) - // ); } // End of function f_NGAP_gnb_init /** @@ -243,9 +166,27 @@ module NGAP_Steps { * @desc */ function f_NGAP_amf_UE_Register() runs on NGAPComponent { - //FIXME: Implementation of UE registration + log(">>> f_NGAP_amf_UE_Register"); + f_await_NGSetupRequest_send_NGSetupRespone(); + f_await_registration_request(); } // End of function f_NGAP_amf_UE_Register + /** + * @desc + */ + function f_NGAP_amf_UE_Authentication() runs on NGAPComponent { + log(">>> f_NGAP_amf_UE_Authentication"); + f_send_authentication_request_await_authentication_response(); + } // End of function f_NGAP_amf_UE_Authentication + + /** + * @desc + */ + function f_NGAP_amf_UE_SecurityMode() runs on NGAPComponent { + log(">>> f_NGAP_amf_UE_SecurityMode"); + f_send_securitymode_command_await_securitymode_complete(); + } // End of function f_NGAP_amf_UE_SecurityMode + /** * @desc */ @@ -336,9 +277,41 @@ module NGAP_Steps { * @desc */ function f_NGAP_gnb_UE_Register() runs on NGAPComponent { - //FIXME: Implementation of UE registration + log(">>> f_NGAP_gnb_UE_Register"); + if (PICS_OFFLINE_MODE) { + f_await_NGSetupRequest_await_NGSetupRespone(); + } else { + f_send_NGSetupRequest_await_NGSetupRespone(); + } + log("f_NGAP_gnb_UE_Register: f_send_NGSetupRequest_await_NGSetupRespone done"); + f_await_registration_request(); + log("f_NGAP_gnb_UE_Register: f_await_registration_request done"); } // End of function f_NGAP_gnb_UE_Register + /** + * @desc + */ + function f_NGAP_gnb_UE_Authentication() runs on NGAPComponent { + log(">>> f_NGAP_gnb_UE_Authentication"); + if (PICS_OFFLINE_MODE) { + f_await_authentication_request_await_authentication_response(); + } else { // Await authentication request and send response + f_await_authentication_request_send_authentication_response(); + } + } // End of function f_NGAP_gnb_UE_Authentication + + /** + * @desc + */ + function f_NGAP_gnb_UE_SecurityMode() runs on NGAPComponent { + log(">>> f_NGAP_gnb_UE_SecurityMode"); + if (PICS_OFFLINE_MODE) { + f_await_securitymode_command_await_securitymode_complete(); + } else { // Await security mode and send response + f_await_securitymode_command_send_securitymode_complete(); + } + } // End of function f_NGAP_gnb_UE_SecurityMode + /** * @desc */ @@ -356,24 +329,80 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_EstablishedInitialContext() runs on NGAPComponent { - //FIXME: Implementation of UE handover required - } // End of function f_NGAP_gnb_UE_EstablishedInitialContext + function f_NGAP_gnb_UE_InitialContextSetup() runs on NGAPComponent { + log(">>> f_NGAP_gnb_UE_InitialContextSetup"); + if (PICS_OFFLINE_MODE) { + f_await_initial_context_setup_request_await_initial_context_setup_resonse(); + } else { + f_await_initial_context_setup_request_send_initial_context_setup_resonse(); + } + } // End of function f_NGAP_gnb_UE_InitialContextSetup + function f_NGAP_gnb_RegistrationComplete() runs on NGAPComponent { + log(">>> f_NGAP_gnb_RegistrationComplete"); + if (PICS_OFFLINE_MODE) { + f_await_registration_complete(); + } else { + f_send_registration_complete(); + } + } // End of function f_NGAP_gnb_RegistrationComplete + /** * @desc */ - function f_NGAP_gnb_UE_Has_EstablishedContextInproperly() runs on NGAPComponent { - //FIXME: Implementation of UE handover required + function f_NGAP_gnb_UE_Has_EstablishedContextInproperly() runs on NGAPComponent return boolean { + if (not(isbound(vc_initialContextSetupRequest))) { + log("f_NGAP_gnb_UE_Has_EstablishedContextInproperly: vc_initialContextSetupRequest is not bound"); + return false; + } else { + // TODO FSCOM To be enhanced + } + return true; } // End of function f_NGAP_gnb_UE_Has_EstablishedContextInproperly /** * @desc */ - function f_NGAP_gnb_UE_HasPendingDataTransmission() runs on NGAPComponent { - //FIXME: Implementation of UE has pending data transmission leading to failed context suspension + function f_NGAP_gnb_UE_HasPendingDataTransmission() runs on NGAPComponent return boolean { + //FIXME: Implementation of UE has pending data transmission leading to failed context suspension + return false; } // End of function f_NGAP_gnb_UE_HasPendingDataTransmission + /** + * @desc + */ + function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest() runs on NGAPComponent { + log(">>> f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest"); + if (PICS_OFFLINE_MODE) { + f_await_session_establishment_request(); + } else { + f_send_session_establishment_request(); + } + } // End of function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest + + /** + * @desc + */ + function f_NGAP_gnb_UE_PDU_SessionEstablishmentAccept() runs on NGAPComponent { + log(">>> f_NGAP_gnb_UE_PDU_SessionEstablishmentAccept"); + if (PICS_OFFLINE_MODE) { + f_await_session_establishment_accept(); + } else { + f_send_session_establishment_accept(); + } + } // End of function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest + + function f_NGAP_gnb_UE_PDU_SessionResourceSetup() runs on NGAPComponent { + log(">>> f_NGAP_gnb_UE_PDU_SessionResourceSetup"); + if (PICS_OFFLINE_MODE) { + f_await_session_resource_setup_request_await_session_resource_setup_response(); + } else { + f_await_session_resource_setup_request_send_session_resource_setup_response(); + } + + // f_send_session_resource_setup_request_await_session_resource_setup_response + } + /** * @desc */ @@ -384,8 +413,9 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_Has_Suspended_Context() runs on NGAPComponent { - //FIXME: Implementation of UE has suspended context + function f_NGAP_gnb_UE_Has_Suspended_Context() runs on NGAPComponent return boolean { + //FIXME: Implementation of UE has suspended context + return false; } // End of function f_NGAP_amf_UE_hasSuspendedContext /** diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn new file mode 100644 index 0000000..3abc450 --- /dev/null +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -0,0 +1,6765 @@ +/** + * @author ETSI / TTF033 + * @version $URL$ + * $Id$ + * @desc This module provides test functions for NGAP tests. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * @see ETSI TS 138 413 / 3GPP TS 38.413 version 16.12 Release 16 + */ +module NGAP_TCFunctions { + + // LibCommon + import from LibCommon_Sync all; + import from LibCommon_VerdictControl all; + import from LibCommon_Time all; + + // LibNGAP + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_Constants language "ASN.1:2002" all; + + import from LibNGAP_Pixits all; + import from LibNGAP_Templates all; + import from LibNGAP_Interface all; + import from LibNGAP_Steps all; + + // AtsNGAP + import from NGAP_TestSystem all; + import from NGAP_Steps all; + import from NGAP_Pixits all; + + group TC_function_template{ + + /** + * @desc Testcase function for TC_NGAP_gNB_or_aMF_functionName_01 + */ + function f_TC_NGAP_gNB_or_aMF_functionName_01() runs on NGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + //f_send_NGAP_PDU(m_ngap_initMsg(/*initiating msgtemplate*/)); + //f_recv_NGAP_PDU(?); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_or_aMF_functionName_01 + + } // End of group TC_function_template + + group gNB_Role{ + //8.2 + group PDU_Session_Management_Procedures{ + //8.2.1 + group PDU_Session_Resource_Setup{ + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_01 + */ + function f_TC_NGAP_GNB_PDU_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + -, + -, + { + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + } + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceSetupResponse( + -, + -, + { + (mw_pDUSessionResourceSetupItemSURes( + ?,//template (present) PDUSessionID p_pDUSessionID, + decmatch ( + mw_pDUSessionResourceSetupResponseTransfer( + ?,//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + *,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + *,//template SecurityResult p_securityResult := *, + *,//template QosFlowListWithCause p_qosFlowFailedToSetupList := *, + *//template PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := * + ) + ),// Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupResponseTransfer + *//template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * + ) + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_01 + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_02 + */ + function f_TC_NGAP_GNB_PDU_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + -, + -, + { + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))), + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + } + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceSetupResponseFailed( + -, + -, + { + mw_pDUSessionResourceFailedToSetupItemSURes( + ?,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceSetupUnsuccessfulTransfer( + mw_cause_misc(mw_causeMisc(?/*MultiplePDUSessionIDInstances*/)),//?,//template (present) Cause p_cause := ?, + *,//template CriticalityDiagnostics p_criticalityDiagnostics := *, + *//template PDUSessionResourceSetupUnsuccessfulTransfer.iE_Extensions p_iE_Extensions := * + ) + ),//Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupUnsuccessfulTransfer + *//template PDUSessionResourceFailedToSetupItemSURes.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_02 + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_03 + */ + function f_TC_NGAP_GNB_PDU_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); //f_await_NGSetupRequest_send_NGSetupRespone + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + -, + -, + { + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + } + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceSetupResponse( + -, + -, + { + mw_pDUSessionResourceSetupItemSURes( + ?,//template (present) PDUSessionID p_pDUSessionID, + decmatch( + mw_pDUSessionResourceSetupResponseTransfer( + ?,//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + *,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + *,//template SecurityResult p_securityResult := *, + *,//template QosFlowListWithCause p_qosFlowFailedToSetupList := *, + *//template PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := * + ) + ), //Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupResponseTransfer + *//template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + -, + -, + { + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + } + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceSetupResponseFailed( + -, + -, + { + mw_pDUSessionResourceFailedToSetupItemSURes( + ?,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceSetupUnsuccessfulTransfer( + mw_cause_misc(mw_causeMisc(?/*MultiplePDUSessionIDInstances*/)),//?,//template (present) Cause p_cause := ?, + *,//template CriticalityDiagnostics p_criticalityDiagnostics := *, + *//template PDUSessionResourceSetupUnsuccessfulTransfer.iE_Extensions p_iE_Extensions := * + ) + ),//Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupUnsuccessfulTransfer + *//template PDUSessionResourceFailedToSetupItemSURes.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_03 + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_04 + */ + function f_TC_NGAP_GNB_PDU_04() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + -, + -, + { + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, //FIXME nonGBRQosID + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + } + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceSetupResponseFailed( + -, + -, + { + mw_pDUSessionResourceFailedToSetupItemSURes( + ?,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceSetupUnsuccessfulTransfer( + mw_cause_misc(mw_causeMisc(?/*InvalidQoSCombination*/)),//?,//template (present) Cause p_cause := ?, + *,//template CriticalityDiagnostics p_criticalityDiagnostics := *, + *//template PDUSessionResourceSetupUnsuccessfulTransfer.iE_Extensions p_iE_Extensions := * + ) + ),//Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupUnsuccessfulTransfer + *//template PDUSessionResourceFailedToSetupItemSURes.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_04 + + } // End of group PDU_Session_Resource_Setup + //8.2.2 + group PDU_Session_Resource_Release{ + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_05 + */ + function f_TC_NGAP_GNB_PDU_05() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceReleaseCommand( + -, + -, + { + m_pDUSessionResourceToReleaseItemRelCmd( + PX_PDU_SESSION_ID, + bit2oct( + encvalue( + m_pDUSessionResourceReleaseCommandTransfer( + m_cause_misc(m_causeMisc(-)), + -//in template (omit) PDUSessionResourceReleaseCommandTransfer.iE_Extensions p_iE_Extensions := omit + ) + ) + ), + - //in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit + ) + } + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceReleaseResponse( + -,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + -,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + ( + mw_pDUSessionResourceReleasedItemRelRes( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + (mw_pDUSessionResourceReleaseResponseTransfer(*)) + ),//template (present) PDUSessionResourceReleasedItemRelRes.pDUSessionResourceReleaseResponseTransfer p_pDUSessionResourceReleaseResponseTransfer := ?, + //Decode&Match - In ASN1 it is OCTET STRING - pDUSessionResourceReleaseResponseTransfer + -//template PDUSessionResourceReleasedItemRelRes.iE_Extensions p_iE_Extensions := * + ) + + ) + }//template (present) PDUSessionResourceReleasedListRelRes p_pDUSessionResourceReleasedListRelRes := ? + ) + + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_05 + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_06 + */ + function f_TC_NGAP_GNB_PDU_06() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceReleaseCommand( + -, + -, + { + m_pDUSessionResourceToReleaseItemRelCmd( + PX_PDU_SESSION_ID, + bit2oct( + encvalue( + m_pDUSessionResourceReleaseCommandTransfer( + m_cause_misc(m_causeMisc(-)), + -//in template (omit) PDUSessionResourceReleaseCommandTransfer.iE_Extensions p_iE_Extensions := omit + ) + ) + ), + - //in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit + ), + m_pDUSessionResourceToReleaseItemRelCmd( + PX_PDU_SESSION_ID, + bit2oct( + encvalue( + m_pDUSessionResourceReleaseCommandTransfer( + m_cause_misc(m_causeMisc(-)), + -//in template (omit) PDUSessionResourceReleaseCommandTransfer.iE_Extensions p_iE_Extensions := omit + ) + ) + ), + - //in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit + ) + } + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceReleaseResponse( + -,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + -,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + ( + mw_pDUSessionResourceReleasedItemRelRes( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + (mw_pDUSessionResourceReleaseResponseTransfer(*))//template (present) PDUSessionResourceReleasedItemRelRes.pDUSessionResourceReleaseResponseTransfer p_pDUSessionResourceReleaseResponseTransfer := ?, + ), //FIXME: Decode&Match - In ASN1 it is OCTET STRING - pDUSessionResourceReleaseResponseTransfer + -//template PDUSessionResourceReleasedItemRelRes.iE_Extensions p_iE_Extensions := * + ) + + ) + }//template (present) PDUSessionResourceReleasedListRelRes p_pDUSessionResourceReleasedListRelRes := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_06 + + } // End of group PDU_Session_Resource_Release + //8.2.3 + group PDU_Session_Resource_Modify{ + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_07 + */ + function f_TC_NGAP_GNB_PDU_07() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceModify( + -, + -, + { + m_pDUSessionResourceModifyItemModReq( + PX_PDU_SESSION_ID, + bit2oct( + encvalue( + m_pDUSessionResourceModifyRequestTransfer_options( + { + m_uL_NGU_UP_TNLModifyItem( + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel( + PX_TRANSPORT_LAYER_ADDRESS, + PX_GTP_TEID, + omit + ) + ),//in template (value) UPTransportLayerInformation p_uL_NGU_UP_TNLInformation, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel( + PX_TRANSPORT_LAYER_ADDRESS, + PX_GTP_TEID, + omit + ) + ),//in template (value) UPTransportLayerInformation p_dL_NGU_UP_TNLInformation, + -//in template (omit) UL_NGU_UP_TNLModifyItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) UL_NGU_UP_TNLModifyList p_uL_NGU_UP_TNLModifyList, + { + m_qosFlowAddOrModifyRequestItem( + PX_QOS_FLOW_IDENTIFIER, + -,//in template (omit) QosFlowLevelQosParameters p_qosFlowLevelQosParameters := omit, + -,//in template (omit) E_RAB_ID p_e_RAB_ID := omit, + -//in template (omit) QosFlowAddOrModifyRequestItem.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) QosFlowAddOrModifyRequestList p_qosFlowAddOrModifyRequestList + ) + ) + ), + //'00'O,//bit2oct( + // encvalue( + // m_pDUSessionResourceModifyRequestTransfer(//FIXME when template with mandatory IEs available + // -//in template (omit) PDUSessionResourceModifyRequestTransfer.protocolIEs p_protocolIEs + // ) + // ) + //), + -,//in template (omit) NAS_PDU p_nAS_PDU := omit, + -//in template (omit) PDUSessionResourceModifyItemModReq.iE_Extensions p_iE_Extensions := omit + ) + } + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceModifyResponse( + -,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + -,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + ( + mw_pDUSessionResourceModifyItemModRes( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceModifyResponseTransfer( + *,//template UPTransportLayerInformation p_dL_NGU_UP_TNLInformation := *, + *,//template UPTransportLayerInformation p_uL_NGU_UP_TNLInformation := *, + ?,//template QosFlowAddOrModifyResponseList p_qosFlowAddOrModifyResponseList := *, + *,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + *,//template QosFlowListWithCause p_qosFlowFailedToAddOrModifyList := *, + *//template PDUSessionResourceModifyResponseTransfer.iE_Extensions p_iE_Extensions := * + ) + ),//Decode&Match - In ASN1 it is OCTET STRING pDUSessionResourceModifyResponseTransfer + -//template PDUSessionResourceModifyItemModRes.iE_Extensions p_iE_Extensions := * + ) + + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_07 + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_10 + */ + function f_TC_NGAP_GNB_PDU_10() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceModify( + -, + -, + { + m_pDUSessionResourceModifyItemModReq( + PX_PDU_SESSION_ID, + '00'O,//bit2oct( + // encvalue( + // m_pDUSessionResourceModifyRequestTransfer(//FIXME when template with mandatory IEs available + // -//in template (omit) PDUSessionResourceModifyRequestTransfer.protocolIEs p_protocolIEs + // ) + // ) + //), + -,//in template (omit) NAS_PDU p_nAS_PDU := omit, + -//in template (omit) PDUSessionResourceModifyItemModReq.iE_Extensions p_iE_Extensions := omit + ), + m_pDUSessionResourceModifyItemModReq( + PX_PDU_SESSION_ID, + '00'O,//bit2oct( + // encvalue( + // m_pDUSessionResourceModifyRequestTransfer(//FIXME when template with mandatory IEs available + // -//in template (omit) PDUSessionResourceModifyRequestTransfer.protocolIEs p_protocolIEs + // ) + // ) + //), + -,//in template (omit) NAS_PDU p_nAS_PDU := omit, + -//in template (omit) PDUSessionResourceModifyItemModReq.iE_Extensions p_iE_Extensions := omit + ) + } + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceModifyResponseFailedToMod( + -,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + -,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + mw_pDUSessionResourceFailedToModifyItemModRes( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceModifyUnsuccessfulTransfer( + ?,//template (present) Cause p_cause := ?, + *,//template CriticalityDiagnostics p_criticalityDiagnostics := *, + *//template PDUSessionResourceModifyUnsuccessfulTransfer.iE_Extensions p_iE_Extensions := * + ) + ),//Decode&Match - In ASN1 it is OCTET STRING mw_pDUSessionResourceModifyUnsuccessfulTransfer + * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_10 + + } // End of group PDU_Session_Resource_Modify + //8.2.4 + group PDU_Session_Resource_Notify{ + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_08 + */ + function f_TC_NGAP_GNB_PDU_08() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PDU session resource NOTIFY!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceNotify( + -,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + -,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + mw_pDUSessionResourceNotifyItem( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + ?,//template (present) PDUSessionResourceNotifyItem.pDUSessionResourceNotifyTransfer p_pDUSessionResourceNotifyTransfer, + -//template PDUSessionResourceNotifyItem.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_08 + + } // End of group PDU_Session_Resource_Notify + //8.2.5 + group PDU_Session_Resource_Modify_Indication{ + + /** + * @desc Testcase function for TC_NGAP_gNB_PDU_09 + */ + function f_TC_NGAP_GNB_PDU_09() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PDU session resource MODIFY!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceModifyIndication( + -,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + -,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + ( + mw_pDUSessionResourceModifyItemModInd( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceModifyIndicationTransfer( + ?,//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + *,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + *//template PDUSessionResourceModifyIndicationTransfer.iE_Extensions p_iE_Extensions := * + )//FIXME: Decode&Match - In ASN1 it is OCTET STRING - pDUSessionResourceModifyIndicationTransfer + ), + -//template PDUSessionResourceModifyItemModRes.iE_Extensions p_iE_Extensions := * + ) + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_PDU_09 + + } // End of group PDU_Session_Resource_Modify_Indication + } // End of group PDU_Session_Management_Procedures + //8.3 + group UE_Context_Management_Procedures{ + //8.3.1 + group Initial_Context_Setup{ + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_01 + */ + function f_TC_NGAP_GNB_CMP_01() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest + ( + -, + -, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + - + ) + )); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + { + PX_PDU_SESSION_ID, + ?, + * + } + } + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_01 + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_02 + */ + function f_TC_NGAP_GNB_CMP_02() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq + ( + -, + -, + m_gUAMI, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + - + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( + -, + - + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_02 + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_03 + */ + function f_TC_NGAP_GNB_CMP_03() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest_optional_TraceActivation + ( + -, + -, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + -, + m_traceActivation( + '0000000000000001'O,//in template (value) NGRANTraceID p_nGRANTraceID, + '00000000'B,//in template (value) InterfacesToTrace p_interfacesToTrace, + m_traceDepth(minimum), + PX_TRANSPORT_LAYER_ADDRESS, + omit//in template (omit) TraceActivation.iE_Extensions p_iE_Extensions := omit + ) + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + { + PX_PDU_SESSION_ID, + ?, + * + } + } + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_03 + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_04 + */ + function f_TC_NGAP_GNB_CMP_04() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest_optional_MobilityRestriction + ( + -, + -, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + -, + m_mobilityRestrictionList( + PX_PLMN_IDENTITY + ) + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + { + PX_PDU_SESSION_ID, + ?, + * + } + } + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_04 + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_05 + */ + function f_TC_NGAP_GNB_CMP_05() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest_differentOptionals + ( + -, + -, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + -, + ''O, // UERadioCapability p_uERadioCapability, + -, // IndexToRFSP p_indexToRFSP := 1, + -, + ''O, // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???)) , + + m_emergencyFallbackIndicator(emergency_fallback_requested), // EmergencyFallbackIndicator p_emergencyFallbackIndicator, + m_rRCInactiveTransitionReportRequest, // RRCInactiveTransitionReportRequest p_rRCInactiveTransitionReportRequest, + m_redirectionVoiceFallback, // RedirectionVoiceFallback p_redirectionVoiceFallback, + m_locationReportingRequestType( + direct, + cell, + { + m_areaOfInterestItem( + m_areaOfInterest, + 1, + - + ), + m_areaOfInterestItem( + m_areaOfInterest, + 1, + - + ) + }, + -, + - + ), // LocationReportingRequestType p_locationReportingRequestType, + m_sRVCCOperationPossible, // SRVCCOperationPossible p_sRVCCOperationPossible, + m_iAB_Authorized, // IAB_Authorized p_iAB_Authorized, + m_enhanced_CoverageRestriction, // Enhanced_CoverageRestriction p_enhanced_CoverageRestriction, + -, // Extended_ConnectedTime p_extended_ConnectedTime := PX_EXTENDED_CONNECTED_TIME, + m_uE_DifferentiationInfo, // UE_DifferentiationInfo p_uE_DifferentiationInfo, + m_nRUESidelinkAggregateMaximumBitrate, // NRUESidelinkAggregateMaximumBitrate p_nRUESidelinkAggregateMaximumBitrate, + m_lTEUESidelinkAggregateMaximumBitrate, // LTEUESidelinkAggregateMaximumBitrate p_lTEUESidelinkAggregateMaximumBitrate, + PX_U_E_RADIO_CAPABILITY_ID + + + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + { + PX_PDU_SESSION_ID, + ?, + * + } + } + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_05 + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_06 + */ + function f_TC_NGAP_GNB_CMP_06() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_Has_EstablishedContextInproperly(); + + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest + ( + -, + -, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + - + ) + )); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse_Failed( + -, + -, + { + { + PX_PDU_SESSION_ID, + ?, + * + } + } + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_06 + + } // End of group Initial_Context_Setup + //8.3.2 + group UE_Context_Release_Request_NG_RAN_node_initiated{ + + /** + * @desc Testcase function for TC_NGAP_GNB_CMP_07 + */ + function f_TC_NGAP_GNB_CMP_07() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + + + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger UE context release request"); + + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseRequest( + -, + -, + - + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_07 + + } // End of group UE_Context_Release_Request_NG_RAN_node_initiated + //8.3.3 + group UE_Context_Release_AMF_initiated{ + + /** + * @desc Testcase function for TP_NGAP_GNB_CMP_08 + */ + function f_TC_NGAP_GNB_CMP_08() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextReleaseCommand + ( + m_uE_NGAP_IDs_uE_NGAP_ID_pair + ( + m_uE_NGAP_ID_pair + ), + - + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_08 + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_09 + */ + function f_TC_NGAP_GNB_CMP_09() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextReleaseCommand + ( + m_uE_NGAP_IDs_aMF_UE_NGAP_ID + ( + - + ), + - + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_09 + + } // End of group UE_Context_Release_AMF_initiated + //8.3.4 + group UE_Context_Modification{ + + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_10 + */ + function f_TC_NGAP_GNB_CMP_10() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_NoLongerAvailable(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextModificationRequest + ( + -, + - + ))); + + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_UEContextModificationFailure + ( + -, + -, + - + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_10 + + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_11 + */ + function f_TC_NGAP_GNB_CMP_11() runs on aMFNGAPComponent { + + // Preamble + + + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_UE_alreadyPreparedHandover(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextModificationRequest + ( + -, + - + ))); + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContexModificationResponse + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_11 + + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_12 + */ + function f_TC_NGAP_GNB_CMP_12() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextModificationRequest_optional1 + ( + -, + -, + -, + - + ))); + + + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContexModificationResponse + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_12 + + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_13 + */ + function f_TC_NGAP_GNB_CMP_13() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextModificationRequest_optional2 + ( + -, // AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + -, // RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + -, // RANPagingPriority p_rANPagingPriority, // RAN_Paging_Priority + -, // IndexToRFSP p_indexToRFSP, // Index_to_RAT_Frequency_Selection_Priority, + m_uEAggregateMaximumBitRate, // UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate, // UE_Aggregate_Maximum_Bit_Rate containing + m_uESecurityCapabilities, // UESecurityCapabilities p_uESecurityCapabilities, // UE_Security_Capabilities containing + m_emergencyFallbackIndicator(emergency_fallback_requested), // EmergencyFallbackIndicator p_emergencyFallbackIndicator, // Emergency_Fallback_Indicator, + m_gUAMI, // GUAMI p_gUAMI, // New_GUAMI containing + m_iAB_Authorized, // IAB_Authorized p_iAB_Authorized, // IAB_Authorized, + m_pC5QoSParameters( + { m_pC5QoSFlowItem } + ),// PC5QoSParameters p_pC5QoSParameters, // PC5_QoS_Parameters containing + -, // UERadioCapabilityID p_uERadioCapabilityID := PX_U_E_RADIO_CAPABILITY_ID, // UE_Radio_Capability_ID, + - // RGLevelWirelineAccessCharacteristics p_rGLevelWirelineAccessCharacteristics // RG_Level_Wireline_Access_Characteristics + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete + ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_13 + + + } // End of group UE_Context_Modification + //8.3.5 + group RRC_Inactive_Transition_Report{ + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_14 + */ + function f_TC_NGAP_GNB_CMP_14() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_isTransitioningTo_RRC_INACTIVE(); + + // TODO: isTransitioningTo the RRC_INACTIVE + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger a RRC inactive transition report"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_RRCInactiveTransitionReport + ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + mw_rRCState(inactive), + ? + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_14 + + } // End of group RRC_Inactive_Transition_Report + //8.3.6 + group Connection_Establishment_Indication{ + } // End of group Connection_Establishment_Indication + //8.3.7 + group AMF_CP_Relocation_Indication{ + } // End of group AMF_CP_Relocation_Indication + //8.3.8 + group RAN_CP_Relocation_Indication{ + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_15 + */ + function f_TC_NGAP_GNB_CMP_15() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger a RAN CP relocation indication procedure"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_RANCPRelocationIndication + ( + PX_RAN_UE_NGAP_ID, + ?, + ?, + ?, + ? + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_15 + + } // End of group RAN_CP_Relocation_Indication + //8.3.9 + group Retrieve_UE_Information{ + } // End of group Retrieve_UE_Information + //8.3.10 + group UE_Information_Transfer{ + } // End of group UE_Information_Transfer + //8.3.11 + group UE_Context_Suspend{ + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_16 + */ + function f_TC_NGAP_GNB_CMP_16() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger a UE context suspend request"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextSuspendRequest_noPDUSession + ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_16 + + } // End of group UE_Context_Suspend + //8.3.12 + group UE_Context_Resume{ + + /** + * @desc Testcase function for f_TC_NGAP_GNB_CMP_17 + */ + function f_TC_NGAP_GNB_CMP_17() runs on aMFNGAPComponent { + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_Has_Suspended_Context(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger a UE context resume request"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextResumeRequest + ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? + ) + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_CMP_17 + } // End of group UE_Context_Resume + } // End of group UE_Context_Management_Procedures + //8.4 + group UE_Mobility_Management_Procedures{ + //8.4.1 + group Handover_Preparation{ + + function f_TC_NGAP_GNB_MMP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_HandoverRequired( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + PX_HANDOVER_TYPE, + -, + mw_targetID_targeteNB_ID, // FIXME FSCOM To be check + { + *, + mw_pDUSessionResourceItemHORqd( // TODO FSCOM Make the template more restrictive + PX_PDU_SESSION_ID + ), + * + } + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_01 + + } // End of group Handover_Preparation + //8.4.2 + group Handover_Resource_Allocation{ + + function f_TC_NGAP_GNB_MMP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequest( + -, -, -, + m_uEAggregateMaximumBitRate, + m_uESecurityCapabilities, + m_securityContext, + { + m_pDUSessionResourceSetupItemHOReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + PX_SOURCE_TO_TARGET_TRANSPARENT_CONTAINER, // FIXME FSCOM Should be a bit2oct(enc(???)) + m_gUAMI + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_HandoverRequestAcknowledge( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + *, + mw_pDUSessionResourceAdmittedItem( // TODO FSCOM Make the template more restrictive + PX_PDU_SESSION_ID + ), + * + } + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_02 + + function f_TC_NGAP_GNB_MMP_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_NoLongerAvailable(); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequest( + -, -, -, + m_uEAggregateMaximumBitRate, + m_uESecurityCapabilities, + m_securityContext, + { + m_pDUSessionResourceSetupItemHOReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + PX_SOURCE_TO_TARGET_TRANSPARENT_CONTAINER, // FIXME FSCOM Should be a bit2oct(enc(???)) + m_gUAMI + ))); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_HandoverFailure( + PX_AMF_UE_NGAP_ID + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_03 + + function f_TC_NGAP_GNB_MMP_04() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequest_full( + -, -, -, + m_uEAggregateMaximumBitRate, + m_uESecurityCapabilities, + m_securityContext, + { + m_pDUSessionResourceSetupItemHOReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + PX_SOURCE_TO_TARGET_TRANSPARENT_CONTAINER, // FIXME FSCOM Should be a bit2oct(enc(???)) + m_gUAMI, + m_coreNetworkAssistanceInformationForInactive( + m_uEIdentityIndexValue_indexLength10(PX_UE_IDENTITY_INDEX_VALUE), + -, + { + m_tAIListForInactiveItem( + m_tAI + ) + } + ), + m_newSecurityContextInd, + ''O, // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???)) + m_traceActivation( + -, -, + m_traceDepth + ), + m_rRCInactiveTransitionReportRequest, + m_redirectionVoiceFallback, + m_cNAssistedRANTuning, + m_sRVCCOperationPossible, + m_enhanced_CoverageRestriction, + m_uE_DifferentiationInfo, + m_nRV2XServicesAuthorized, + m_lTEV2XServicesAuthorized, + m_nRUESidelinkAggregateMaximumBitrate, + m_lTEUESidelinkAggregateMaximumBitrate, + m_pC5QoSParameters( + { m_pC5QoSFlowItem } + ), + m_cEmodeBrestricted, + m_uE_UP_CIoT_Support, + { PX_PLMN_IDENTITY } + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_HandoverRequestAcknowledge( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + *, + mw_pDUSessionResourceAdmittedItem( // TODO FSCOM Make the template more restrictive + PX_PDU_SESSION_ID + ), + * + } + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_04 + + function f_TC_NGAP_GNB_MMP_05() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_NoLongerAvailable(); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequest( + -, -, -, + m_uEAggregateMaximumBitRate, + m_uESecurityCapabilities, + m_securityContext, + { + m_pDUSessionResourceSetupItemHOReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_handover( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + ), + m_dataForwardingNotPossible, + m_securityIndication( + m_integrityProtectionIndication, + m_confidentialityProtectionIndication, + m_maximumIntegrityProtectedDataRate + )))))) + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + PX_SOURCE_TO_TARGET_TRANSPARENT_CONTAINER, // FIXME FSCOM Should be a bit2oct(enc(???)) + m_gUAMI + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_HandoverRequestAcknowledge( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + *, + mw_pDUSessionResourceAdmittedItem( // TODO FSCOM Make the template more restrictive + PX_PDU_SESSION_ID + ), + * + } + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_05 + + function f_TC_NGAP_GNB_MMP_06() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_NoLongerAvailable(); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequest( + -, -, -, + m_uEAggregateMaximumBitRate, + m_uESecurityCapabilities, + m_securityContext, + { + m_pDUSessionResourceSetupItemHOReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_handover_1( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel), + m_directForwardingPathAvailability + ))))) + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + PX_SOURCE_TO_TARGET_TRANSPARENT_CONTAINER, // FIXME FSCOM Should be a bit2oct(enc(???)) + m_gUAMI + ))); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_HandoverFailure( + PX_AMF_UE_NGAP_ID + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_06 + + } // End of group Handover_Resource_Allocation + //8.4.3 + group Handover_Notification{ + + function f_TC_NGAP_GNB_MMP_07() runs on aMFNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_amf_UE_MMP_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_HandoverNotify( + -, + -, + ? + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_07 + + } // End of group Handover_Notification + //8.4.4 + group Path_Switch_Request{ + + function f_TC_NGAP_GNB_MMP_08() runs on aMFNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_amf_UE_MMP_Handover_Completed(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PathSwitchRequest( + PX_RAN_UE_NGAP_ID, + PX_AMF_UE_NGAP_ID + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_08 + + } // End of group Path_Switch_Request + //8.4.5 + group Handover_Cancellation{ + + function f_TC_NGAP_GNB_MMP_09() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_Handover(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover(); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_HandoverCancel( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_09 + + } // End of group Handover_Cancellation + //8.4.6 + group Uplink_RAN_Status_Transfer{ + + function f_TC_NGAP_GNB_MMP_10() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover(); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkRANStatusTransfer( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + mw_rANStatusTransfer_TransparentContainer + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_10 + + } // End of group Uplink_RAN_Status_Transfer + //8.4.7 + group Downlink_RAN_Status_Transfer{ + } // End of group Downlink_RAN_Status_Transfer + //8.4.8 + group Handover_Success{ + } // End of group Handover_Success + //8.4.9 + group Uplink_RAN_Early_Status_Transfer{ + + function f_TC_NGAP_GNB_MMP_11() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer(); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkRANEarlyStatusTransfer( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + mw_earlyStatusTransfer_TransparentContainer + ))); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_MMP_11 + + } // End of group Uplink_RAN_Early_Status_Transfer + //8.4.10 + group Downlink_RAN_Early_Status_Transfer{ + } // End of group Downlink_RAN_Early_Status_Transfer + } // End of group UE_Mobility_Management_Procedures + //8.5 + group Paging_Procedures{ + //8.5.1 + group Paging{ + } // End of group Paging + } // End of group Paging_Procedures + //8.6 + group Transport_of_NAS_Messages_Procedures{ + //8.6.1 + group Initial_UE_Message{ + + function f_TC_NGAP_GNB_NAS_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_NAS_Initiate(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_initialUeMessage( + PX_RAN_UE_NGAP_ID + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_NAS_01 + + } // End of group Initial_UE_Message + //8.6.2 + group Downlink_NAS_Transport{ + } // End of group Downlink_NAS_Transport + //8.6.3 + group Uplink_NAS_Transport{ + + function f_TC_NGAP_GNB_NAS_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_RRC_UL_Message(); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_NAS_02 + + } // End of group Uplink_NAS_Transport + //8.6.4 + group NAS_Non_Delivery_Indication{ + + function f_TC_NGAP_GNB_NAS_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_amf_UE_RRC_UL_Message_Failure(); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_NASNonDeliveryIndication( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_GNB_NAS_03 + + } // End of group NAS_Non_Delivery_Indication + //8.6.5 + group Rerout_NAS_Request{ + } // End of group Rerout_NAS_Request + } // End of group Transport_of_NAS_Messages_Procedures + //8.7 + group Interface_Management_Procedures{ + //8.7.1 + group NG_Setup{ + + /** + * @desc Testcase function for TC_NGAP_gNB_IMP_01 + */ + function f_TC_NGAP_GNB_IMP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger NG SETUP REQUEST!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_NGSetupRequest( + ?,//template (present) GlobalRANNodeID p_globalRANNodeID := ?, + PX_RAN_NODE_NAME, + { + mw_supportedTAItem( + ?,//template (present) TAC p_tAC := ?, + { + mw_ie_broadcastPLMNItem( + ?, + ?, + * + ) + },//?,//template (present) BroadcastPLMNList p_broadcastPLMNList := ?, + *//template SupportedTAItem.iE_Extensions p_iE_Extensions := * + ) + }, + mw_pagingDRX(?) + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_IMP_01 + + } // End of group NG_Setup + //8.7.2 + group RAN_Configuration_Update{ + + /** + * @desc Testcase function for TC_NGAP_gNB_IMP_02 + */ + function f_TC_NGAP_GNB_IMP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger RAN CONFIGURATION UPDATE!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_RANConfigurationUpdate_SupportedTAList( + { + mw_supportedTAItem( + ?,//template (present) TAC p_tAC := ?, + { + mw_ie_broadcastPLMNItem( + ?, + ?, + * + ) + },//?,//template (present) BroadcastPLMNList p_broadcastPLMNList := ?, + *//template SupportedTAItem.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_IMP_02 + + } // End of group RAN_Configuration_Update + //8.7.3 + group AMF_Configuration_Update{ + + /** + * @desc Testcase function for TC_NGAP_gNB_IMP_03 + */ + function f_TC_NGAP_GNB_IMP_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_AMFConfigurationUpdate_tnl( + //NOTUSED in template (value) AMFName p_AMFName, + { m_servedGUAMIItem( + m_gUAMI( + PX_PLMN_IDENTITY, + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER, + -//in template (omit) GUAMI.iE_Extensions p_iE_Extensions := omit + ),//in template (value) GUAMI p_gUAMI, + -,//in template (omit) AMFName p_backupAMFName := omit, + -//in template (omit) ServedGUAMIItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) ServedGUAMIList p_servedGUAMIList, + //NOT USED in template (value) RelativeAMFCapacity p_relativeAMFCapacity, + { + m_pLMNSupportItem( + PX_PLMN_IDENTITY, + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) SliceSupportList p_sliceSupportList, + -//in template (omit) PLMNSupportItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) PLMNSupportList p_pLMNSupportList, + { + m_aMF_TNLAssociationToAddItem( + m_cPTransportLayerInformation_endpointIPAddress( + PX_TRANSPORT_LAYER_ADDRESS + ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, + 0,//in template (value) TNLAddressWeightFactor p_tNLAddressWeightFactor,TNLAddressWeightFactor ::= INTEGER (0..255) + -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, + -//in template (omit) AMF_TNLAssociationToAddItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) AMF_TNLAssociationToAddList p_aMF_TNLAssociationToAddList, + //NOT USED in template (value) AMF_TNLAssociationToRemoveList p_aMF_TNLAssociationToRemoveList, + { + m_aMF_TNLAssociationToUpdateItem( + m_cPTransportLayerInformation_endpointIPAddress( + PX_TRANSPORT_LAYER_ADDRESS + ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, + -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, + -,//in template (omit) TNLAddressWeightFactor p_tNLAddressWeightFactor := omit, + -//in template (omit) AMF_TNLAssociationToUpdateItem.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) AMF_TNLAssociationToUpdateList p_aMF_TNLAssociationToUpdateList//, + //NOT USED in template (value) Extended_AMFName p_extended_AMFName + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_AMFConfigurationUpdateAcknowledge_aMF_TNLAssociationSetupList( + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_IMP_03 + + /** + * @desc Testcase function for TC_NGAP_gNB_IMP_04 + */ + function f_TC_NGAP_GNB_IMP_04() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_AMFConfigurationUpdate_tnl( + //NOTUSED in template (value) AMFName p_AMFName, + { m_servedGUAMIItem( + m_gUAMI( + PX_PLMN_IDENTITY, + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER, + -//in template (omit) GUAMI.iE_Extensions p_iE_Extensions := omit + ),//in template (value) GUAMI p_gUAMI, + -,//in template (omit) AMFName p_backupAMFName := omit, + -//in template (omit) ServedGUAMIItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) ServedGUAMIList p_servedGUAMIList, + //NOT USED in template (value) RelativeAMFCapacity p_relativeAMFCapacity, + { + m_pLMNSupportItem( + PX_PLMN_IDENTITY, + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) SliceSupportList p_sliceSupportList, + -//in template (omit) PLMNSupportItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) PLMNSupportList p_pLMNSupportList, + { + m_aMF_TNLAssociationToAddItem( + m_cPTransportLayerInformation_endpointIPAddress( + PX_TRANSPORT_LAYER_ADDRESS + ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, + 0,//in template (value) TNLAddressWeightFactor p_tNLAddressWeightFactor,TNLAddressWeightFactor ::= INTEGER (0..255) + -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, + -//in template (omit) AMF_TNLAssociationToAddItem.iE_Extensions p_iE_Extensions := omit + ) + },//in template (value) AMF_TNLAssociationToAddList p_aMF_TNLAssociationToAddList, + //NOT USED in template (value) AMF_TNLAssociationToRemoveList p_aMF_TNLAssociationToRemoveList, + { + m_aMF_TNLAssociationToUpdateItem( + m_cPTransportLayerInformation_endpointIPAddress( + PX_TRANSPORT_LAYER_ADDRESS + ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, + -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, + -,//in template (omit) TNLAddressWeightFactor p_tNLAddressWeightFactor := omit, + -//in template (omit) AMF_TNLAssociationToUpdateItem.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) AMF_TNLAssociationToUpdateList p_aMF_TNLAssociationToUpdateList//, + //NOT USED in template (value) Extended_AMFName p_extended_AMFName + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_AMFConfigurationUpdateFailure( + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_IMP_04 + + } // End of group AMF_Configuration_Update + //8.7.4 + group NG_Reset{ + + /** + * @desc Testcase function for TC_NGAP_gNB_IMP_05 + */ + function f_TC_NGAP_GNB_IMP_05() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGReset( + m_cause_radioNetwork(PX_NG_SETUP_FAILURE), + m_resetType_nG_Interface( + m_resetAll(reset_all) + ) + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGResetAcknowledge + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_IMP_05 + + } // End of group NG_Reset + //8.7.5 + group Error_Indication{ + + /** + * @desc Testcase function for TC_NGAP_gNB_IMP_06 + */ + function f_TC_NGAP_GNB_IMP_06() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger ERROR INDICATION!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_ErrorIndication + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_IMP_06 + + } // End of group Error_Indication + //8.7.6 + group AMF_Status_Indication{ + } // End of group AMF_Status_Indication + //8.7.7 + group Overload_Start{ + } // End of group Overload_Start + //8.7.8 + group Overload_Stop{ + } // End of group Overload_Stop + } // End of group Interface_Management_Procedures + //8.8 + group Configuration_Transfer_Procedures{ + //8.8.1 + group Uplink_RAN_Configuration_Transfer{ + + /** + * @desc Testcase function for TC_NGAP_gNB_CTP_01 + */ + function f_TC_NGAP_GNB_CTP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger Uplink_RAN_Configuration_Transfer!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkRANConfigurationTransfer + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + } + } // End of group Uplink_RAN_Configuration_Transfer + //8.8.2 + group Downlink_RAN_Configuration_Transfer{ + + /** + * @desc Testcase function for TC_NGAP_AMF_CTP_01 + */ + function f_TC_NGAP_AMF_CTP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger Downlink_RAN_Configuration_Transfer!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkRANConfigurationTransfer + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + } + + } // End of group Downlink_RAN_Configuration_Transfer + } // End of group Configuration_Transfer_Procedures + //8.9 + group Warning_Message_Transmission_Procedures{ + //8.9.1 + group Write_Replace_Warning{ + + /** + * @desc Testcase function for TC_NGAP_gNB_WTP_01 + */ + function f_TC_NGAP_GNB_WTP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_WriteReplaceWarningRequest( + PX_MESSAGE_IDENTIFIER, + PX_SERIAL_NUMBER, + PX_REPETITION_PERIOD, + PX_NUMBER_OF_BROADCASTS_REQUESTED + ) + )); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_WriteReplaceWarningResponse( + PX_MESSAGE_IDENTIFIER, + PX_SERIAL_NUMBER + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_WTP_01 + + /** + * @desc Testcase function for TC_NGAP_gNB_WTP_02 + */ + function f_TC_NGAP_GNB_WTP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_WriteReplaceWarningRequest( + PX_MESSAGE_IDENTIFIER, // indicating value "different from already being broadcasted", + PX_SERIAL_NUMBER, //indicating value "different from already being broadcasted", + PX_REPETITION_PERIOD, + PX_NUMBER_OF_BROADCASTS_REQUESTED + ) + )); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_WriteReplaceWarningResponse( + PX_MESSAGE_IDENTIFIER, + PX_SERIAL_NUMBER + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_WTP_02 + + } // End of group Write_Replace_Warning + //8.9.2 + group PWS_Cancel{ + + /** + * @desc Testcase function for TC_NGAP_gNB_WTP_03 + */ + function f_TC_NGAP_GNB_WTP_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PWSCancelRequest( + PX_MESSAGE_IDENTIFIER, + PX_SERIAL_NUMBER + ) + )); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PWSCancelResponse( + PX_MESSAGE_IDENTIFIER, + PX_SERIAL_NUMBER + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_WTP_03 + + } // End of group PWS_Cancel + //8.9.3 + group PWS_Restart_Indication{ + + /** + * @desc Testcase function for TC_NGAP_gNB_WTP_04 + */ + function f_TC_NGAP_GNB_WTP_04() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PWS_Restart_Indication!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PWSRestartIndication( + ?,//in template (value) CellIDListForRestart p_cellIDListForRestart, + ?,//in template (value) GlobalRANNodeID p_globalRANNodeID, + ?,//in template (value) TAIListForRestart p_tAIListForRestart, + ?//in template (value) EmergencyAreaIDListForRestart p_emergencyAreaIDListForRestart + ) + ) + ); + + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_WTP_04 + + } // End of group PWS_Restart_Indication + //8.9.4 + group PWS_Failure_Indication{ + + /** + * @desc Testcase function for TC_NGAP_gNB_WTP_05 + */ + function f_TC_NGAP_GNB_WTP_05() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PWS_Failure_Indication!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PWSFailureIndication( + ?,//template (present) PWSFailedCellIDList p_pWSFailedCellIDList := ?, + ?//template (present) GlobalRANNodeID p_globalRANNodeID := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_WTP_05 + + } // End of group PWS_Failure_Indication + } // End of group Warning_Message_Transmission_Procedures + //8.10 + group NRPPa_Transport_Procedures{ + + /** + * @desc Testcase function for TC_NGAP_gNB_NTP_01 + */ + function f_TC_NGAP_GNB_NTP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger NRPPA transport procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkUEAssociatedNRPPaTransport( + ?, + ?, + ?,//template (present) RoutingID p_routingID := ?, + ?//template (present) NRPPa_PDU p_nRPPa_PDU := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_NTP_01 + + /** + * @desc Testcase function for TC_NGAP_gNB_NTP_02 + */ + function f_TC_NGAP_GNB_NTP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger NRPPA transport procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNonUEAssociatedNRPPaTransport( + ?,//template (present) RoutingID p_routingID := ?, + ?//template (present) NRPPa_PDU p_nRPPa_PDU := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_NTP_02 + + } // End of group NRPPa_Transport_Procedures + //8.11 + group Trace_Procedures{ + //8.11.1 + group Trace_Start{ + + /** + * @desc Testcase function for TC_NGAP_gNB_TRP_01 + */ + function f_TC_NGAP_GNB_TRP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_TraceStart( + -, + -, + m_traceActivation( + '0000000000000001'O,//in template (value) NGRANTraceID p_nGRANTraceID, + '00000000'B,//in template (value) InterfacesToTrace p_interfacesToTrace, + m_traceDepth(minimum), + PX_TRANSPORT_LAYER_ADDRESS, + omit//in template (omit) TraceActivation.iE_Extensions p_iE_Extensions := omit + ) + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_TraceFailureIndication( + -, + -, + ?, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_TRP_01 + + } // End of group Trace_Start + //8.11.2 + group Trace_Failure_Indication{ + } // End of group Trace_Failure_Indication + //8.11.3 + group Deactivate_Trace{ + + /** + * @desc Testcase function for TC_NGAP_gNB_TRP_02 + */ + function f_TC_NGAP_GNB_TRP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_DeactivateTrace( + -, + -, + '0000000000000001'O//in template (value) NGRANTraceID p_NGRANTraceID + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_TraceFailureIndication( + -, + -, + ?, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_TRP_02 + + } // End of group Deactivate_Trace + //8.11.4 + group Cell_Traffic_Trace{ + + /** + * @desc Testcase function for TC_NGAP_gNB_TRP_03 + */ + function f_TC_NGAP_GNB_TRP_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger CELL TRAFFIC TRACE!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_CellTrafficTrace( + ?, + ?, + ?, + ?, + ?, + ?, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_TRP_03 + + } // End of group Cell_Traffic_Trace + } // End of group Trace_Procedures + //8.12 + group Location_Reporting_Procedures{ + //8.12.1 + group Location_Reporting_Control{ + } // End of group Location_Reporting_Control + //8.12.2 + group Location_Reporting_Failure_Indication{ + + /** + * @desc Testcase function for TC_NGAP_LRP_01 + */ + function f_TC_NGAP_GNB_LRP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_LocationReportingControl( + -, + -, + m_locationReportingRequestType( + direct, + cell, + { + m_areaOfInterestItem( + m_areaOfInterest, + 1, + - + ), + m_areaOfInterestItem( + m_areaOfInterest, + 1, + - + ) + }, + -, + - + ) + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_LocationReportingFailureIndication(-,-,m_cause_radioNetwork(PX_CAUSE_MULTIPLE_LOCATION_REPORTING)) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_LRP_01 + + } // End of group Location_Reporting_Failure_Indication + //8.12.3 + group Location_Report{ + + /** + * @desc Testcase function for TC_NGAP_LRP_02 + */ + function f_TC_NGAP_GNB_LRP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_LocationReportingControl( + -, + -, + m_locationReportingRequestType(direct,cell) + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_LocationReport(-,-,-,-) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_LRP_02 + + } // End of group Location_Report + } // End of group Location_Reporting_Procedures + //8.13 + group UE_TNLA_Binding_Procedures{ + //8.13.1 + group UE_TNLA_Binding_Release{ + } // End of group UE_TNLA_Binding_Release + } // End of group UE_TNLA_Binding_Procedures + //8.14 + group UE_Radio_Capability_Management_Procedures{ + //8.14.1 + group UE_Radio_Capability_Info_Indication{ + + /** + * @desc Testcase function for TC_NGAP_gNB_URP_01 + */ + function f_TC_NGAP_GNB_URP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger UE Radio Capability Management procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UERadioCapabilityInfoIndication( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_URP_01 + + } // End of group UE_Radio_Capability_Info_Indication + //8.14.2 + group UE_Radio_Capability_Check{ + + /** + * @desc Testcase function for TC_NGAP_gNB_URP_02 + */ + function f_TC_NGAP_GNB_URP_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UERadioCapabilityCheckRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UERadioCapabilityCheckResponse( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ?// template (present) IMSVoiceSupportIndicator p_iMSVoiceSupportIndicator := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_URP_02 + + } // End of group UE_Radio_Capability_Check + //8.14.3 + group UE_Radio_Capability_ID_Mapping{ + + /** + * @desc Testcase function for TC_NGAP_gNB_URP_03 + */ + function f_TC_NGAP_GNB_URP_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger UE_RADIO_CAPABILITY_ID_MAPPING_REQUEST !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UERadioCapabilityIDMappingRequest( + ?//template (present) UERadioCapabilityID p_uERadioCapabilityID := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_URP_03 + + } // End of group UE_Radio_Capability_ID_Mapping + } // End of group UE_Radio_Capability_Management_Procedures + //8.15 + group Data_Usage_Reporting_Procedures{ + //8.15.1 + group Secondary_RAT_Data_Usage_Report{ + + /** + * @desc Testcase function for TC_NGAP_gNB_DRP_01 + */ + function f_TC_NGAP_GNB_DRP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger SECONDARY_RAT_DATA_USAGE_REPORT !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_SecondaryRATDataUsageReport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ?//template (present) PDUSessionResourceSecondaryRATUsageList p_pDUSessionResourceSecondaryRATUsageList := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_DRP_01 + + } // End of group Secondary_RAT_Data_Usage_Report + } // End of group Data_Usage_Reporting_Procedures + //8.16 + group RIM_Information_Transfer_Procedures{ + //8.16.1 + group Uplink_RIM_Information_Transfer{ + + /** + * @desc Testcase function for TC_NGAP_gNB_RIP_01 + */ + function f_TC_NGAP_GNB_RIP_01() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger a uplink RIM Information Transfer procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkRIMInformationTransfer( + ?//template (present) RIMInformationTransfer p_rIMInformationTransfer := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_gNB_RIP_01 + + } // End of group Uplink_RIM_Information_Transfer + //8.16.2 + group Downlink_RIM_Information_Transfer{ + } // End of group Downlink_RIM_Information_Transfer + } // End of group RIM_Information_Transfer_Procedures + } // End of group gNB_Role + + group aMF_Role{ + //8.2 + group PDU_Session_Management_Procedures{ + //8.2.1 + group PDU_Session_Resource_Setup{ + + /** + * @desc Testcase function for TC_NGAP_aMF_PDU_01 + */ + function f_TC_NGAP_AMF_PDU_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + //action("Trigger PDU session resource SETUP!"); + f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceSetupRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceSetupItemSUReq( + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST, + -,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_01 + + } // End of group PDU_Session_Resource_Setup + //8.2.2 + group PDU_Session_Resource_Release{ + + /** + * @desc Testcase function for TC_NGAP_AMF_PDU_02 + */ + function f_TC_NGAP_AMF_PDU_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request_await_session_establishment_response + f_NGAP_gnb_UE_PDU_SessionResourceSetup(); // f_await_session_resource_setup_request_send_session_resource_setup_response + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PDU session resource RELEASE!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceReleaseCommand( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceToReleaseItemRelCmd( + PX_PDU_SESSION_ID, + ?,//decmatch(mw_pDUSessionResourceReleaseCommandTransfer(?,-)),OCTETSTRING + -//in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit + ) + } + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_02 + + } // End of group PDU_Session_Resource_Release + //8.2.3 + group PDU_Session_Resource_Modify{ + + /** + * @desc Testcase function for TC_NGAP_AMF_PDU_03 + */ + function f_TC_NGAP_AMF_PDU_03() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PDU session resource MODIFY!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceModify( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceModifyItemModReq( + PX_PDU_SESSION_ID, + ?,//decmatch(mw_pDUSessionResourceModifyRequestTransfer(*)),OCTETSTRING + -,//template NAS_PDU p_nAS_PDU := *, + -//template PDUSessionResourceModifyItemModReq.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_03 + + } // End of group PDU_Session_Resource_Modify + //8.2.4 + group PDU_Session_Resource_Notify{ + } // End of group PDU_Session_Resource_Notify + //8.2.5 + group PDU_Session_Resource_Modify_Indication{ + + /** + * @desc Testcase function for TC_NGAP_AMF_PDU_04 + */ + function f_TC_NGAP_AMF_PDU_04() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceModifyIndication( + PX_AMF_UE_NGAP_ID,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + PX_RAN_UE_NGAP_ID,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + m_pDUSessionResourceModifyItemModInd( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + bit2oct(encvalue( + m_pDUSessionResourceModifyIndicationTransfer( + m_qosFlowPerTNLInformation( + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel( + PX_TRANSPORT_LAYER_ADDRESS, + PX_GTP_TEID, + omit + ) + ), + { + m_associatedQosFlowItem( + PX_QOS_FLOW_IDENTIFIER, + omit, + omit + ) + },//in template (value) AssociatedQosFlowList p_associatedQosFlowList, + omit//in template (omit) QosFlowPerTNLInformation.iE_Extensions p_iE_Extensions := omit + ),//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + omit,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + omit//template PDUSessionResourceModifyIndicationTransfer.iE_Extensions p_iE_Extensions := * + ))), + omit//template PDUSessionResourceModifyItemModRes.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceModifyConfirm( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceModifyItemModCfm( + PX_PDU_SESSION_ID, + decmatch( + mw_pDUSessionResourceModifyConfirmTransfer( + ?,//template (present) QosFlowModifyConfirmList p_qosFlowModifyConfirmList := ?, + ?,//template (present) UPTransportLayerInformation p_uLNGU_UP_TNLInformation := ?, + -,//template UPTransportLayerInformationPairList p_additionalNG_UUPTNLInformation := *, + -,//template QosFlowListWithCause p_qosFlowFailedToModifyList := *, + -//template PDUSessionResourceModifyConfirmTransfer.iE_Extensions p_iE_Extensions := * + ) + ),// OCTETSTRING + -//template PDUSessionResourceModifyItemModCfm.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_04 + + /** + * @desc Testcase function for TC_NGAP_AMF_PDU_05 + */ + function f_TC_NGAP_AMF_PDU_05() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceModifyIndication( + PX_AMF_UE_NGAP_ID,//template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + PX_RAN_UE_NGAP_ID,//template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + { + ( + m_pDUSessionResourceModifyItemModInd( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + bit2oct(encvalue( + m_pDUSessionResourceModifyIndicationTransfer( + m_qosFlowPerTNLInformation( + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel( + PX_TRANSPORT_LAYER_ADDRESS, + PX_GTP_TEID, + omit + ) + ), + { + m_associatedQosFlowItem( + PX_QOS_FLOW_IDENTIFIER, + omit, + omit + ) + },//in template (value) AssociatedQosFlowList p_associatedQosFlowList, + omit//in template (omit) QosFlowPerTNLInformation.iE_Extensions p_iE_Extensions := omit + ),//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + omit,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + omit//template PDUSessionResourceModifyIndicationTransfer.iE_Extensions p_iE_Extensions := * + ))), + omit//template PDUSessionResourceModifyItemModRes.iE_Extensions p_iE_Extensions := * + ) + ) + } + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + //? //FIXME missing template mw_n2_PDUSessionResourceFailedToModifyListModCfm + mw_n2_PDUSessionResourceModifyConfirm_failed( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceFailedToModifyItemModCfm( + PX_PDU_SESSION_ID,//template (present) PDUSessionID p_pDUSessionID := ?, + decmatch( + mw_pDUSessionResourceModifyIndicationUnsuccessfulTransfer( + ?,//template (present) Cause p_cause := ?, + -//template PDUSessionResourceModifyIndicationUnsuccessfulTransfer.iE_Extensions p_iE_Extensions := * + )//OCTETSTRINGtemplate (present) PDUSessionResourceFailedToModifyItemModCfm.pDUSessionResourceModifyIndicationUnsuccessfulTransfer p_pDUSessionResourceModifyIndicationUnsuccessfulTransfer := ?, + ), + *//template PDUSessionResourceFailedToModifyItemModCfm.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_05 + + } // End of group PDU_Session_Resource_Modify_Indication + } // End of group PDU_Session_Management_Procedures + //8.3 + group UE_Context_Management_Procedures{ + //8.3.1 + group Initial_Context_Setup{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_01 + */ + function f_TC_NGAP_AMF_CMP_01() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger a PDU initial context setup procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + mw_gUAMI + ( + PX_PLMN_IDENTITY, + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER, + * + )/*, + { + mw_pDUSessionResourceSetupItemCxtReq + ( + PX_PDU_SESSION_ID, + mw_s_NSSAI + ( + PX_SST + ), + ?, + *, + * + ) + }, + ?, + ?, + ? */ + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_01 + + } // End of group Initial_Context_Setup + //8.3.2 + group UE_Context_Release_Request_NG_RAN_node_initiated{ + } // End of group UE_Context_Release_Request_NG_RAN_node_initiated + //8.3.3 + group UE_Context_Release_AMF_initiated{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_02 + */ + function f_TC_NGAP_AMF_CMP_02() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger a UE context release command!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand( + mw_uE_NGAP_IDs_uE_NGAP_ID_pair( + mw_uE_NGAP_ID_pair ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + * + + ))))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + } // End of function f_TC_NGAP_AMF_CMP_02 + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_03 + */ + function f_TC_NGAP_AMF_CMP_03() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger a UE context release command!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand( + mw_uE_NGAP_IDs_uE_NGAP_ID_pair( + mw_uE_NGAP_ID_pair ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + * + )), + mw_cause_radioNetwork(PX_UE_CONTEXT_RELEASE_COMMAND_CAUSE) + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_03 + + + } // End of group UE_Context_Release_AMF_initiated + //8.3.4 + group UE_Context_Modification{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_04 + */ + function f_TC_NGAP_AMF_CMP_04() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + // TODO: hasEstablishedInitialContext + if (not(f_NGAP_gnb_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly + f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + return; + } + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger a PDU UE context modification procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextModificationRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_04 + + + } // End of group UE_Context_Modification + //8.3.5 + group RRC_Inactive_Transition_Report{ + } // End of group RRC_Inactive_Transition_Report + //8.3.6 + group Connection_Establishment_Indication{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_05 + */ + function f_TC_NGAP_AMF_CMP_05() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger a PDU UE context modification procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_ConnectionEstablishmentIndication( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_05 + + } // End of group Connection_Establishment_Indication + + //8.3.7 + group AMF_CP_Relocation_Indication{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_06 + */ + function f_TC_NGAP_AMF_CMP_06() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + action("Trigger a AMF CP relocation indication procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_AMFCPRelocationIndication( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_06 + + } // End of group AMF_CP_Relocation_Indication + //8.3.8 + group RAN_CP_Relocation_Indication{ + } // End of group RAN_CP_Relocation_Indication + //8.3.9 + group Retrieve_UE_Information{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_07 + */ + function f_TC_NGAP_AMF_CMP_07() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_RetrieveUEInformation( + m_fiveG_S_TMSI( // FiveG_S_TMSI + PX_AMF_SET_ID, + PX_AMF_POINTER, + '00000001'O, + omit + )))); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEInformationTransfer( + mw_fiveG_S_TMSI( + PX_AMF_SET_ID, + PX_AMF_POINTER, + ?, + * + )))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_07 + } // End of group Retrieve_UE_Information + //8.3.10 + group UE_Information_Transfer{ + } // End of group UE_Information_Transfer + //8.3.11 + group UE_Context_Suspend{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_08 + */ + function f_TC_NGAP_AMF_CMP_08() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextSuspendRequest( + -, + -, + { + m_pDUSessionResourceSuspendItemSUSReq( + -, + bit2oct( + encvalue( + m_uEContextSuspendRequestTransfer + )), + - + ) + } + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextSuspendResponse + )); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_08 + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_09 + */ + function f_TC_NGAP_AMF_CMP_09() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_NGAP_gnb_UE_HasPendingDataTransmission(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextSuspendRequest( + -, + -, + { + m_pDUSessionResourceSuspendItemSUSReq( + -, + bit2oct( + encvalue( + m_uEContextSuspendRequestTransfer(-,-) + )), + - + ) + } + ))); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_UEContextSuspendFailure( + ?, + ?, + ? + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_09 + + } // End of group UE_Context_Suspend + //8.3.12 + group UE_Context_Resume{ + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_10 + */ + function f_TC_NGAP_AMF_CMP_10() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + if (not(f_NGAP_gnb_UE_Has_Suspended_Context())) { + f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + return; + } + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextResumeRequest + )); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextResumeResponse( + ?, + ? + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_10 + + /** + * @desc Testcase function for TP_NGAP_AMF_CMP_11 + */ + function f_TC_NGAP_AMF_CMP_11() runs on gNBNGAPComponent { + + // Local variables + + // Preamble + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + if (not(f_NGAP_gnb_UE_Has_Suspended_Context())) { + f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + return; + } + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextResumeRequest + )); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_UEContextResumeFailure( + ?, + ?, + ? + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_CMP_11 + + + } // End of group UE_Context_Resume + } // End of group UE_Context_Management_Procedures + //8.4 + group UE_Mobility_Management_Procedures{ + //8.4.1 + group Handover_Preparation{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_01 + */ + function f_TC_NGAP_AMF_MMP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequired( + -, -, -, -, + m_targetID_targetRANNodeID( + m_targetRANNodeID( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + -, + PX_GNB_ID + )), + m_tAI + )), + { + m_pDUSessionResourceItemHORqd( + -, + ''O // FIXME FSCOM Shall be bit2oct(encvalue(???)) + ) + }, + ''O // FIXME FSCOM Shall be bit2oct(encvalue(???)) + ))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_HandoverCommand( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + -, + ?/* FIXME FSCOM { + m_pDUSessionResourceHandoverItem( + bit2oct(encvalue(m_handoverCommandTransfer(???)))) + }*/ + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_01 + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_02 + */ + function f_TC_NGAP_AMF_MMP_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_NGAP_gnb_UE_Not_Available(); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverRequired( + -, -, -, -, + m_targetID_targetRANNodeID( + m_targetRANNodeID( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + -, + PX_GNB_ID + )), + m_tAI + )), + { + m_pDUSessionResourceItemHORqd( + -, + ''O // FIXME FSCOM Shall be bit2oct(encvalue(???)) + ) + }, + ''O // FIXME FSCOM Shall be bit2oct(encvalue(???)) + ))); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_HandoverFailure( + PX_AMF_UE_NGAP_ID + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_02 + + } // End of group Handover_Preparation + //8.4.2 + group Handover_Resource_Allocation{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_03 + */ + function f_TC_NGAP_AMF_MMP_03() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_03 + + } // End of group Handover_Resource_Allocation + //8.4.3 + group Handover_Notification{ + } // End of group Handover_Notification + //8.4.4 + group Path_Switch_Request{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_04 + */ + function f_TC_NGAP_AMF_MMP_04() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_04 + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_05 + */ + function f_TC_NGAP_AMF_MMP_05() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_05 + + } // End of group Path_Switch_Request + //8.4.5 + group Handover_Cancellation{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_06 + */ + function f_TC_NGAP_AMF_MMP_06() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_HandoverCancel + )); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_HandoverCancelAcknowledge + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_06 + + } // End of group Handover_Cancellation + //8.4.6 + group Uplink_RAN_Status_Transfer{ + } // End of group Uplink_RAN_Status_Transfer + //8.4.7 + group Downlink_RAN_Status_Transfer{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_07 + */ + function f_TC_NGAP_AMF_MMP_07() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("the IUT entity indicate a Downlink RAN Status Transfer procedure"); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkRANStatusTransfer( + -, + -, + mw_rANStatusTransfer_TransparentContainer( + { + *, + mw_dRBsSubjectToStatusTransferItem( + PX_DRB_ID, + mw_dRBStatusUL_dRBStatusUL12, + mw_dRBStatusDL_dRBStatusDL12 + ), + * + } + )))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_07 + + } // End of group Downlink_RAN_Status_Transfer + //8.4.8 + group Handover_Success{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_08 + */ + function f_TC_NGAP_AMF_MMP_08() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("the IUT entity indicate the initiation \"of an UE handover success procedure\""); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_HandoverSuccess + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_08 + + } // End of group Handover_Success + //8.4.9 + group Uplink_RAN_Early_Status_Transfer{ + } // End of group Uplink_RAN_Early_Status_Transfer + //8.4.10 + group Downlink_RAN_Early_Status_Transfer{ + + /** + * @desc Testcase function for TC_NGAP_aMF_MMP_09 + */ + function f_TC_NGAP_AMF_MMP_09() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("the IUT entity indicate a Downlink RAN Early Status Transfer procedure"); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkRANEarlyStatusTransfer( + -, + -, + mw_earlyStatusTransfer_TransparentContainer( + mw_procedureStageChoice_firstDLCount( + mw_firstDLCount( + { + *, + mw_dRBsSubjectToEarlyStatusTransfer_Item( + PX_DRB_ID, + mw_dRBStatusDL_dRBStatusDL12 + ), + * + } + )))))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_MMP_09 + + } // End of group Downlink_RAN_Early_Status_Transfer + } // End of group UE_Mobility_Management_Procedures + //8.5 + group Paging_Procedures{ + //8.5.1 + group Paging{ + + /** + * @desc Testcase function for TC_NGAP_AMF_PAG_01 + */ + function f_TC_NGAP_AMF_PAG_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger Paging!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_Paging( + mw_uEPagingIdentity_fiveG_S_TMSI( + mw_fiveG_S_TMSI(-,-,-,-) + ),{ + mw_tAIListForPagingItem( + mw_tAI(-,-,-) + )} + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + } + + } // End of group Paging + } // End of group Paging_Procedures + //8.6 + group Transport_of_NAS_Messages_Procedures{ + //8.6.1 + group Initial_UE_Message{ + } // End of group Initial_UE_Message + //8.6.2 + group Downlink_NAS_Transport{ + + /** + * @desc Testcase function for TC_NGAP_AMF_NAS_01 + */ + function f_TC_NGAP_AMF_NAS_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_initialUeMessage( + -, + ''O, // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???)) + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + )) + ))); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_RerouteNASRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ''O // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???))) + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_NAS_01 + + } // End of group Downlink_NAS_Transport + //8.6.3 + group Uplink_NAS_Transport{ + } // End of group Uplink_NAS_Transport + //8.6.4 + group NAS_Non_Delivery_Indication{ + } // End of group NAS_Non_Delivery_Indication + //8.6.5 + group Rerout_NAS_Request{ + + /** + * @desc Testcase function for TC_NGAP_AMF_NAS_02 + */ + function f_TC_NGAP_AMF_NAS_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_initialUeMessage( + -, + ''O, // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???)) + m_uPTransportLayerInformation_userLocationInformationEUTRA( + m_userLocationInformationEUTRA( + m_uUTRA_CGI, + m_tAI + )) + ))); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ''O // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???))) + ))); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_NAS_02 + + } // End of group Rerout_NAS_Request + } // End of group Transport_of_NAS_Messages_Procedures + //8.7 + group Interface_Management_Procedures{ + //8.7.1 + group NG_Setup{ + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_01 + */ + function f_TC_NGAP_AMF_IMP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + PX_PLMN_IDENTITY, + PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + ) + ), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + }, + PX_PAGING_DRX + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + ?, + { + mw_servedGUAMIItem( + mw_gUAMI( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + ?,//template (present) AMFRegionID p_aMFRegionID := ?, + ?,//template (present) AMFSetID p_aMFSetID := ?, + ?,//template (present) AMFPointer p_aMFPointer := ?, + *//template GUAMI.iE_Extensions p_iE_Extensions := * + ),//template (present) GUAMI p_gUAMI := ?, + *,//template AMFName p_backupAMFName := *, + *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) ServedGUAMIList p_servedGUAMIList := ?, + ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + { + mw_pLMNSupportItem( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + { + mw_sliceSupportItem( + mw_s_NSSAI( + ?,//template (present) SST p_sST := ?, + *,//template SD p_sD := *, + *//template S_NSSAI.iE_Extensions p_iE_Extensions := * + ),//template (present) S_NSSAI p_s_NSSAI := ?, + ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) SliceSupportList p_sliceSupportList := ?, + *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * + ) + }//template (present) PLMNSupportList p_plmnSuppList := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_01 + + /** + * @desc Testcase function for TC_NGAP_AMF_IMP_02 + */ + function f_TC_NGAP_AMF_IMP_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + PX_PLMN_IDENTITY, + PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + ) + ), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + }, + PX_PAGING_DRX + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_NGSetupFailure( + ?//template (present) Cause p_cause := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_02 + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_03 + */ + function f_TC_NGAP_AMF_IMP_03() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest_UERetentionInf( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + PX_PLMN_IDENTITY, + '0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + ) + ), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + }, + PX_PAGING_DRX, + m_uERetentionInformation(-)//UERetention_Information template m_uERetentionInformation(in UERetentionInformation p_value := ues_retained) + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse_UERetentionInf( + ?, + { + mw_servedGUAMIItem( + mw_gUAMI( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + ?,//template (present) AMFRegionID p_aMFRegionID := ?, + ?,//template (present) AMFSetID p_aMFSetID := ?, + ?,//template (present) AMFPointer p_aMFPointer := ?, + *//template GUAMI.iE_Extensions p_iE_Extensions := * + ),//template (present) GUAMI p_gUAMI := ?, + *,//template AMFName p_backupAMFName := *, + *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) ServedGUAMIList p_servedGUAMIList := ?, + ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + { + mw_pLMNSupportItem( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + { + mw_sliceSupportItem( + mw_s_NSSAI( + ?,//template (present) SST p_sST := ?, + *,//template SD p_sD := *, + *//template S_NSSAI.iE_Extensions p_iE_Extensions := * + ),//template (present) S_NSSAI p_s_NSSAI := ?, + ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) SliceSupportList p_sliceSupportList := ?, + *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) PLMNSupportList p_plmnSuppList := ? + ?//UERetention_Information template mw_uERetentionInformation(template (present) UERetentionInformation p_value := ues_retained) + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_03 + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_04 + */ + function f_TC_NGAP_AMF_IMP_04() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest_ExtRanNodeName( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + PX_PLMN_IDENTITY, + '0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + ) + ), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + }, + PX_PAGING_DRX, + m_nB_IoT_DefaultPagingDRX(-),//NB_IoT_Default_Paging_DRX, + m_extended_RANNodeName( + -,//in template (omit) RANNodeNameVisibleString p_rANNodeNameVisibleString := omit, + -,//in template (omit) RANNodeNameUTF8String p_rANNodeNameUTF8String := omit, + -//in template (omit) Extended_RANNodeName.iE_Extensions p_iE_Extensions := omit + )//Extended_RAN_Node_Name containing RAN_Node_Name_Visible;;; m_extended_RANNodeName... + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse_ExtAmfName( + ?, + { + mw_servedGUAMIItem( + mw_gUAMI( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + ?,//template (present) AMFRegionID p_aMFRegionID := ?, + ?,//template (present) AMFSetID p_aMFSetID := ?, + ?,//template (present) AMFPointer p_aMFPointer := ?, + *//template GUAMI.iE_Extensions p_iE_Extensions := * + ),//template (present) GUAMI p_gUAMI := ?, + *,//template AMFName p_backupAMFName := *, + *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) ServedGUAMIList p_servedGUAMIList := ?, + ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + { + mw_pLMNSupportItem( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + { + mw_sliceSupportItem( + mw_s_NSSAI( + ?,//template (present) SST p_sST := ?, + *,//template SD p_sD := *, + *//template S_NSSAI.iE_Extensions p_iE_Extensions := * + ),//template (present) S_NSSAI p_s_NSSAI := ?, + ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) SliceSupportList p_sliceSupportList := ?, + *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) PLMNSupportList p_plmnSuppList := ? + ?//Extended_RAN_Node_Name containing RAN_Node_Name_Visible;;; mw_extended_RANNodeName... + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_04 + + } // End of group NG_Setup + //8.7.2 + group RAN_Configuration_Update{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_05 + */ + function f_TC_NGAP_AMF_IMP_05() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_RANConfigurationUpdate_SupportedTAList( + //template (value) SupportedTAList + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_RANConfigurationUpdateAcknowledge + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_05 + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_06 + */ + function f_TC_NGAP_AMF_IMP_06() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_RANConfigurationUpdate_SupportedTAList( + //template (value) SupportedTAList + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_RANConfigurationUpdateFailure( + ?//template (present) Cause p_cause := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_06 + + } // End of group RAN_Configuration_Update + //8.7.3 + group AMF_Configuration_Update{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_07 + */ + function f_TC_NGAP_AMF_IMP_07() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger AMF CONFIGURATION UPDATE !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_AMFConfigurationUpdate_options( + ?,//template (present) AMFName p_aMFName := ? + { + mw_servedGUAMIItem( + mw_gUAMI( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + ?,//template (present) AMFRegionID p_aMFRegionID := ?, + ?,//template (present) AMFSetID p_aMFSetID := ?, + ?,//template (present) AMFPointer p_aMFPointer := ?, + *//template GUAMI.iE_Extensions p_iE_Extensions := * + ),//template (present) GUAMI p_gUAMI := ?, + *,//template AMFName p_backupAMFName := *, + *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) ServedGUAMIList p_servedGUAMIList := ?, + { + mw_pLMNSupportItem( + ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + { + mw_sliceSupportItem( + mw_s_NSSAI( + ?,//template (present) SST p_sST := ?, + *,//template SD p_sD := *, + *//template S_NSSAI.iE_Extensions p_iE_Extensions := * + ),//template (present) S_NSSAI p_s_NSSAI := ?, + ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * + ) + },//template (present) SliceSupportList p_sliceSupportList := ?, + *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * + ) + }//template (present) PLMNSupportList p_plmnSuppList := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_07 + + } // End of group AMF_Configuration_Update + //8.7.4 + group NG_Reset{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_08 + */ + function f_TC_NGAP_AMF_IMP_08() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGReset( + m_cause_misc(m_causeMisc(-)),//in template (value) Cause p_cause, + m_resetType_nG_Interface( + m_resetAll(reset_all) + )//in template (value) ResetType p_resetType + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGResetAcknowledge + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_08 + + } // End of group NG_Reset + //8.7.5 + group Error_Indication{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_09 + */ + function f_TC_NGAP_AMF_IMP_09() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest( + -, + -, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + - + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_ErrorIndication_ids( + ?, + ?, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_09 + + } // End of group Error_Indication + //8.7.6 + group AMF_Status_Indication{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_10 + */ + function f_TC_NGAP_AMF_IMP_10() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger AMF STATUS INDICATION !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_AMFStatusIndication( + { + mw_unavailableGUAMIItem( + mw_gUAMI( + ?, + ?, + ?, + ?, + * + ),//template (present) GUAMI p_gUAMI := ?, + *,//template TimerApproachForGUAMIRemoval p_timerApproachForGUAMIRemoval := *, + *,//template AMFName p_backupAMFName := *, + *//template UnavailableGUAMIItem.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_10 + + } // End of group AMF_Status_Indication + //8.7.7 + group Overload_Start{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_11 + */ + function f_TC_NGAP_AMF_IMP_11() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger OVERLOAD START !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_OverloadStart_NSSAIList(?) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_11 + + } // End of group Overload_Start + //8.7.8 + group Overload_Stop{ + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_12 + */ + function f_TC_NGAP_AMF_IMP_12() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger OVERLOAD STOP !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_OverloadStop + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_12 + + } // End of group Overload_Stop + } // End of group Interface_Management_Procedures + //8.8 + group Configuration_Transfer_Procedures{ + //8.8.1 + group Uplink_RAN_Configuration_Transfer{ + } // End of group Uplink_RAN_Configuration_Transfer + //8.8.2 + group Downlink_RAN_Configuration_Transfer{ + } // End of group Downlink_RAN_Configuration_Transfer + } // End of group Configuration_Transfer_Procedures + //8.9 + group Warning_Message_Transmission_Procedures{ + //8.9.1 + group Write_Replace_Warning{ + + /** + * @desc Testcase function for TC_NGAP_aMF_WTP_01 + */ + function f_TC_NGAP_AMF_WTP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger WRITE REPLACE WARNING REQUEST !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_WriteReplaceWarningRequest( + ?,// template (present) MessageIdentifier p_messageIdentifier :=?, + ?,// template (present) SerialNumber p_serialNumber := ?, + ?,// template (present) RepetitionPeriod p_repetitionPeriod := ?, + ?// template (present) NumberOfBroadcastsRequested p_numberOfBroadcastsRequested := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_WTP_01 + + } // End of group Write_Replace_Warning + //8.9.2 + group PWS_Cancel{ + + /** + * @desc Testcase function for TC_NGAP_aMF_WTP_02 + */ + function f_TC_NGAP_AMF_WTP_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger PWS CANCEL REQUEST !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PWSCancelRequest( + ?,//template (present) MessageIdentifier p_messageIdentifier := ?, + ?// template (present) SerialNumber p_serialNumber := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_WTP_02 + + } // End of group PWS_Cancel + //8.9.3 + group PWS_Restart_Indication{ + } // End of group PWS_Restart_Indication + //8.9.4 + group PWS_Failure_Indication{ + } // End of group PWS_Failure_Indication + } // End of group Warning_Message_Transmission_Procedures + //8.10 + group NRPPa_Transport_Procedures{ + + /** + * @desc Testcase function for TC_NGAP_aMF_NTP_01 + */ + function f_TC_NGAP_AMF_NTP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger DOWNLINK_UE_ASSOCIATED_NRPPA_TRANSPORT !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkUEAssociatedNRPPaTransport( + ?,//template (present) AMF_UE_NGAP_ID p_AMF_UE_NGAP_ID := ?, + ?,//template (present) RAN_UE_NGAP_ID p_rAN_UE_NGAP_ID := ?, + ?,//template (present) RoutingID p_routingID := ?, + ?//template (present) NRPPa_PDU p_nRPPa_PDU := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_NTP_01 + + /** + * @desc Testcase function for TC_NGAP_aMF_NTP_02 + */ + function f_TC_NGAP_AMF_NTP_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger DOWNLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNonUEAssociatedNRPPaTransport( + ?,//template (present) RoutingID p_routingID := ?, + ?//template (present) NRPPa_PDU p_nRPPa_PDU := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_NTP_02 + + } // End of group NRPPa_Transport_Procedures + //8.11 + group Trace_Procedures{ + //8.11.1 + group Trace_Start{ + + /** + * @desc Testcase function for TC_NGAP_aMF_TRP_01 + */ + function f_TC_NGAP_AMF_TRP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger TRACE START!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_TraceStart( + ?, + ?, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_TRP_01 + + } // End of group Trace_Start + //8.11.2 + group Trace_Failure_Indication{ + } // End of group Trace_Failure_Indication + //8.11.3 + group Deactivate_Trace{ + + /** + * @desc Testcase function for TC_NGAP_aMF_TRP_02 + */ + function f_TC_NGAP_AMF_TRP_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger DEACTIVATE TRACE!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DeactivateTrace( + ?, + ?, + ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_TRP_02 + + } // End of group Deactivate_Trace + //8.11.4 + group Cell_Traffic_Trace{ + } // End of group Cell_Traffic_Trace + } // End of group Trace_Procedures + //8.12 + group Location_Reporting_Procedures{ + //8.12.1 + group Location_Reporting_Control{ + + /** + * @desc Testcase function for TC_NGAP_AMF_LRP_01 + */ + function f_TC_NGAP_AMF_LRP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger Location Reporting Control procedure!"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_LocationReportingControl(-,-,-) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_LRP_01 + + } // End of group Location_Reporting_Control + //8.12.2 + group Location_Reporting_Failure_Indication{ + } // End of group Location_Reporting_Failure_Indication + //8.12.3 + group Location_Report{ + } // End of group Location_Report + } // End of group Location_Reporting_Procedures + //8.13 + group UE_TNLA_Binding_Procedures{ + //8.13.1 + group UE_TNLA_Binding_Release{ + + /** + * @desc Testcase function for TC_NGAP_aMF_UBP_01 + */ + function f_TC_NGAP_AMF_UBP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger UE TNLA BINDING procedure !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UETNLABindingReleaseRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_UBP_01 + + } // End of group UE_TNLA_Binding_Release + } // End of group UE_TNLA_Binding_Procedures + //8.14 + group UE_Radio_Capability_Management_Procedures{ + //8.14.1 + group UE_Radio_Capability_Info_Indication{ + } // End of group UE_Radio_Capability_Info_Indication + //8.14.2 + group UE_Radio_Capability_Check{ + + /** + * @desc Testcase function for TC_NGAP_aMF_URP_01 + */ + function f_TC_NGAP_AMF_URP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger UE RADIO CAPABILITY CHECK management procedure !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UERadioCapabilityCheckRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_URP_01 + + } // End of group UE_Radio_Capability_Check + //8.14.3 + group UE_Radio_Capability_ID_Mapping{ + + /** + * @desc Testcase function for TC_NGAP_aMF_URP_02 + */ + function f_TC_NGAP_AMF_URP_02() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UERadioCapabilityIDMappingRequest( + '0000000000'O//in template (value) UERadioCapabilityID p_uERadioCapabilityID == OCTETSTRING + ) + ) + ); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UERadioCapabilityIDMappingResponse( + ?,//template (present) UERadioCapabilityID p_uERadioCapabilityID := ?, + ?//template (present) UERadioCapability p_uERadioCapability := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_URP_02 + + } // End of group UE_Radio_Capability_ID_Mapping + } // End of group UE_Radio_Capability_Management_Procedures + //8.15 + group Data_Usage_Reporting_Procedures{ + //8.15.1 + group Secondary_RAT_Data_Usage_Report{ + } // End of group Secondary_RAT_Data_Usage_Report + } // End of group Data_Usage_Reporting_Procedures + //8.16 + group RIM_Information_Transfer_Procedures{ + //8.16.1 + group Uplink_RIM_Information_Transfer{ + } // End of group Uplink_RIM_Information_Transfer + //8.16.2 + group Downlink_RIM_Information_Transfer{ + + /** + * @desc Testcase function for TC_NGAP_aMF_RIP_01 + */ + function f_TC_NGAP_AMF_RIP_01() runs on gNBNGAPComponent { + // Local variables + + // Preamble + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + action("Trigger RIM Information Transfer procedure !"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkRIMInformationTransfer( + ?//template (present) RIMInformationTransfer p_rIMInformationTransfer := ? + ) + ) + ); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_RIP_01 + + } // End of group Downlink_RIM_Information_Transfer + } // End of group RIM_Information_Transfer_Procedures + } // End of group aMF_Role + +} // End of module NGAP_TCFunctions \ No newline at end of file diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn new file mode 100644 index 0000000..92e314e --- /dev/null +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -0,0 +1,3756 @@ +/** + * @author ETSI / TTF033 + * @version $URL$ + * $Id$ + * @desc This module provides test cases for NGAP tests. + * @copyright ETSI Copyright Notification + * No part may be reproduced except as authorized by written permission. + * The copyright and the foregoing restriction extend to reproduction in all media. + * All rights reserved. + * @see ETSI TS 138 413 / 3GPP TS 38.413 version 16.12 Release 16 + */ +module NGAP_TestCases { + + // LibCommon + import from LibCommon_Sync all ; + + // LibNGAP + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_CommonDataTypes language "ASN.1:2002" all; + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_PDU_Contents language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from NGAP_Containers language "ASN.1:2002" all; + + import from LibNGAP_TypesAndValues all; + import from LibNGAP_Templates all; + import from LibNGAP_Pixits all; + + // AtsNGAP + import from LibNGAP_TypesAndValues all; + import from NGAP_TestConfiguration all; + import from NGAP_TestSystem all; + import from NGAP_TCFunctions all; + import from NGAP_Pics all; + + group gNB_Role{ + + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) 8.1 List of NGAP Elementary Procedures + */ + group PDU_Session_Management_Procedures{ + + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) 8.2.1 PDU Session Resource Setup + */ + group PDU_Session_Resource_Setup{ + + /** + * @desc Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE SETUP REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE SETUP RESPONSE for successfully established PDU session + */ + testcase TC_NGAP_GNB_PDU_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_01 + + /** + * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value." + */ + testcase TC_NGAP_GNB_PDU_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_02 + + /** + * @desc Test objective "Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP " + */ + testcase TC_NGAP_GNB_PDU_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_03 + + /** + * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a QoS Flow Setup Request List IE in the PDU Session Resource Setup Request Transfer IE including at least one Non-GBR QoS flow but the PDU Session Aggregate Maximum Bit Rate IE is not present. " + */ + testcase TC_NGAP_GNB_PDU_04() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_04 + + } // End of group PDU_Session_Resource_Setup + + //8.2.2 + group PDU_Session_Resource_Release{ + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND contains mandatory IEs and answers with PDU SESSION RESOURCE RELEASE RESPONSE to release PDU session." + */ + testcase TC_NGAP_GNB_PDU_05() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_05 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND containing multiple PDU Session ID IEs set to the same value and ignore the duplication." + */ + testcase TC_NGAP_GNB_PDU_06() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_06 + + } // End of group PDU_Session_Resource_Release + //8.2.3 + group PDU_Session_Resource_Modify{ + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE MODIFY REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE MODIFY RESPONSE for successfully modified PDU session." + */ + testcase TC_NGAP_GNB_PDU_07() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_07()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_07 + + /** + * @desc Test objective "Verify that the NG-RAN node reports the modification of the corresponding PDU session as failed if a PDU SESSION RESOURCE MODIFY REQUEST contains several PDU Session ID IEs set to the same value." + */ + testcase TC_NGAP_GNB_PDU_10() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_10()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_10 + + + + } // End of group PDU_Session_Resource_Modify + //8.2.4 + group PDU_Session_Resource_Notify{ + + /** + * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_NOTIFY that already established QoS flow or PDU session for given UE are release." + */ + testcase TC_NGAP_GNB_PDU_08() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_08()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_08 + + } // End of group PDU_Session_Resource_Notify + //8.2.5 + group PDU_Session_Resource_Modify_Indication{ + + /** + * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_INDICATION to request modification of established PDU session." + */ + testcase TC_NGAP_GNB_PDU_09() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_PDU_09()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_PDU_09 + + } // End of group PDU_Session_Resource_Modify_Indication + } // End of group PDU_Session_Management_Procedures + //8.3 + group UE_Context_Management_Procedures{ + //8.3.1 + group Initial_Context_Setup{ + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains optional PDU Session Resource Setup Request List field mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + */ + testcase TC_NGAP_GNB_CMP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_01 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + */ + testcase TC_NGAP_GNB_CMP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_02 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Trace Activation and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + */ + testcase TC_NGAP_GNB_CMP_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_03 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Mobility Restriction List and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + */ + testcase TC_NGAP_GNB_CMP_04() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_04 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with different optional fields and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + */ + testcase TC_NGAP_GNB_CMP_05() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_05 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with failed PDU session." + */ + testcase TC_NGAP_GNB_CMP_06() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_06 + + } // End of group Initial_Context_Setup + //8.3.2 + group UE_Context_Release_Request_NG_RAN_node_initiated{ + + /** + * @desc Test objective "Verify that the NG-RAN node successfully requests the AMF to release the UE-associated logical NG-connection." + */ + testcase TC_NGAP_GNB_CMP_07() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_2)) { + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_07()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_07 + + } // End of group UE_Context_Release_Request_NG_RAN_node_initiated + //8.3.3 + group UE_Context_Release_AMF_initiated{ + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND that contains both the AMF UE NGAP ID IE and the RAN UE NGAP ID IE and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context."" + */ + testcase TC_NGAP_GNB_CMP_08() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_08()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_08 + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND where only the AMF UE NGAP ID IE is available and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context." + */ + testcase TC_NGAP_GNB_CMP_09() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_09()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_09 + + } // End of group UE_Context_Release_AMF_initiated + //8.3.4 + group UE_Context_Modification{ + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION FAILURE because the UE is no longer available." + */ + testcase TC_NGAP_GNB_CMP_10() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_10()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_10 + + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." + */ + testcase TC_NGAP_GNB_CMP_11() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_11()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_11 + + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains optional fields Security Key and Security Capabilities and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." + */ + testcase TC_NGAP_GNB_CMP_12() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_12()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_12 + + + /** + * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains different optional fields and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." + */ + testcase TC_NGAP_GNB_CMP_13() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_13()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_13 + + + } // End of group UE_Context_Modification + //8.3.5 + group RRC_Inactive_Transition_Report{ + + /** + * @desc Test objective "Verify that the IUT can send a RRC INACTIVE TRANSITION REPORT that contains mandatory IEs" + */ + testcase TC_NGAP_GNB_CMP_14() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_14()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_14 + + } // End of group RRC_Inactive_Transition_Report + //8.3.6 + group Connection_Establishment_Indication{ + } // End of group Connection_Establishment_Indication + //8.3.7 + group AMF_CP_Relocation_Indication{ + } // End of group AMF_CP_Relocation_Indication + //8.3.8 + group RAN_CP_Relocation_Indication{ + + /** + * @desc Test objective "Verify that the IUT can send a RAN CP Relocation Indication that contains mandatory IEs" + */ + testcase TC_NGAP_GNB_CMP_15() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_8)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_8' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_15()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_15 + + } // End of group RAN_CP_Relocation_Indication + //8.3.9 + group Retrieve_UE_Information{ + } // End of group Retrieve_UE_Information + //8.3.10 + group UE_Information_Transfer{ + } // End of group UE_Information_Transfer + //8.3.11 + group UE_Context_Suspend{ + + /** + * @desc Test objective "Verify that the IUT can send a UE CONTEXT SUSPEND REQUEST contains mandatory IEs" + */ + testcase TC_NGAP_GNB_CMP_16() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_11)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_11' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_16()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_16 + } // End of group UE_Context_Suspend + //8.3.12 + group UE_Context_Resume{ + + /** + * @desc Test objective "Verify that the IUT can send a UE CONTEXT RESUME REQUEST contains mandatory IEs" + */ + testcase TC_NGAP_GNB_CMP_17() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_12)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_12' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_17()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CMP_17 + + } // End of group UE_Context_Resume + } // End of group UE_Context_Management_Procedures + //8.4 + group UE_Mobility_Management_Procedures{ + //8.4.1 + group Handover_Preparation{ + + /** + * @desc Verify that the IUT can send a HANDOVER REQUIRED message containing mandatory IEs. + */ + testcase TC_NGAP_GNB_MMP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_01 + + } // End of group Handover_Preparation + //8.4.2 + group Handover_Resource_Allocation{ + + /** + * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. + */ + testcase TC_NGAP_GNB_MMP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_02 + + /** + * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST FAILURE because the UE is not longer available. + */ + testcase TC_NGAP_GNB_MMP_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_03 + + /** + * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. + */ + testcase TC_NGAP_GNB_MMP_04() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_04 + + /** + * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs within the Handover Request Transfer IEs and answers with correct HANDOVER REQUEST ACKNOWLEDGE. + */ + testcase TC_NGAP_GNB_MMP_05() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_05 + + /** + * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message for an intra-system handover and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. + */ + testcase TC_NGAP_GNB_MMP_06() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_06 + + } // End of group Handover_Resource_Allocation + //8.4.3 + group Handover_Notification{ + + /** + * @desc Verify that the AMF node successfully sends a HANDOVER NOTIFICATION message that contains mandatory IEs to the AMF. + */ + testcase TC_NGAP_GNB_MMP_07() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_07()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_07 + + } // End of group Handover_Notification + //8.4.4 + group Path_Switch_Request{ + + /** + * @desc Verify that the AMF node successfully sends a PATH SWITCH REQUEST message that contains mandatory IEs to the AMF. + */ + testcase TC_NGAP_GNB_MMP_08() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_08()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_08 + + } // End of group Path_Switch_Request + //8.4.5 + group Handover_Cancellation{ + + /** + * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. + */ + testcase TC_NGAP_GNB_MMP_09() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_09()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_09 + + } // End of group Handover_Cancellation + //8.4.6 + group Uplink_RAN_Status_Transfer{ + + /** + * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. + */ + testcase TC_NGAP_GNB_MMP_10() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_6)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_6' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_10()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_10 + + } // End of group Uplink_RAN_Status_Transfer + //8.4.7 + group Downlink_RAN_Status_Transfer{ + } // End of group Downlink_RAN_Status_Transfer + //8.4.8 + group Handover_Success{ + } // End of group Handover_Success + //8.4.9 + group Uplink_RAN_Early_Status_Transfer{ + + /** + * @desc Verify that the NG-RAN node successfully sends a UPLINK RAN EARLY STATUS TRANSFER message to the AMF. + */ + testcase TC_NGAP_GNB_MMP_11() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_9)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_9' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_MMP_11()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_MMP_11 + + } // End of group Uplink_RAN_Early_Status_Transfer + //8.4.10 + group Downlink_RAN_Early_Status_Transfer{ + } // End of group Downlink_RAN_Early_Status_Transfer + } // End of group UE_Mobility_Management_Procedures + //8.5 + group Paging_Procedures{ + //8.5.1 + group Paging{ + } // End of group Paging + } // End of group Paging_Procedures + //8.6 + group Transport_of_NAS_Messages_Procedures{ + //8.6.1 + group Initial_UE_Message{ + + /** + * @desc Verify that the IUT can send an INITIAL UE MESSAGE to indicate the initiation of a NAS Transport procedure. + */ + testcase TC_NGAP_GNB_NAS_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_NAS_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_NAS_01 + + } // End of group Initial_UE_Message + //8.6.2 + group Downlink_NAS_Transport{ + } // End of group Downlink_NAS_Transport + //8.6.3 + group Uplink_NAS_Transport{ + + /** + * @desc Verify that the IUT can send an UPLINK NAS TRANSPORT message to the AMF. + */ + testcase TC_NGAP_GNB_NAS_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_NAS_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_NAS_02 + + } // End of group Uplink_NAS_Transport + //8.6.4 + group NAS_Non_Delivery_Indication{ + + /** + * @desc Verify that the IUT can send a NAS NON DELIVERY INDICATION message to the AMF. + */ + testcase TC_NGAP_GNB_NAS_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_NAS_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_NAS_03 + + } // End of group NAS_Non_Delivery_Indication + //8.6.5 + group Rerout_NAS_Request{ + } // End of group Rerout_NAS_Request + } // End of group Transport_of_NAS_Messages_Procedures + //8.7 + group Interface_Management_Procedures{ + //8.7.1 + group NG_Setup{ + + /** + * @desc "Verify that the GNB node successfully sends a NG SETUP REQEST message to the AMF." + */ + testcase TC_NGAP_GNB_IMP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_01 + + } // End of group NG_Setup + //8.7.2 + group RAN_Configuration_Update{ + + /** + * @desc "Verify that the IUT can send a RAN CONFIGURATION UPDATE message to the AMF." + */ + testcase TC_NGAP_GNB_IMP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_02 + + } // End of group RAN_Configuration_Update + //8.7.3 + group AMF_Configuration_Update{ + + /** + * @desc "Verify that the GNB node successfully processes a AMF CONFIGURATION UPDATE message with AMF CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update." + */ + testcase TC_NGAP_GNB_IMP_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_03 + + /** + * @desc "Verify that the GNB node can send a AMF CONFIGURATION UPDATE FAILURE." + */ + testcase TC_NGAP_GNB_IMP_04() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_04 + + } // End of group AMF_Configuration_Update + //8.7.4 + group NG_Reset{ + + /** + * @desc "Verify that the GNB node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset." + */ + testcase TC_NGAP_GNB_IMP_05() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_05 + + } // End of group NG_Reset + //8.7.5 + group Error_Indication{ + + /** + * @desc "Verify that the GNB can send a ERROR INDICATION to the AMF when a error occurs." + */ + testcase TC_NGAP_GNB_IMP_06() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_06 + + } // End of group Error_Indication + //8.7.6 + group AMF_Status_Indication{ + } // End of group AMF_Status_Indication + //8.7.7 + group Overload_Start{ + } // End of group Overload_Start + //8.7.8 + group Overload_Stop{ + } // End of group Overload_Stop + } // End of group Interface_Management_Procedures + //8.8 + group Configuration_Transfer_Procedures{ + //8.8.1 + group Uplink_RAN_Configuration_Transfer{ + + /** + * @desc Verify that the IUT can send an Uplink RAN Configuration Transfer message to transfer RAN configuration information to the AMF. + */ + testcase TC_NGAP_GNB_CTP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_7_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_7_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_CTP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_CTP_01 + + } // End of group Uplink_RAN_Configuration_Transfer + //8.8.2 + group Downlink_RAN_Configuration_Transfer{ + + /** + * @desc Verify that the IUT can send an DOWNLINK RAN CONFIGURATION TRANSFER message to transfer RAN configuration information to the NG-RAN. + */ + testcase TC_NGAP_AMF_CTP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_7_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_7_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CTP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + } // End of testcase TC_NGAP_AMF_CTP_01 + } // End of group Downlink_RAN_Configuration_Transfer + } // End of group Configuration_Transfer_Procedures + //8.9 + group Warning_Message_Transmission_Procedures{ + + //8.9.1 + group Write_Replace_Warning{ + + /** + * @desc Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing mandatory IEs and answers with WRITE-REPLACE WARNING RESPONSE to start broadcasting of warning messages. + */ + testcase TC_NGAP_GNB_WTP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_WTP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_WTP_01 + + /** + * @desc "Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing Message Identifier IE and/or Serial Number IE different from those in the warning message being broadcast and if Concurent Warning Message Indicator is not present then IUT node answers with WRITE-REPLACE WARNING RESPONSE and replaces the warning message being broadcast with newly received one for that area." + */ + testcase TC_NGAP_GNB_WTP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_WTP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_WTP_02 + + } // End of group Write_Replace_Warning + //8.9.2 + group PWS_Cancel{ + + /** + * @desc "Verify that the NG-RAN node successfully processes a PWS CANCEL REQUEST containing mandatory IEs and answers with PWS CANCEL RESPONSE to cancel an already ongoing broadcast warning messages in all of the cells in the NG-RAN." + */ + testcase TC_NGAP_GNB_WTP_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_WTP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_WTP_03 + + } // End of group PWS_Cancel + //8.9.3 + group PWS_Restart_Indication{ + + /** + * @desc "Verify that the IUT can send a PWS RESTART INDICATION to inform AMF that PWS information for some or all cells may be reloaded from the CBC if needed." + */ + testcase TC_NGAP_GNB_WTP_04() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_WTP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_WTP_04 + + } // End of group PWS_Restart_Indication + //8.9.4 + group PWS_Failure_Indication{ + + /** + * @desc "Verify that the IUT can send a PWS FAILURE INDICATION to inform AMF that ongoing PWS operation for one or more cells has failed." + */ + testcase TC_NGAP_GNB_WTP_05() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_WTP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_WTP_05 + + } // End of group PWS_Failure_Indication + } // End of group Warning_Message_Transmission_Procedures + + //8.10 + group NRPPa_Transport_Procedures{ + + /** + * @desc "Verify that the IUT can send a UPLINK_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." + */ + testcase TC_NGAP_GNB_NTP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_9_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_NTP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_NTP_01 + + /** + * @desc "Verify that the IUT can send a UPLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." + */ + testcase TC_NGAP_GNB_NTP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_9_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_NTP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_NTP_02 + + } // End of group NRPPa_Transport_Procedures + //8.11 + group Trace_Procedures{ + //8.11.1 + group Trace_Start{ + + /** + * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that Trace Start procedure has failed due to an interaction with handover procedure." + */ + testcase TC_NGAP_GNB_TRP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_1) and (not PICS_A3_10_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_1 and PICS_A3_10_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_TRP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_TRP_01 + + } // End of group Trace_Start + //8.11.2 + group Trace_Failure_Indication{ + } // End of group Trace_Failure_Indication + //8.11.3 + group Deactivate_Trace{ + + /** + * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that a Deactivate Trace procedure has failed due to an interaction with handover procedure." + */ + testcase TC_NGAP_GNB_TRP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_2) and (not PICS_A3_10_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_2 and PICS_A3_10_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_TRP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_TRP_02 + + } // End of group Deactivate_Trace + //8.11.4 + group Cell_Traffic_Trace{ + + /** + * @desc Test objective "Verify that the IUT can send a CELL_TRAFFIC_TRACE to send the allocated Trace Recording Session Reference and Trace Reference to AMF." + */ + testcase TC_NGAP_GNB_TRP_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_TRP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_TRP_03 + + } // End of group Cell_Traffic_Trace + } // End of group Trace_Procedures + //8.12 + group Location_Reporting_Procedures{ + //8.12.1 + group Location_Reporting_Control{ + } // End of group Location_Reporting_Control + //8.12.2 + group Location_Reporting_Failure_Indication{ + + /** + * @desc "Verify that the IUT can send a LOCATION REPORTING FAILURE INDICATION message after that contains mandatory IEs receiving a LOCATION REPORTING CONTROL message with two identical Location Reporting Reference IDs." + */ + testcase TC_NGAP_GNB_LRP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_11_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_LRP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_LRP_01 + + } // End of group Location_Reporting_Failure_Indication + //8.12.3 + group Location_Report{ + + /** + * @desc "Verify that the IUT can send a LOCATION REPORT message that contains mandatory IEs to provide the UE's current location." + */ + testcase TC_NGAP_GNB_LRP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_11_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_LRP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_LRP_02 + + } // End of group Location_Report + } // End of group Location_Reporting_Procedures + //8.13 + group UE_TNLA_Binding_Procedures{ + //8.13.1 + group UE_TNLA_Binding_Release{ + } // End of group UE_TNLA_Binding_Release + } // End of group UE_TNLA_Binding_Procedures + //8.14 + group UE_Radio_Capability_Management_Procedures{ + //8.14.1 + group UE_Radio_Capability_Info_Indication{ + + /** + * @desc Test objective "Verify that the IUT can send a UE_RADIO_CAPABILITY_INFO_INDICATION." + */ + testcase TC_NGAP_GNB_URP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_URP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_URP_01 + + } // End of group UE_Radio_Capability_Info_Indication + //8.14.2 + group UE_Radio_Capability_Check{ + + /** + * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY CHECK RESPONSE message that contains mandatory IEs to provide the UE radio capabilities." + */ + testcase TC_NGAP_GNB_URP_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_URP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_URP_02 + + } // End of group UE_Radio_Capability_Check + //8.14.3 + group UE_Radio_Capability_ID_Mapping{ + + /** + * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING REQUEST." + */ + testcase TC_NGAP_GNB_URP_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_URP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_URP_03 + + } // End of group UE_Radio_Capability_ID_Mapping + } // End of group UE_Radio_Capability_Management_Procedures + //8.15 + group Data_Usage_Reporting_Procedures{ + //8.15.1 + group Secondary_RAT_Data_Usage_Report{ + + /** + * @desc Test objective "Verify that the IUT can send a SECONDARY RAT DATA USAGE REPORT." + */ + testcase TC_NGAP_GNB_DRP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_14_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_14_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_DRP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_DRP_01 + + } // End of group Secondary_RAT_Data_Usage_Report + } // End of group Data_Usage_Reporting_Procedures + //8.16 + group RIM_Information_Transfer_Procedures{ + //8.16.1 + group Uplink_RIM_Information_Transfer{ + + /** + * @desc Test objective "Verify that the IUT can send a UPLINK RIM INFORMATION TRANSFER." + */ + testcase TC_NGAP_GNB_RIP_01() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_15_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_15_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_RIP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_RIP_01 + + } // End of group Uplink_RIM_Information_Transfer + //8.16.2 + group Downlink_RIM_Information_Transfer{ + } // End of group Downlink_RIM_Information_Transfer + } // End of group RIM_Information_Transfer_Procedures + } // End of group gNB_Role + + group aMF_Role{ + //8.2 + group PDU_Session_Management_Procedures{ + //8.2.1 + group PDU_Session_Resource_Setup{ + + /** + * @desc "Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session." + */ + testcase TC_NGAP_AMF_PDU_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_01 + + } // End of group PDU_Session_Resource_Setup + //8.2.2 + group PDU_Session_Resource_Release{ + + /** + * @desc "Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session." + */ + testcase TC_NGAP_AMF_PDU_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_02 + + } // End of group PDU_Session_Resource_Release + //8.2.3 + group PDU_Session_Resource_Modify{ + + /** + * @desc "Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session." + */ + testcase TC_NGAP_AMF_PDU_03() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_03 + + } // End of group PDU_Session_Resource_Modify + //8.2.4 + group PDU_Session_Resource_Notify{ + } // End of group PDU_Session_Resource_Notify + //8.2.5 + group PDU_Session_Resource_Modify_Indication{ + + /** + * @desc "Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session." + */ + testcase TC_NGAP_AMF_PDU_04() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_04 + + /** + * @desc "Verify that the AMF node processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for not successfully modified PDU session." + */ + testcase TC_NGAP_AMF_PDU_05() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_05 + + } // End of group PDU_Session_Resource_Modify_Indication + } // End of group PDU_Session_Management_Procedures + //8.3 + group UE_Context_Management_Procedures{ + //8.3.1 + group Initial_Context_Setup{ + + /** + * @desc "Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed." + */ + testcase TC_NGAP_AMF_CMP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_01 + + } // End of group Initial_Context_Setup + //8.3.2 + group UE_Context_Release_Request_NG_RAN_node_initiated{ + } // End of group UE_Context_Release_Request_NG_RAN_node_initiated + //8.3.3 + group UE_Context_Release_AMF_initiated{ + + /** + * @desc "Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID." + */ + testcase TC_NGAP_AMF_CMP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_02 + + /** + * @desc "Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons." + */ + testcase TC_NGAP_AMF_CMP_03() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_03 + + + } // End of group UE_Context_Release_AMF_initiated + //8.3.4 + group UE_Context_Modification{ + + /** + * @desc "Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs." + */ + testcase TC_NGAP_AMF_CMP_04() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_04 + + } // End of group UE_Context_Modification + //8.3.5 + group RRC_Inactive_Transition_Report{ + } // End of group RRC_Inactive_Transition_Report + //8.3.6 + group Connection_Establishment_Indication{ + + /** + * @desc "Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs." + */ + testcase TC_NGAP_AMF_CMP_05() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_6)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_6' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_05 + + } // End of group Connection_Establishment_Indication + //8.3.7 + group AMF_CP_Relocation_Indication{ + + /** + * @desc "Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs." + */ + testcase TC_NGAP_AMF_CMP_06() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_7)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_6' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_06 + + + } // End of group AMF_CP_Relocation_Indication + //8.3.8 + group RAN_CP_Relocation_Indication{ + } // End of group RAN_CP_Relocation_Indication + //8.3.9 + group Retrieve_UE_Information{ + + /** + * @desc "Verify that the IUT can successfully request UE information from the AMF." + */ + testcase TC_NGAP_AMF_CMP_07() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_10)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_10' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_07()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_07 + } // End of group Retrieve_UE_Information + //8.3.10 + group UE_Information_Transfer{ + } // End of group UE_Information_Transfer + //8.3.11 + group UE_Context_Suspend{ + + /** + * @desc "Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST contains mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context." + */ + testcase TC_NGAP_AMF_CMP_08() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_11' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_08()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_08 + + /** + * @desc "Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST contains mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension." + */ + testcase TC_NGAP_AMF_CMP_09() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_11' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_09()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_09 + + } // End of group UE_Context_Suspend + //8.3.12 + group UE_Context_Resume{ + + /** + * @desc "Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context." + */ + testcase TC_NGAP_AMF_CMP_10() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_12' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_10()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_10 + + /** + * @desc "Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context." + */ + testcase TC_NGAP_AMF_CMP_11() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_12' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_11()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_CMP_11 + + + } // End of group UE_Context_Resume + } // End of group UE_Context_Management_Procedures + //8.4 + group UE_Mobility_Management_Procedures{ + //8.4.1 + group Handover_Preparation{ + + /** + * @desc "Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER COMMAND with successfully handover." + */ + testcase TC_NGAP_AMF_MMP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_01 + + /** + * @desc "Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER PREPARATION FAILURE because the UE is not longer available." + */ + testcase TC_NGAP_AMF_MMP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_02 + + } // End of group Handover_Preparation + //8.4.2 + group Handover_Resource_Allocation{ + + /** + * @desc "Verify that the AMF node successfully sends a HANDOVER REQUEST message that contains mandatory IEs to the GNB." + */ + testcase TC_NGAP_AMF_MMP_03() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_03 + + } // End of group Handover_Resource_Allocation + //8.4.3 + group Handover_Notification{ + } // End of group Handover_Notification + //8.4.4 + group Path_Switch_Request{ + + /** + * @desc "Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and answers with PATH SWITCH REQUEST ACKNOWLEDGE to acknowledge the path switch." + */ + testcase TC_NGAP_AMF_MMP_04() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_04 + + /** + * @desc "Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and two PDU Sessions with same ID and answers with PATH SWITCH REQUEST FAILURE." + */ + testcase TC_NGAP_AMF_MMP_05() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_05 + + } // End of group Path_Switch_Request + //8.4.5 + group Handover_Cancellation{ + + /** + * @desc "Verify that the AMF node successfully processes a HANDOVER CANCEL message that contains mandatory IEs and answers with HANDOVER CANCEL ACKNOWLEDGE to confirm that the ongoing handover was cancelled." + */ + testcase TC_NGAP_AMF_MMP_06() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_06 + + } // End of group Handover_Cancellation + //8.4.6 + group Uplink_RAN_Status_Transfer{ + } // End of group Uplink_RAN_Status_Transfer + //8.4.7 + group Downlink_RAN_Status_Transfer{ + + /** + * @desc "Verify that the AMF node successfully sends a DOWNLINK RAN STATUS TRANSFER message that contains mandatory IEs." + */ + testcase TC_NGAP_AMF_MMP_07() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_6)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_6' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_07()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_07 + + } // End of group Downlink_RAN_Status_Transfer + //8.4.8 + group Handover_Success{ + + /** + * @desc "Verify that the NG-RAN node successfully sends a Handover Success message to the AMF." + */ + testcase TC_NGAP_AMF_MMP_08() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A3_3_8)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A3_3_8' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_08()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_08 + + } // End of group Handover_Success + //8.4.9 + group Uplink_RAN_Early_Status_Transfer{ + } // End of group Uplink_RAN_Early_Status_Transfer + //8.4.10 + group Downlink_RAN_Early_Status_Transfer{ + + /** + * @desc "Verify that the AMF node successfully sends a DOWNLINK RAN EARLY STATUS TRANSFER message that contains mandatory IEs." + */ + testcase TC_NGAP_AMF_MMP_09() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_9)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_3_9' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_09()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_MMP_09 + + } // End of group Downlink_RAN_Early_Status_Transfer + + } // End of group UE_Mobility_Management_Procedures + //8.5 + group Paging_Procedures{ + //8.5.1 + group Paging{ + + /** + * @desc "Verify that the IUT can send a PAGING message to enable the AMF to page a UE." + */ + testcase TC_NGAP_aMF_PAG_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_4_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_4_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PAG_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + } // End of testcase TC_NGAP_aMF_PAG_01 + + } // End of group Paging + } // End of group Paging_Procedures + //8.6 + group Transport_of_NAS_Messages_Procedures{ + //8.6.1 + group Initial_UE_Message{ + } // End of group Initial_UE_Message + //8.6.2 + group Downlink_NAS_Transport{ + + /** + * @desc "Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface." + */ + testcase TC_NGAP_AMF_NAS_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_5_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_5_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_NAS_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_NAS_01 + + } // End of group Downlink_NAS_Transport + //8.6.3 + group Uplink_NAS_Transport{ + } // End of group Uplink_NAS_Transport + //8.6.4 + group NAS_Non_Delivery_Indication{ + } // End of group NAS_Non_Delivery_Indication + //8.6.5 + group Rerout_NAS_Request{ + + + /** + * @desc "Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF." + */ + testcase TC_NGAP_AMF_NAS_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_5_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_5_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_NAS_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_NAS_02 + + } // End of group Rerout_NAS_Request + } // End of group Transport_of_NAS_Messages_Procedures + //8.7 + group Interface_Management_Procedures{ + //8.7.1 + group NG_Setup{ + + /** + * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup." + */ + testcase TC_NGAP_AMF_IMP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_01 + + /** + * @desc "Verify that the AMF node successfully decline a NG RESET REQEST message and answers with NG SETUP FAILURE when the AMF is not able to handle the request." + */ + testcase TC_NGAP_AMF_IMP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_02 + + /** + * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup." + */ + testcase TC_NGAP_AMF_IMP_03() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_03 + + /** + * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup." + */ + testcase TC_NGAP_AMF_IMP_04() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_04()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_04 + + } // End of group NG_Setup + //8.7.2 + group RAN_Configuration_Update{ + + /** + * @desc "Verify that the AMF node successfully processes a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update." + */ + testcase TC_NGAP_AMF_IMP_05() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_05()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_05 + + /** + * @desc "Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request." + */ + testcase TC_NGAP_AMF_IMP_06() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_06()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_06 + + } // End of group RAN_Configuration_Update + //8.7.3 + group AMF_Configuration_Update{ + + /** + * @desc "Verify that the IUT can send a AMF CONFIGURATION UPDATE message to the AMF." + */ + testcase TC_NGAP_AMF_IMP_07() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_07()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_07 + + } // End of group AMF_Configuration_Update + //8.7.4 + group NG_Reset{ + + /** + * @desc "Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset." + */ + testcase TC_NGAP_AMF_IMP_08() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_08()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_08 + + } // End of group NG_Reset + //8.7.5 + group Error_Indication{ + + /** + * @desc "Verify that the AMF can send a ERROR INDICATION to the GNB when a error occurs." + */ + testcase TC_NGAP_AMF_IMP_09() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_5)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_5' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_09()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_09 + + } // End of group Error_Indication + //8.7.6 + group AMF_Status_Indication{ + + /** + * @desc "Verify that the AMF can send a AMF STATUS INDICATION to the GNB when a error occurs." + */ + testcase TC_NGAP_AMF_IMP_10() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_6)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_6' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_10()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_10 + + } // End of group AMF_Status_Indication + //8.7.7 + group Overload_Start{ + + /** + * @desc "Verify that the AMF can send a OVERLOAD START to the GNB." + */ + testcase TC_NGAP_AMF_IMP_11() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_7)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_7' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_11()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_11 + + } // End of group Overload_Start + //8.7.8 + group Overload_Stop{ + + /** + * @desc "Verify that the AMF can send a OVERLOAD STOP to the GNB." + */ + testcase TC_NGAP_AMF_IMP_12() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_8)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_8' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_12()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_12 + + } // End of group Overload_Stop + } // End of group Interface_Management_Procedures + //8.8 + group Configuration_Transfer_Procedures{ + //8.8.1 + group Uplink_RAN_Configuration_Transfer{ + } // End of group Uplink_RAN_Configuration_Transfer + //8.8.2 + group Downlink_RAN_Configuration_Transfer{ + } // End of group Downlink_RAN_Configuration_Transfer + } // End of group Configuration_Transfer_Procedures + //8.9 + group Warning_Message_Transmission_Procedures{ + //8.9.1 + group Write_Replace_Warning{ + + /** + * @desc "Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages." + */ + testcase TC_NGAP_AMF_WTP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_8_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_8_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_WTP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_WTP_01 + + } // End of group Write_Replace_Warning + //8.9.2 + group PWS_Cancel{ + + /** + * @desc "Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages." + */ + testcase TC_NGAP_AMF_WTP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_8_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_8_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_WTP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_WTP_02 + + } // End of group PWS_Cancel + //8.9.3 + group PWS_Restart_Indication{ + } // End of group PWS_Restart_Indication + //8.9.4 + group PWS_Failure_Indication{ + } // End of group PWS_Failure_Indication + } // End of group Warning_Message_Transmission_Procedures + //8.10 + group NRPPa_Transport_Procedures{ + + /** + * @desc "Verify that the IUT can send a DOWNLINK UE ASSOCIATED NRPPA TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." + */ + testcase TC_NGAP_AMF_NTP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_9_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_9_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_NTP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_NTP_01 + + /** + * @desc "Verify that the IUT can send a DOWNLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." + */ + testcase TC_NGAP_AMF_NTP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_9_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_9_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_NTP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_NTP_02 + + } // End of group NRPPa_Transport_Procedures + //8.11 + group Trace_Procedures{ + //8.11.1 + group Trace_Start{ + + /** + * @desc "Verify that the IUT can send a TRACE_START to initiate a trace session for a UE." + */ + testcase TC_NGAP_AMF_TRP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_10_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_10_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_TRP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_TRP_01 + + } // End of group Trace_Start + //8.11.2 + group Trace_Failure_Indication{ + } // End of group Trace_Failure_Indication + //8.11.3 + group Deactivate_Trace{ + + /** + * @desc "Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE." + */ + testcase TC_NGAP_AMF_TRP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_10_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_10_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_TRP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_TRP_02 + + } // End of group Deactivate_Trace + //8.11.4 + group Cell_Traffic_Trace{ + } // End of group Cell_Traffic_Trace + } // End of group Trace_Procedures + //8.12 + group Location_Reporting_Procedures{ + //8.12.1 + group Location_Reporting_Control{ + + /** + * @desc "Verify that the IUT can send a LOCATION REPORTING CONTROL message that contains mandatory IEs to request a report of the UE's current location." + */ + testcase TC_NGAP_AMF_LRP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_11_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_11_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_LRP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } + } // End of group Location_Reporting_Control + //8.12.2 + group Location_Reporting_Failure_Indication{ + } // End of group Location_Reporting_Failure_Indication + //8.12.3 + group Location_Report{ + } // End of group Location_Report + } // End of group Location_Reporting_Procedures + //8.13 + group UE_TNLA_Binding_Procedures{ + //8.13.1 + group UE_TNLA_Binding_Release{ + + /** + * @desc "Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure." + */ + testcase TC_NGAP_AMF_UBP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_12_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_12_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_UBP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_UBP_01 + + } // End of group UE_TNLA_Binding_Release + } // End of group UE_TNLA_Binding_Procedures + //8.14 + group UE_Radio_Capability_Management_Procedures{ + //8.14.1 + group UE_Radio_Capability_Info_Indication{ + } // End of group UE_Radio_Capability_Info_Indication + //8.14.2 + group UE_Radio_Capability_Check{ + + /** + * @desc "Verify that the IUT can send a UE RADIO CAPABILITY CHECK REQUEST to initiate UE Radio Capability Management procedure." + */ + testcase TC_NGAP_AMF_URP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_13_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_13_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_URP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_URP_01 + + } // End of group UE_Radio_Capability_Check + //8.14.3 + group UE_Radio_Capability_ID_Mapping{ + + /** + * @desc "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping." + */ + testcase TC_NGAP_AMF_URP_02() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_13_3)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_13_3' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_URP_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_URP_02 + + } // End of group UE_Radio_Capability_ID_Mapping + } // End of group UE_Radio_Capability_Management_Procedures + //8.15 + group Data_Usage_Reporting_Procedures{ + //8.15.1 + group Secondary_RAT_Data_Usage_Report{ + } // End of group Secondary_RAT_Data_Usage_Report + } // End of group Data_Usage_Reporting_Procedures + //8.16 + group RIM_Information_Transfer_Procedures{ + //8.16.1 + group Uplink_RIM_Information_Transfer{ + } // End of group Uplink_RIM_Information_Transfer + //8.16.2 + group Downlink_RIM_Information_Transfer{ + + /** + * @desc "Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER." + */ + testcase TC_NGAP_AMF_RIP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_15_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_15_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_RIP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_RIP_01 + + } // End of group Downlink_RIM_Information_Transfer + } // End of group RIM_Information_Transfer_Procedures + } // End of group aMF_Role + +} // End of module NGAP_TestCases diff --git a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn index d30f0d5..ec32877 100644 --- a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn @@ -15,7 +15,7 @@ module NGAP_TestConfiguration { import from LibCommon_Sync all; import from LibCommon_VerdictControl all; - // NGAP_Ats + // AtsNGAP import from NGAP_TestSystem all; // LibNGAP import from LibNGAP_Interface all; diff --git a/ttcn/AtsNGAP/NGAP_TestControl.ttcn b/ttcn/AtsNGAP/NGAP_TestControl.ttcn new file mode 100644 index 0000000..2a225f4 --- /dev/null +++ b/ttcn/AtsNGAP/NGAP_TestControl.ttcn @@ -0,0 +1,27 @@ +/** +* @author ETSI / TTF033 +* @version $URL$ +* $Id$ +* @desc This module provides execution part for NGAP tests. +* @copyright ETSI Copyright Notification +* No part may be reproduced except as authorized by written permission. +* The copyright and the foregoing restriction extend to reproduction in all media. +* All rights reserved. +* @see ETSI TS +*/ +module NGAP_TestControl { + + // NGAP + import from NGAP_Pics all; + import from NGAP_TestCases all; + + control { + + if (PICS_NGAP_GNB_IUT) { + } + if (PICS_NGAP_AMF_IUT) { + } + + } // End of 'Control' statement + +} // End of module NGAP_TestControl diff --git a/ttcn/AtsNGAP/module.mk b/ttcn/AtsNGAP/module.mk new file mode 100644 index 0000000..b548519 --- /dev/null +++ b/ttcn/AtsNGAP/module.mk @@ -0,0 +1,42 @@ +suite := AtsNGAP +pdu := NGAP_PDU + +sources:= \ + NGAP_TestCases.ttcn \ + NGAP_Pics.ttcn \ + NGAP_Pixits.ttcn \ + NGAP_Steps.ttcn \ + NGAP_TestSystem.ttcn \ + NGAP_TestConfiguration.ttcn \ + NGAP_TestControl.ttcn \ + NGAP_TCFunctions.ttcn + +modules := \ + ../Lib_NG_NAS \ + ../LibNGAP \ + ../LibCommon \ + ../Lib3GPP \ + ../../titan-test-system-framework/ttcn/LibHelpers \ + ../../titan-test-system-framework/ttcn/LibSecurity \ + ../../titan-test-system-framework/ttcn/LibXsd \ + ../../titan-test-system-framework/ccsrc/Protocols/Pcap \ + ../../titan-test-system-framework/ccsrc/Protocols/LinuxFrame \ + ../../titan-test-system-framework/ccsrc/Protocols/ETH \ + ../../titan-test-system-framework/ccsrc/Protocols/IP \ + ../../titan-test-system-framework/ccsrc/Protocols/Sctp \ + ../../titan-test-system-framework/ccsrc/Protocols/Xml \ + ../../titan-test-system-framework/ccsrc/Framework \ + ../../titan-test-system-framework/ccsrc/Helpers \ + ../../titan-test-system-framework/ccsrc/loggers \ + ../../titan-test-system-framework/ccsrc/security \ + ../../ccsrc/EncDec \ + ../../ccsrc/Externals \ + ../../ccsrc/Ports/LibNAS \ + ../../ccsrc/Ports/LibNGAP \ + ../../ccsrc/framework \ + ../../ccsrc/Protocols/NGAP_layer \ + ../../ccsrc/Protocols/NGAP \ + ../../ccsrc/Protocols/NG_NAS \ + ../../ccsrc/Protocols/FiveG_AKA \ + ../modules/titan.TestPorts.Common_Components.Abstract_Socket + diff --git a/ttcn/AtsNGAP/module.mk_ b/ttcn/AtsNGAP/module.mk_ deleted file mode 100644 index fbb1ae3..0000000 --- a/ttcn/AtsNGAP/module.mk_ +++ /dev/null @@ -1,26 +0,0 @@ -#suite := AtsNGAP -#pdu := NGAP_PDU - -sources:= \ - NGAP_Pics.ttcn \ - NGAP_Pixits.ttcn \ - NGAP_Steps.ttcn \ - NGAP_TestSystem.ttcn \ - NGAP_TestConfiguration.ttcn - -#modules := \ -# ../LibNGAP \ -# ../LibCommon \ -# ../../titan-test-system-framework/ccsrc/Protocols/Pcap \ -# ../../titan-test-system-framework/ccsrc/Protocols/ETH \ -# ../../ccsrc/Ports/LibNGAP \ -# ../../ccsrc/EncDec \ -# ../../titan-test-system-framework/ccsrc/Framework \ -# ../../titan-test-system-framework/ccsrc/loggers \ -# ../../ccsrc/Protocols/NGAP_layer \ -# ../../ccsrc/Protocols/NGAP \ -# ../../ccsrc/Asn1c \ -# ../../ccsrc/framework \ -# ../modules/titan.TestPorts.Common_Components.Abstract_Socket - - diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 69518e1..bc84a8d 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -20,17 +20,16 @@ module NG_NAS_TCFunctions { // Lib_NG_NAS import from Lib_NG_NAS_Interface all; import from Lib_NG_NAS_Templates all; - import from LIB_NG_NAS_Functions all; - import from NAS_CommonTemplates all; + import from Lib_NG_NAS_Security_Functions all; + import from Lib_NG_NAS_Functions all; - // NG_NAS + // Lib3GPP + import from NAS_CommonTypeDefs all; + import from NAS_CommonTemplates all; import from NG_NAS_TypeDefs all; import from NG_NAS_TestSystem all; import from NG_NAS_Templates all; - import from NAS_CommonTypeDefs all; import from NG_NAS_Templates all; - - // Lib3GPP import from NG_NAS_MsgContainers all; // LibNGAP @@ -41,11 +40,12 @@ module NG_NAS_TCFunctions { import from LibNGAP_Templates all; import from LibNGAP_Interface all; import from LibNGAP_Steps all; + import from LibNGAP_Functions all; // LibFramwork import from LibHelpers_Functions all; - // NGAP_Ats + // AtsNGAP import from NGAP_Pixits all; import from NGAP_Steps all; import from Lib_NG_NAS_Pixits all; diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index dfc54d9..b8cf9c2 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -33,7 +33,8 @@ module NG_NAS_TestCases { // Lib_NG_NAS import from Lib_NG_NAS_Interface all; - import from LIB_NG_NAS_Functions all; + import from Lib_NG_NAS_Security_Functions all; + import from Lib_NG_NAS_Functions all; // NG_NAS import from NG_NAS_TCFunctions all; @@ -53,7 +54,7 @@ module NG_NAS_TestCases { //import from LibNGAP_Templates all; //import from LibNGAP_Pixits all; - // NGAP_Ats + // AtsNGAP //import from LibNGAP_TypesAndValues all; //import from NGAP_TestConfiguration all; import from NGAP_TestSystem all; diff --git a/ttcn/Ats_NG_NAS/module.mk b/ttcn/Ats_NG_NAS/module.mk index 9014ba3..4e5b69e 100644 --- a/ttcn/Ats_NG_NAS/module.mk +++ b/ttcn/Ats_NG_NAS/module.mk @@ -15,31 +15,32 @@ sources:= \ ../AtsNGAP/NGAP_TestConfiguration.ttcn -modules := \ - ../LibNGAP \ - ../Lib_NG_NAS \ - ../LibCommon \ - ../Lib3GPP \ - ../../titan-test-system-framework/ttcn/LibHelpers \ - ../../titan-test-system-framework/ttcn/LibSecurity \ - ../../titan-test-system-framework/ttcn/LibXsd \ - ../../titan-test-system-framework/ccsrc/Protocols/Pcap \ - ../../titan-test-system-framework/ccsrc/Protocols/ETH \ - ../../titan-test-system-framework/ccsrc/Protocols/IP \ - ../../titan-test-system-framework/ccsrc/Protocols/Sctp \ - ../../titan-test-system-framework/ccsrc/Protocols/Xml \ - ../../titan-test-system-framework/ccsrc/Framework \ - ../../titan-test-system-framework/ccsrc/Helpers \ - ../../titan-test-system-framework/ccsrc/loggers \ - ../../titan-test-system-framework/ccsrc/security \ - ../../ccsrc/EncDec \ - ../../ccsrc/Externals \ - ../../ccsrc/Ports/LibNAS \ - ../../ccsrc/Ports/LibNGAP \ - ../../ccsrc/framework \ - ../../ccsrc/Protocols/NGAP_layer \ - ../../ccsrc/Protocols/NGAP \ - ../../ccsrc/Protocols/NG_NAS \ - ../../ccsrc/Protocols/FiveG_AKA \ +modules := \ + ../LibNGAP \ + ../Lib_NG_NAS \ + ../LibCommon \ + ../Lib3GPP \ + ../../titan-test-system-framework/ttcn/LibHelpers \ + ../../titan-test-system-framework/ttcn/LibSecurity \ + ../../titan-test-system-framework/ttcn/LibXsd \ + ../../titan-test-system-framework/ccsrc/Protocols/Pcap \ + ../../titan-test-system-framework/ccsrc/Protocols/LinuxFrame \ + ../../titan-test-system-framework/ccsrc/Protocols/ETH \ + ../../titan-test-system-framework/ccsrc/Protocols/IP \ + ../../titan-test-system-framework/ccsrc/Protocols/Sctp \ + ../../titan-test-system-framework/ccsrc/Protocols/Xml \ + ../../titan-test-system-framework/ccsrc/Framework \ + ../../titan-test-system-framework/ccsrc/Helpers \ + ../../titan-test-system-framework/ccsrc/loggers \ + ../../titan-test-system-framework/ccsrc/security \ + ../../ccsrc/EncDec \ + ../../ccsrc/Externals \ + ../../ccsrc/Ports/LibNAS \ + ../../ccsrc/Ports/LibNGAP \ + ../../ccsrc/framework \ + ../../ccsrc/Protocols/NGAP_layer \ + ../../ccsrc/Protocols/NGAP \ + ../../ccsrc/Protocols/NG_NAS \ + ../../ccsrc/Protocols/FiveG_AKA \ ../modules/titan.TestPorts.Common_Components.Abstract_Socket diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 0b82852..226b276 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -131,6 +131,12 @@ module LibNGAP_Pixits { */ modulepar AlternativeQoSParaSetNotifyIndex PX_ALTERNATIVE_QOS_PARA_SET_NOTIFY_INDEX := 0; + /** + * @desc To indicates the relative processing capacity of an AMF with respect to the other AMFs in the AMF Set in order to load-balance AMFs within an AMF Set + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.32 Relative AMF Capacity + */ + modulepar RelativeAMFCapacity PX_M_RELATIVE_AMF_CAP := 255; + /** * @desc The Mobile Country Code (MCC) and Mobile Network Code (MNC) * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.5 PLMN Identity diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index ef2e9a9..5a57028 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1070,22 +1070,22 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_GUAMI, + id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, { - id := id_AllowedNSSAI, + id := id_AllowedNSSAI, criticality := reject, value_ := { AllowedNSSAI := p_allowedNSSAI } }, { - id := id_UESecurityCapabilities, + id := id_UESecurityCapabilities, criticality := reject, value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, { - id := id_SecurityKey, + id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } } @@ -1123,7 +1123,7 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_GUAMI, + id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, @@ -1133,22 +1133,22 @@ module LibNGAP_Templates { value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } }, { - id := id_AllowedNSSAI, + id := id_AllowedNSSAI, criticality := reject, value_ := { AllowedNSSAI := p_allowedNSSAI } }, { - id := id_UESecurityCapabilities, + id := id_UESecurityCapabilities, criticality := reject, value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, { - id := id_SecurityKey, + id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } }, { - id := id_TraceActivation, + id := id_TraceActivation, criticality := ignore, value_ := { TraceActivation := p_traceActivation } } @@ -1186,7 +1186,7 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_GUAMI, + id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, @@ -1196,22 +1196,22 @@ module LibNGAP_Templates { value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } }, { - id := id_AllowedNSSAI, + id := id_AllowedNSSAI, criticality := reject, value_ := { AllowedNSSAI := p_allowedNSSAI } }, { - id := id_UESecurityCapabilities, + id := id_UESecurityCapabilities, criticality := reject, value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, { - id := id_SecurityKey, + id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } }, { - id := id_TraceActivation, + id := id_TraceActivation, criticality := ignore, value_ := { MobilityRestrictionList := p_mobilityRestrictionList } } @@ -1220,7 +1220,7 @@ module LibNGAP_Templates { } } // End of template m_n2_InitialContextSetupRequest_optional_MobilityRestriction - /** + /** * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.1 INITIAL CONTEXT SETUP REQUEST */ template (value) InitiatingMessage m_n2_InitialContextSetupRequest_differentOptionals( @@ -1264,7 +1264,7 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_GUAMI, + id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, @@ -1274,97 +1274,97 @@ module LibNGAP_Templates { value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } }, { - id := id_AllowedNSSAI, + id := id_AllowedNSSAI, criticality := reject, value_ := { AllowedNSSAI := p_allowedNSSAI } }, { - id := id_UESecurityCapabilities, + id := id_UESecurityCapabilities, criticality := reject, value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, { - id := id_SecurityKey, + id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } }, { - id := id_UERadioCapability, + id := id_UERadioCapability, criticality := ignore, value_ := { UERadioCapability := p_uERadioCapability } }, { - id := id_IndexToRFSP, + id := id_IndexToRFSP, criticality := ignore, value_ := { IndexToRFSP := p_indexToRFSP } }, { - id := id_MaskedIMEISV, + id := id_MaskedIMEISV, criticality := ignore, value_ := { MaskedIMEISV := p_maskedIMEISV } }, { - id := id_NAS_PDU, + id := id_NAS_PDU, criticality := ignore, value_ := { NAS_PDU := p_nasPdu } }, { - id := id_EmergencyFallbackIndicator, + id := id_EmergencyFallbackIndicator, criticality := reject, value_ := { EmergencyFallbackIndicator := p_emergencyFallbackIndicator} }, { - id := id_RRCInactiveTransitionReportRequest, + id := id_RRCInactiveTransitionReportRequest, criticality := ignore, value_ := { RRCInactiveTransitionReportRequest := p_rRCInactiveTransitionReportRequest} }, { - id := id_RedirectionVoiceFallback, + id := id_RedirectionVoiceFallback, criticality := ignore, value_ := { RedirectionVoiceFallback := p_redirectionVoiceFallback } } , { - id := id_LocationReportingRequestType, + id := id_LocationReportingRequestType, criticality := ignore, value_ := { LocationReportingRequestType := p_locationReportingRequestType } }, { - id := id_SRVCCOperationPossible, + id := id_SRVCCOperationPossible, criticality := ignore, value_ := { SRVCCOperationPossible := p_sRVCCOperationPossible } }, { - id := id_IAB_Authorized, + id := id_IAB_Authorized, criticality := ignore, value_ := { IAB_Authorized := p_iAB_Authorized } }, { - id := id_Enhanced_CoverageRestriction, + id := id_Enhanced_CoverageRestriction, criticality := ignore, value_ := { Enhanced_CoverageRestriction := p_enhanced_CoverageRestriction } }, { - id := id_Extended_ConnectedTime, + id := id_Extended_ConnectedTime, criticality := ignore, value_ := { Extended_ConnectedTime := p_extended_ConnectedTime } }, { - id := id_UE_DifferentiationInfo, + id := id_UE_DifferentiationInfo, criticality := ignore, value_ := { UE_DifferentiationInfo := p_uE_DifferentiationInfo } }, - { - id := id_NRUESidelinkAggregateMaximumBitrate, + { + id := id_NRUESidelinkAggregateMaximumBitrate, criticality := ignore, value_ := { NRUESidelinkAggregateMaximumBitrate := p_nRUESidelinkAggregateMaximumBitrate } }, - { - id := id_LTEUESidelinkAggregateMaximumBitrate, + { + id := id_LTEUESidelinkAggregateMaximumBitrate, criticality := ignore, value_ := { LTEUESidelinkAggregateMaximumBitrate := p_lTEUESidelinkAggregateMaximumBitrate } }, { - id := id_UERadioCapabilityID, + id := id_UERadioCapabilityID, criticality := reject, value_ := { UERadioCapabilityID := p_uERadioCapabilityID } } @@ -1379,6 +1379,70 @@ module LibNGAP_Templates { group Receive { + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.1 INITIAL CONTEXT SETUP REQUEST + */ + template (present) InitiatingMessage mw_n2_InitialContextSetupRequest( + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) GUAMI p_gUAMI := ?, + template (present) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq := ?, + template (present) AllowedNSSAI p_allowedNSSAI := ?, + template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, + template (present) SecurityKey p_nextHopNH := ?, + template (present) MaskedIMEISV p_maskedIMEISV := ?, + template (present) NAS_PDU p_nasPdu := ? + ) := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + InitialContextSetupRequest := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + }, + { + id := id_GUAMI, + criticality := reject, + value_ := { GUAMI := p_gUAMI } + }, + { + id := id_AllowedNSSAI, + criticality := reject, + value_ := { AllowedNSSAI := p_allowedNSSAI } + }, + { + id := id_UESecurityCapabilities, + criticality := reject, + value_ := { UESecurityCapabilities := p_uESecurityCapabilities } + }, + { + id := id_SecurityKey, + criticality := reject, + value_ := { SecurityKey := p_nextHopNH } + }, + { + id := id_MaskedIMEISV, + criticality := ignore, + value_ := { MaskedIMEISV := p_maskedIMEISV } + }, + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { NAS_PDU := p_nasPdu } + } + } + } + } + } // End of template mw_n2_InitialContextSetupRequest + /** * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.1 INITIAL CONTEXT SETUP REQUEST */ @@ -1409,44 +1473,44 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_GUAMI, + id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, { - id := id_PDUSessionResourceSetupListCxtReq, + id := id_AllowedNSSAI, criticality := reject, - value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } + value_ := { AllowedNSSAI := p_allowedNSSAI } }, { - id := id_AllowedNSSAI, + id := id_UESecurityCapabilities, criticality := reject, - value_ := { AllowedNSSAI := p_allowedNSSAI } + value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, { - id := id_UESecurityCapabilities, + id := id_PDUSessionResourceSetupListCxtReq, criticality := reject, - value_ := { UESecurityCapabilities := p_uESecurityCapabilities } + value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } }, { - id := id_SecurityKey, + id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } }, { - id := id_MaskedIMEISV, + id := id_MaskedIMEISV, criticality := ignore, value_ := { MaskedIMEISV := p_maskedIMEISV } }, { - id := id_NAS_PDU, + id := id_NAS_PDU, criticality := ignore, value_ := { NAS_PDU := p_nasPdu } } } } } - } // End of template mw_n2_InitialContextSetupRequest + } // End of template mw_n2_InitialContextSetupRequest_withPDUSessionList } // End of group Receive @@ -1521,8 +1585,8 @@ module LibNGAP_Templates { * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.2 INITIAL CONTEXT SETUP RESPONSE */ template (present) SuccessfulOutcome mw_n2_InitialContextSetupResponse( - template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, template (present) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes := ? ) := { procedureCode := id_InitialContextSetup, @@ -1554,8 +1618,8 @@ module LibNGAP_Templates { * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.2 INITIAL CONTEXT SETUP RESPONSE */ template (present) SuccessfulOutcome mw_n2_InitialContextSetupResponse_Failed( - template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, template (present) PDUSessionResourceFailedToSetupListSURes p_pDUSessionResourceFailedToSetupListURes := ? ) := { procedureCode := id_InitialContextSetup, @@ -1584,8 +1648,8 @@ module LibNGAP_Templates { } // End of template mw_n2_InitialContextSetupResponse_Failed template (present) SuccessfulOutcome mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( - template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ? + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := PX_RAN_UE_NGAP_ID, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID ) := { procedureCode := id_InitialContextSetup, criticality := reject, @@ -1980,14 +2044,14 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_SecurityKey, - criticality := reject, - value_ := { SecurityKey := p_nextHopNH } + id := id_SecurityKey, + criticality := reject, + value_ := { SecurityKey := p_nextHopNH } }, { - id := id_UESecurityCapabilities, - criticality := reject, - value_ := { UESecurityCapabilities := p_uESecurityCapabilities } + id := id_UESecurityCapabilities, + criticality := reject, + value_ := { UESecurityCapabilities := p_uESecurityCapabilities } } } } @@ -2002,14 +2066,14 @@ module LibNGAP_Templates { in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) RANPagingPriority p_rANPagingPriority := 1, // RAN_Paging_Priority // TODO: do we need PIXIT here? in template (value) IndexToRFSP p_indexToRFSP := PX_Index_to_RAT_Frequency_Selection_Priority, - in template (value) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate, // UE_Aggregate_Maximum_Bit_Rate containing - in template (value) UESecurityCapabilities p_uESecurityCapabilities, // UE_Security_Capabilities containing - in template (value) EmergencyFallbackIndicator p_emergencyFallbackIndicator, // Emergency_Fallback_Indicator, - in template (value) GUAMI p_gUAMI, // New_GUAMI containing - in template (value) IAB_Authorized p_iAB_Authorized, // IAB_Authorized, - in template (value) PC5QoSParameters p_pC5QoSParameters, // PC5_QoS_Parameters containing - in template (value) UERadioCapabilityID p_uERadioCapabilityID := PX_U_E_RADIO_CAPABILITY_ID, // UE_Radio_Capability_ID, - in template (value) RGLevelWirelineAccessCharacteristics p_rGLevelWirelineAccessCharacteristics := '00'O // RG_Level_Wireline_Access_Characteristics // TODO: do we need a PIXIT here? + in template (value) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate, // UE_Aggregate_Maximum_Bit_Rate containing + in template (value) UESecurityCapabilities p_uESecurityCapabilities, // UE_Security_Capabilities containing + in template (value) EmergencyFallbackIndicator p_emergencyFallbackIndicator, // Emergency_Fallback_Indicator, + in template (value) GUAMI p_gUAMI, // New_GUAMI containing + in template (value) IAB_Authorized p_iAB_Authorized, // IAB_Authorized, + in template (value) PC5QoSParameters p_pC5QoSParameters, // PC5_QoS_Parameters containing + in template (value) UERadioCapabilityID p_uERadioCapabilityID := PX_U_E_RADIO_CAPABILITY_ID, // UE_Radio_Capability_ID, + in template (value) RGLevelWirelineAccessCharacteristics p_rGLevelWirelineAccessCharacteristics := '00'O // RG_Level_Wireline_Access_Characteristics // TODO: do we need a PIXIT here? ) := { procedureCode := id_UEContextModification, criticality := reject, @@ -2026,62 +2090,62 @@ module LibNGAP_Templates { criticality := reject, value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, - // in template (value) RANPagingPriority p_rANPagingPriority, // RAN_Paging_Priority - { + // in template (value) RANPagingPriority p_rANPagingPriority, // RAN_Paging_Priority + { id := id_RANPagingPriority, criticality := ignore, value_ := { RANPagingPriority := p_rANPagingPriority } }, // in template (value) IndexToRFSP p_indexToRFSP, // Index_to_RAT_Frequency_Selection_Priority, - { + { id := id_IndexToRFSP, criticality := ignore, value_ := { IndexToRFSP := p_indexToRFSP } }, - // in template (value) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate, // UE_Aggregate_Maximum_Bit_Rate containing - { + // in template (value) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate, // UE_Aggregate_Maximum_Bit_Rate containing + { id := id_UEAggregateMaximumBitRate, criticality := ignore, value_ := { UEAggregateMaximumBitRate := p_uEAggregateMaximumBitRate } }, - // in template (value) UESecurityCapabilities p_uESecurityCapabilities, // UE_Security_Capabilities containing - { + // in template (value) UESecurityCapabilities p_uESecurityCapabilities, // UE_Security_Capabilities containing + { id := id_UESecurityCapabilities, criticality := reject, value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, - // in template (value) EmergencyFallbackIndicator p_emergencyFallbackIndicator, // Emergency_Fallback_Indicator, - { + // in template (value) EmergencyFallbackIndicator p_emergencyFallbackIndicator, // Emergency_Fallback_Indicator, + { id := id_EmergencyFallbackIndicator, criticality := reject, value_ := { EmergencyFallbackIndicator := p_emergencyFallbackIndicator } }, - // in template (value) GUAMI p_gUAMI, // New_GUAMI containing - { + // in template (value) GUAMI p_gUAMI, // New_GUAMI containing + { id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, - // in template (value) IAB_Authorized p_iAB_Authorized, // IAB_Authorized, - { + // in template (value) IAB_Authorized p_iAB_Authorized, // IAB_Authorized, + { id := id_IAB_Authorized, criticality := ignore, value_ := { IAB_Authorized := p_iAB_Authorized } }, - // in template (value) PC5QoSParameters p_pC5QoSParameters, // PC5_QoS_Parameters containing - { + // in template (value) PC5QoSParameters p_pC5QoSParameters, // PC5_QoS_Parameters containing + { id := id_PC5QoSParameters, criticality := ignore, value_ := { PC5QoSParameters := p_pC5QoSParameters } }, - // in template (value) UERadioCapabilityID p_uERadioCapabilityID := PX_U_E_RADIO_CAPABILITY_ID, // UE_Radio_Capability_ID, - { + // in template (value) UERadioCapabilityID p_uERadioCapabilityID := PX_U_E_RADIO_CAPABILITY_ID, // UE_Radio_Capability_ID, + { id := id_UERadioCapabilityID, criticality := reject, value_ := { UERadioCapabilityID := p_uERadioCapabilityID } }, - // in template (value) RGLevelWirelineAccessCharacteristics p_rGLevelWirelineAccessCharacteristics // RG_Level_Wireline_Access_Characteristics - { + // in template (value) RGLevelWirelineAccessCharacteristics p_rGLevelWirelineAccessCharacteristics // RG_Level_Wireline_Access_Characteristics + { id := id_RGLevelWirelineAccessCharacteristics, criticality := ignore, value_ := { RGLevelWirelineAccessCharacteristics := p_rGLevelWirelineAccessCharacteristics } @@ -5163,7 +5227,7 @@ module LibNGAP_Templates { id := NGAP_Constants.id_FiveG_S_TMSI, criticality := NGAP_CommonDataTypes.reject, Value := "NGAP_IEs.FiveG_S_TMSI", - presence := NGAP_CommonDataTypes.optional_ + UEContextRequest presence := NGAP_CommonDataTypes.optional_ }, { id := NGAP_Constants.id_AMFSetID, @@ -5174,7 +5238,7 @@ module LibNGAP_Templates { { id := NGAP_Constants.id_UEContextRequest, criticality := NGAP_CommonDataTypes.ignore, - Value := "NGAP_IEs.UEContextRequest", + Value := "NGAP_IEs.", presence := NGAP_CommonDataTypes.optional_ }, { @@ -5271,10 +5335,11 @@ module LibNGAP_Templates { template (present) RAN_UE_NGAP_ID p_RANUeNgapID := ?, template (present) NAS_PDU p_nasPdu := ?, template (present) UserLocationInformation p_UeLocInf := ?, - template (present) RRCEstablishmentCause p_rrcEstCause := ? + template (present) RRCEstablishmentCause p_rrcEstCause := ?, + template (present) UEContextRequest p_uEContextRequest := ? ) := { procedureCode := id_InitialUEMessage, - criticality := reject, + criticality := ignore, value_ := { InitialUEMessage := { protocolIEs := { @@ -5297,6 +5362,11 @@ module LibNGAP_Templates { id := id_RRCEstablishmentCause, criticality := ignore, value_ := { RRCEstablishmentCause := p_rrcEstCause } + }, + { + id := id_UEContextRequest, + criticality := ignore, + value_ := { UEContextRequest := p_uEContextRequest } } } } @@ -5829,6 +5899,7 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_NGSetupRequest( template (present) GlobalRANNodeID p_globalRANNodeID := ?, + template (present) RANNodeName p_rANNodeName := ?, template (present) SupportedTAList p_supportedTAs := ?, template (present) PagingDRX p_pagingDRX := ? ) := { @@ -5842,6 +5913,11 @@ module LibNGAP_Templates { criticality := reject, value_ := { GlobalRANNodeID := p_globalRANNodeID } }, + { + id := id_RANNodeName, + criticality := ignore, + value_ := { RANNodeName := p_rANNodeName } + }, { id := id_SupportedTAList, criticality := reject, @@ -6306,14 +6382,14 @@ module LibNGAP_Templates { } // End of template m_n2_AMFConfigurationUpdate template (value) InitiatingMessage m_n2_AMFConfigurationUpdate_tnl( - //in template (value) AMFName p_AMFName, - in template (value) ServedGUAMIList p_servedGUAMIList, - //in template (value) RelativeAMFCapacity p_relativeAMFCapacity, - in template (value) PLMNSupportList p_pLMNSupportList, - in template (value) AMF_TNLAssociationToAddList p_aMF_TNLAssociationToAddList, - //in template (value) AMF_TNLAssociationToRemoveList p_aMF_TNLAssociationToRemoveList, - in template (value) AMF_TNLAssociationToUpdateList p_aMF_TNLAssociationToUpdateList//, - //in template (value) Extended_AMFName p_extended_AMFName + //in template (value) AMFName p_AMFName, + in template (value) ServedGUAMIList p_servedGUAMIList, + //in template (value) RelativeAMFCapacity p_relativeAMFCapacity, + in template (value) PLMNSupportList p_pLMNSupportList, + in template (value) AMF_TNLAssociationToAddList p_aMF_TNLAssociationToAddList, + //in template (value) AMF_TNLAssociationToRemoveList p_aMF_TNLAssociationToRemoveList, + in template (value) AMF_TNLAssociationToUpdateList p_aMF_TNLAssociationToUpdateList//, + //in template (value) Extended_AMFName p_extended_AMFName ):={ procedureCode := id_AMFConfigurationUpdate, criticality := reject, @@ -6347,17 +6423,17 @@ module LibNGAP_Templates { //{ // id := id_AMF_TNLAssociationToRemoveList, // criticality := ignore, - // value_ := { AMF_TNLAssociationToRemoveList := p_aMF_TNLAssociationToRemoveList} + // value_ := { AMF_TNLAssociationToRemoveList := p_aMF_TNLAssociationToRemoveList} //}, { id := id_AMF_TNLAssociationToUpdateList, criticality := ignore, - value_ := { AMF_TNLAssociationToUpdateList := p_aMF_TNLAssociationToUpdateList} + value_ := { AMF_TNLAssociationToUpdateList := p_aMF_TNLAssociationToUpdateList} }//, //{ // id := id_Extended_AMFName, // criticality := ignore, - // value_ := { Extended_AMFName := p_extended_AMFName} + // value_ := { Extended_AMFName := p_extended_AMFName} //} } } @@ -8232,8 +8308,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReportingControl, criticality := ignore, value_ := { - LocationReportingControl := { - protocolIEs := { + LocationReportingControl := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8268,8 +8344,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReportingControl, criticality := ignore, value_ := { - LocationReportingControl := { - protocolIEs := { + LocationReportingControl := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8307,8 +8383,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReportingFailureIndication, criticality := ignore, value_ := { - LocationReportingFailureIndication := { - protocolIEs := { + LocationReportingFailureIndication := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8343,8 +8419,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReportingFailureIndication, criticality := ignore, value_ := { - LocationReportingFailureIndication := { - protocolIEs := { + LocationReportingFailureIndication := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8383,8 +8459,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReport, criticality := ignore, value_ := { - LocationReport := { - protocolIEs := { + LocationReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8423,8 +8499,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReport, criticality := ignore, value_ := { - LocationReport := { - protocolIEs := { + LocationReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8470,8 +8546,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReport, criticality := ignore, value_ := { - LocationReport := { - protocolIEs := { + LocationReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8510,8 +8586,8 @@ module LibNGAP_Templates { procedureCode := id_LocationReport, criticality := ignore, value_ := { - LocationReport := { - protocolIEs := { + LocationReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8562,8 +8638,8 @@ module LibNGAP_Templates { procedureCode := id_UETNLABindingRelease, criticality := ignore, value_ := { - UETNLABindingReleaseRequest := { - protocolIEs := { + UETNLABindingReleaseRequest := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8592,8 +8668,8 @@ module LibNGAP_Templates { procedureCode := id_UETNLABindingRelease, criticality := ignore, value_ := { - UETNLABindingReleaseRequest := { - protocolIEs := { + UETNLABindingReleaseRequest := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8631,8 +8707,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityInfoIndication, criticality := ignore, value_ := { - UERadioCapabilityInfoIndication := { - protocolIEs := { + UERadioCapabilityInfoIndication := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8666,8 +8742,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityInfoIndication, criticality := ignore, value_ := { - UERadioCapabilityInfoIndication := { - protocolIEs := { + UERadioCapabilityInfoIndication := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8712,8 +8788,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityInfoIndication, criticality := ignore, value_ := { - UERadioCapabilityInfoIndication := { - protocolIEs := { + UERadioCapabilityInfoIndication := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8747,8 +8823,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityInfoIndication, criticality := ignore, value_ := { - UERadioCapabilityInfoIndication := { - protocolIEs := { + UERadioCapabilityInfoIndication := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8795,8 +8871,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckRequest := { - protocolIEs := { + UERadioCapabilityCheckRequest := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8824,8 +8900,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckRequest := { - protocolIEs := { + UERadioCapabilityCheckRequest := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8864,8 +8940,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckRequest := { - protocolIEs := { + UERadioCapabilityCheckRequest := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8893,8 +8969,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckRequest := { - protocolIEs := { + UERadioCapabilityCheckRequest := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8937,8 +9013,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckResponse := { - protocolIEs := { + UERadioCapabilityCheckResponse := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -8971,8 +9047,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckResponse := { - protocolIEs := { + UERadioCapabilityCheckResponse := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -9012,8 +9088,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckResponse := { - protocolIEs := { + UERadioCapabilityCheckResponse := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -9046,8 +9122,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityCheck, criticality := ignore, value_ := { - UERadioCapabilityCheckResponse := { - protocolIEs := { + UERadioCapabilityCheckResponse := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -9088,8 +9164,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityIDMapping, criticality := ignore, value_ := { - UERadioCapabilityIDMappingRequest := { - protocolIEs := { + UERadioCapabilityIDMappingRequest := { + protocolIEs := { { id := id_UERadioCapabilityID, criticality := reject, @@ -9112,8 +9188,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityIDMapping, criticality := ignore, value_ := { - UERadioCapabilityIDMappingRequest := { - protocolIEs := { + UERadioCapabilityIDMappingRequest := { + protocolIEs := { { id := id_UERadioCapabilityID, criticality := reject, @@ -9140,8 +9216,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityIDMapping, criticality := ignore, value_ := { - UERadioCapabilityIDMappingResponse := { - protocolIEs := { + UERadioCapabilityIDMappingResponse := { + protocolIEs := { { id := id_UERadioCapabilityID, criticality := reject, @@ -9168,8 +9244,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityIDMapping, criticality := ignore, value_ := { - UERadioCapabilityIDMappingResponse := { - protocolIEs := { + UERadioCapabilityIDMappingResponse := { + protocolIEs := { { id := id_UERadioCapabilityID, criticality := reject, @@ -9203,8 +9279,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityIDMapping, criticality := ignore, value_ := { - UERadioCapabilityIDMappingResponse := { - protocolIEs := { + UERadioCapabilityIDMappingResponse := { + protocolIEs := { { id := id_UERadioCapabilityID, criticality := reject, @@ -9231,8 +9307,8 @@ module LibNGAP_Templates { procedureCode := id_UERadioCapabilityIDMapping, criticality := ignore, value_ := { - UERadioCapabilityIDMappingResponse := { - protocolIEs := { + UERadioCapabilityIDMappingResponse := { + protocolIEs := { { id := id_UERadioCapabilityID, criticality := reject, @@ -9274,8 +9350,8 @@ module LibNGAP_Templates { procedureCode := id_SecondaryRATDataUsageReport, criticality := ignore, value_ := { - SecondaryRATDataUsageReport := { - protocolIEs := { + SecondaryRATDataUsageReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := ignore, @@ -9309,8 +9385,8 @@ module LibNGAP_Templates { procedureCode := id_SecondaryRATDataUsageReport, criticality := ignore, value_ := { - SecondaryRATDataUsageReport := { - protocolIEs := { + SecondaryRATDataUsageReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := ignore, @@ -9355,8 +9431,8 @@ module LibNGAP_Templates { procedureCode := id_SecondaryRATDataUsageReport, criticality := ignore, value_ := { - SecondaryRATDataUsageReport := { - protocolIEs := { + SecondaryRATDataUsageReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := ignore, @@ -9390,8 +9466,8 @@ module LibNGAP_Templates { procedureCode := id_SecondaryRATDataUsageReport, criticality := ignore, value_ := { - SecondaryRATDataUsageReport := { - protocolIEs := { + SecondaryRATDataUsageReport := { + protocolIEs := { { id := id_AMF_UE_NGAP_ID, criticality := ignore, @@ -9441,8 +9517,8 @@ module LibNGAP_Templates { procedureCode := id_UplinkRIMInformationTransfer, criticality := ignore, value_ := { - UplinkRIMInformationTransfer := { - protocolIEs := { + UplinkRIMInformationTransfer := { + protocolIEs := { { id := id_RIMInformationTransfer, criticality := ignore, @@ -9465,8 +9541,8 @@ module LibNGAP_Templates { procedureCode := id_UplinkRIMInformationTransfer, criticality := ignore, value_ := { - UplinkRIMInformationTransfer := { - protocolIEs := { + UplinkRIMInformationTransfer := { + protocolIEs := { { id := id_RIMInformationTransfer, criticality := ignore, @@ -9492,8 +9568,8 @@ module LibNGAP_Templates { procedureCode := id_DownlinkRIMInformationTransfer, criticality := ignore, value_ := { - DownlinkRIMInformationTransfer := { - protocolIEs := { + DownlinkRIMInformationTransfer := { + protocolIEs := { { id := id_RIMInformationTransfer, criticality := ignore, @@ -9516,8 +9592,8 @@ module LibNGAP_Templates { procedureCode := id_DownlinkRIMInformationTransfer, criticality := ignore, value_ := { - DownlinkRIMInformationTransfer := { - protocolIEs := { + DownlinkRIMInformationTransfer := { + protocolIEs := { { id := id_RIMInformationTransfer, criticality := ignore, @@ -9578,7 +9654,7 @@ module LibNGAP_Templates { in template (value) S_NSSAI p_s_NSSAI, in template (omit) AllowedNSSAI_Item.iE_Extensions p_iE_Extensions := omit ) := { - s_NSSAI := p_s_NSSAI, + s_NSSAI := p_s_NSSAI, iE_Extensions := p_iE_Extensions } // End of template m_allowedNSSAI_Item @@ -17078,7 +17154,7 @@ module LibNGAP_Templates { template (present) S_NSSAI p_s_NSSAI := ?, template AllowedNSSAI_Item.iE_Extensions p_iE_Extensions := * ) := { - s_NSSAI := p_s_NSSAI, + s_NSSAI := p_s_NSSAI, iE_Extensions := p_iE_Extensions } // End of template mw_allowedNSSAI_Item @@ -17686,7 +17762,7 @@ module LibNGAP_Templates { template (present) CauseProtocol mw_causeProtocol(template (present) CauseProtocol p_value := ?) := p_value; - template (present) CauseRadioNetwork mww_causeRadioNetwork(template (present) CauseRadioNetwork p_value := ?) := p_value; + template (present) CauseRadioNetwork mw_causeRadioNetwork(template (present) CauseRadioNetwork p_value := ?) := p_value; template (present) CauseTransport mw_causeTransport(template (present) CauseTransport p_value := ?) := p_value; diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn new file mode 100644 index 0000000..8022c45 --- /dev/null +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -0,0 +1,924 @@ +module LibNGAP_Functions { + + // Lib3GPP + import from CommonDefs all; + import from NAS_CommonTypeDefs all; + import from NAS_CommonTemplates all; + import from NAS_AuthenticationCommon all; + import from NG_NAS_Common all; + import from NG_NAS_MsgContainers all; + import from NG_NAS_Templates all; + import from NG_NAS_SecurityFunctions all; + + // Lib_NGAP + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from LibNGAP_Pixits all; + import from LibNGAP_Templates all; + import from LibNGAP_Interface all; + import from LibNGAP_Steps all; + + // Lib_NG_NAS_Templates + import from Lib_NG_NAS_Templates all; + import from Lib_NG_NAS_Security_Functions all; + import from Lib_NG_NAS_Pixits all; + + /** + * @desc Function to send NGSetupRequest message and await for NGSetupResponse message + */ + function f_await_NGSetupRequest_send_NGSetupRespone() runs on NGAPComponent { + log(">>> f_await_NGSetupRequest_send_NGSetupRespone"); + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_NGSetupRequest( + mw_globalRANNodeID_globalGNB_ID( + mw_ie_globalGnbId + ), + PX_RAN_NODE_NAME, + { + *, + mw_supportedTAItem, + * + }, + PX_PAGING_DRX + ))); + //f_NGAPPDU_Get(vc_recvNGAP_PDU); + f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_NGSetupResponse( + m_aMFName(PX_AMF_NAME), + { + m_servedGUAMIItem( + m_gUAMI + ) + }, + PX_M_RELATIVE_AMF_CAP, + { + m_pLMNSupportItem( + PX_PLMN_IDENTITY, + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD + )) + } + ) + } + ))); + } + + /** + * @desc Function to send NGSetupRequest message and await for NGSetupResponse message + */ + function f_send_NGSetupRequest_await_NGSetupRespone() runs on NGAPComponent { + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + PX_PLMN_IDENTITY, + PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + }, + PX_PAGING_DRX + ))); + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + PX_PLMN_IDENTITY + )), + * + } + ))); + } + + /** + * @desc Function to send NGSetupRequest message and await for NGSetupResponse message + */ + function f_await_NGSetupRequest_await_NGSetupRespone() runs on NGAPComponent { + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_NGSetupRequest( + mw_globalRANNodeID_globalGNB_ID( + mw_ie_globalGnbId( + PX_PLMN_IDENTITY, + PX_GNB_ID + )), + -, + { + *, + mw_supportedTAItem( + PX_TACode, + { + *, + mw_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + *, + mw_sliceSupportItem( + mw_s_NSSAI( + PX_SST, + PX_SD + )), + * + } + ), + * + } + ), + * + }, + PX_PAGING_DRX + ))); + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + PX_PLMN_IDENTITY + )), + * + } + ))); + } + + /** + * @desc Function to send NAS NGSetupResponse message + */ + function f_send_registration_request() runs on NGAPComponent { + log(">>> f_send_registration_request"); + + // Send request for REGISTRATION_REQUEST + // Compute NAS message + var NG_NAS_UL_Message_Type v_nas_message := valueof( + m_NG_REGISTRATION_REQUEST( + cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), + tsc_NasKsi_NoKey, + '0'B, // TSC, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), // 24.501 cl. 9.11.3.4 + -, + -, + m_ng_ue_security_capability + )); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_initialUeMessage( + -, + bit2oct(encvalue(valueof(v_nas_message))), + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + )) + ))); + } + + /** + * @desc Function to await NAS NGSetupResponse message + */ + function f_await_registration_request() runs on NGAPComponent { + log(">>> f_await_registration_request"); + + // Await request for REGISTRATION_REQUEST + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_initialUeMessage + )); + f_NASPDU_Get(vc_recvNGAP_PDU) + if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { + log("Received NG_REGISTRATION_REQUEST NAS message"); + } else { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + } + } + + function f_send_registration_complete() runs on NGAPComponent { + log(">>> f_send_registration_complete"); + + // Send request for REGISTRATION_COMPLETE + // Compute NAS message + var NG_NAS_UL_Message_Type v_nas_message := valueof( + m_NG_REGISTRATION_COMPLETE_noSOR + ); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_initialUeMessage( + -, + bit2oct(encvalue(valueof(v_nas_message))), + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + )) + ))); + } + + function f_await_registration_complete() runs on NGAPComponent { + log(">>> f_await_registration_complete"); + + // Await request for REGISTRATION_COMPLETE + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_initialUeMessage + )); + f_NASPDU_Get(vc_recvNGAP_PDU) + if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_COMPLETE)) { + log("Received NG_REGISTRATION_COMPLETE NAS message"); + } else { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + } + } + + function f_await_authentication_request_send_authentication_response() runs on NGAPComponent { + log(">>> f_await_authentication_request_send_authentication_response"); + + // Await request for DOWNLINK_NAS_TRANSPORT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // AuthorizationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + '100'B, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + } + log("v_message: ", v_message); + + // Compute RES/XRES + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + + // Send response for AUTHENTICATION_RESPONSE + vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( + { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + ); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + + setverdict(pass); + } + + function f_await_authentication_request_await_authentication_response() runs on NGAPComponent { + log(">>> f_await_authentication_request_await_authentication_response"); + + // Await request for DOWNLINK_NAS_TRANSPORT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // AuthorizationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_dl_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + '00?'B, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + v_dl_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + } + log("v_dl_message: ", v_dl_message); + + // Compute RES/XRES + if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + + // Await response for AUTHENTICATION_RESPONSE + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_RESPONSE( + { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + )) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + } + + setverdict(pass); + } + + function f_send_authentication_request_await_authentication_response() runs on NGAPComponent { + log(">>> f_send_authentication_request_await_authentication_response"); + + // TODO Prepare security context + + // TODO Send request for AUTHENTICATION_REQUEST + + // TODO Await response for AUTHENTICATION_RESPONSE + } + + function f_send_securitymode_command_await_securitymode_complete() runs on NGAPComponent { + // TODO Send request for SECURITY_MODE_COMMAND + + // TODO Receive response for SECURITY_MODE_COMPLETE + } + + function f_await_securitymode_command_send_securitymode_complete() runs on NGAPComponent { + log(">>> f_await_securitymode_command_send_securitymode_complete"); + + // Await request for SECURITY_MODE_COMMAND + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // SecurityModeCommand + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + setverdict(pass); + } + log("v_message: ", v_message); + + // Send response for SECURITY_MODE_COMPLETE + vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + ); + var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type + vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + tsc_EPD_GMM, + tsc_SpareHalfOctet, + tsc_SHT_IntegrityProtected_Ciphered, + '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + '00'O, + os // Cyphered NAS message + ); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + + setverdict(pass); + } + + function f_await_securitymode_command_await_securitymode_complete() runs on NGAPComponent { + log(">>> f_await_securitymode_command_await_securitymode_complete"); + + // Await request for SECURITY_MODE_COMMAND + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // SecurityModeCommand + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + setverdict(pass); + } + log("v_message: ", v_message); + + // Await response for SECURITY_MODE_COMPLETE + f_recv_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMPLETE( + mw_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + mw_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + )) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE ***"); + } + + setverdict(pass); + } + + function f_await_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGAPComponent { + log(">>> f_await_initial_context_setup_request_await_initial_context_setup_resonse"); + + // Await InitialContextSetupRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + mw_gUAMI + ( + PX_PLMN_IDENTITY, + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER, + * + )/*, + { + mw_pDUSessionResourceSetupItemCxtReq + ( + PX_PDU_SESSION_ID, + mw_s_NSSAI + ( + PX_SST + ), + ?, + *, + * + ) + }, + ?, + ?, + ? */ + ))); + vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; + + // Await InitialContextSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes + )); + } + + function f_await_initial_context_setup_request_send_initial_context_setup_resonse() runs on NGAPComponent { + log(">>> f_await_initial_context_setup_request_send_initial_context_setup_resonse"); + + // Await InitialContextSetupRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + mw_gUAMI + ( + PX_PLMN_IDENTITY, + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER, + * + )/*, + { + mw_pDUSessionResourceSetupItemCxtReq + ( + PX_PDU_SESSION_ID, + mw_s_NSSAI + ( + PX_SST + ), + ?, + *, + * + ) + }, + ?, + ?, + ? */ + ))); + // Send InitialContextSetupResponse + f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + } + + function f_await_retrieve_ue_information_await_ue_information_transfer() runs on NGAPComponent { + log(">>> f_await_retrieve_ue_information_await_ue_information_transfer"); + + // Await RetrieveUEInformation + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_RetrieveUEInformation( + mw_fiveG_S_TMSI( // FiveG_S_TMSI + PX_AMF_SET_ID, + PX_AMF_POINTER, + '00000001'O + )))); + // Await UEInformationTransfer + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEInformationTransfer( + mw_fiveG_S_TMSI( + PX_AMF_SET_ID, + PX_AMF_POINTER, + ? + )))); + } + + function f_send_retrieve_ue_information_await_ue_information_transfer() runs on NGAPComponent { + log(">>> f_send_retrieve_ue_information_await_ue_information_transfer"); + + // Send RetrieveUEInformation + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_RetrieveUEInformation( + m_fiveG_S_TMSI( // FiveG_S_TMSI + PX_AMF_SET_ID, + PX_AMF_POINTER, + '00000001'O, + omit + )))); + // Await UEInformationTransfer + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEInformationTransfer( + mw_fiveG_S_TMSI( + PX_AMF_SET_ID, + PX_AMF_POINTER, + ? + )))); + } + + function f_send_session_establishment_request() runs on NGAPComponent { + log(">>> f_send_session_establishment_request"); + + // Send PDUSessionEstablishmentRequest + vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + ); + var octetstring os := bit2oct( + encvalue( + valueof( + m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( + cs_NG_PDU_SessionId, + tsc_PTI_1 + )))); + vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + tsc_EPD_GMM, + tsc_SpareHalfOctet, + tsc_SHT_IntegrityProtected_Ciphered, + '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + '00'O, + os // Cyphered NAS message + ); + + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + } + + function f_await_session_establishment_request() runs on NGAPComponent { + log(">>> f_await_session_establishment_request"); + + // Await PDUSessionEstablishmentRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // SecurityModeCommand + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST) == false) { + log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_REQUEST ***"); + setverdict(pass); + } + } + + function f_send_session_establishment_accept() runs on NGAPComponent { + log(">>> f_send_session_establishment_accept"); + + // Send PDUSessionEstablishmentRequest + vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + ); + var octetstring os := ''O; // TODO + // var octetstring os := bit2oct( + // encvalue( + // valueof( + // m_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT( + // cs_NG_PDU_SessionId, + // tsc_PTI_1 + // )))); + vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + tsc_EPD_GMM, + tsc_SpareHalfOctet, + tsc_SHT_IntegrityProtected_Ciphered, + '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + '00'O, + os // Cyphered NAS message + ); + + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + + } + + function f_await_session_establishment_accept() runs on NGAPComponent { + log(">>> f_await_session_establishment_accept"); + + // Await PDUSessionEstablishmentRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // SecurityModeCommand + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT) == false) { + log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); + setverdict(pass); + } + } + + function f_await_session_resource_setup_request_send_session_resource_setup_response() runs on NGAPComponent { + log(">>> f_await_session_resource_setup_request_send_session_resource_setup_response"); + + // Await PDUSessionEstablishmentRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceSetupRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceSetupItemSUReq( + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST, + PX_SD,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + ))); + vc_pDUSessionResourceSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.PDUSessionResourceSetupRequest; + + // Send PDUSessionEstablishmentResponse + /*f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_PDUSessionResourceSetupResponse( + -, + -, + { + m_pDUSessionResourceSetupItemSURes( + PX_PDU_SESSION_ID, + m_pDUSessionResourceSetupResponseTransfer( + m_qosFlowPerTNLInformation( + m_qosFlowMappingItem( + PX_QOS_FLOW_IDENTIFIER, + m_transportLayerAddress( + PX_TUNNEL_ENDPOINT_ADDRESS + ), + m_gTP_TEID( + PX_GTP_TEID + ) + ), + omit,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + omit,//template SecurityResult p_securityResult := *, + omit,//template QosFlowListWithCause p_qosFlowFailedToSetupList := *, + omit //template PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := * + ), + omit //template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * + )) + } + )));*/ + } + + function f_await_session_resource_setup_request_await_session_resource_setup_response() runs on NGAPComponent { + log(">>> f_await_session_resource_setup_request_await_session_resource_setup_response"); + + // Await PDUSessionEstablishmentRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceSetupRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceSetupItemSUReq( + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST, + PX_SD,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + ))); + + + // Await PDUSessionEstablishmentResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_PDUSessionResourceSetupResponse( + -, + -, + { + ( + mw_pDUSessionResourceSetupItemSURes( + ?,//template (present) PDUSessionID p_pDUSessionID, + decmatch ( + mw_pDUSessionResourceSetupResponseTransfer( + ?,//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + *,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + *,//template SecurityResult p_securityResult := *, + *,//template QosFlowListWithCause p_qosFlowFailedToSetupList := *, + *//template PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := * + )),// Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupResponseTransfer + *//template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * + )) + } + ))); + } + + function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGAPComponent { + + vc_recvNGAP_PDU := p_PDU; + + if (ischosen(p_PDU.initiatingMessage)) { + // Nothing to do + if (match(vc_recvNGAP_PDU.initiatingMessage,mw_n2_NGSetupRequest_base)){ + var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.NGSetupRequest.protocolIEs) + //log("Number of IEs:",numOfIEs); + for (var integer i:=0;i>> f_send_NGAP_PDU: ", p_PDU) f_NGAPPDU_Set(p_PDU); - log("f_send_NGAP_PDU: vc_sendNGAP_PDU: ", vc_sendNGAP_PDU) + log("f_send_NGAP_PDU: vc_sendNGAP_PDU: ", vc_sendNGAP_PDU); N2_gNBaMF_P.send(p_PDU); } // End of function f_send_NGAPPDU diff --git a/ttcn/LibNGAP/module.mk b/ttcn/LibNGAP/module.mk index beb3f85..bf4fb8f 100644 --- a/ttcn/LibNGAP/module.mk +++ b/ttcn/LibNGAP/module.mk @@ -3,6 +3,7 @@ sources := \ lib/LibNGAP_Pixits.ttcn \ lib/LibNGAP_Templates.ttcn \ lib/LibNGAP_EncdecDeclarations.ttcn \ + lib_system/LibNGAP_Functions.ttcn \ lib_system/LibNGAP_Interface.ttcn \ lib_system/LibNGAP_Steps.ttcn diff --git a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn deleted file mode 100644 index 2809b66..0000000 --- a/ttcn/Lib_NG_NAS/LIB_NG_NAS_Functions.ttcn +++ /dev/null @@ -1,811 +0,0 @@ -module LIB_NG_NAS_Functions { - - // Lib_NG_NAS - import from Lib_NG_NAS_Interface all; - import from Lib_NG_NAS_Templates all; - import from Lib_NG_NAS_Pixits all; - - // NG_NAS - import from NG_NAS_TypeDefs all; - import from NG_NAS_TestSystem all; - - // Lib3GPP - import from CommonDefs all; - import from NG_NAS_MsgContainers all; - import from NAS_CommonTypeDefs all; - import from NAS_CommonTemplates all; - import from NG_NAS_Common all; - import from NAS_AuthenticationCommon all; - import from NG_NAS_SecurityFunctions all; - - // Lib_NGAP - import from NGAP_IEs language "ASN.1:2002" all; - import from NGAP_Constants language "ASN.1:2002" all; - import from NGAP_PDU_Descriptions language "ASN.1:2002" all; - import from LibNGAP_Pixits all; - import from LibNGAP_Templates all; - import from LibNGAP_Interface all; - import from LibNGAP_Steps all; - - /** - * @desc Function to send NGSetupRequest message and await for NGSetupResponse message - */ - function f_send_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - PX_PLMN_IDENTITY, - PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit - )), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit - ) - }, - PX_PAGING_DRX - ))); - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGSetupResponse( - mw_aMFName(PX_AMF_NAME), - { - *, - mw_servedGUAMIItem( - mw_gUAMI( - PX_PLMN_IDENTITY - )), - * - } - ))); - } - - /** - * @desc Function to send NAS RegistrationRequest message - * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg - */ - function f_send_NasRegistrationRequest() runs on NGNASComponent { - vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( - {'0'B,'001'B}, - '111'B, - '0'B, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) // TODO Use PIXIT here? - ); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } - - /** - * @desc Function to await NAS NGSetupResponse message - */ - function f_await_registration_accept() runs on NGNASComponent { - // Await request for REGISTRATION_ACCEPT - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // AuthorizationRequest - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - -, - ?, - mw_PLMN_List( - -, -, - { - *, - PX_PLMN_IDENTITY, - * - } - ), - -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - v_message) == false) { - setverdict(fail); - return; - } - - setverdict(pass); - } - - /** - * @desc Function to await NAS AuthenticationRequest message and send AuthenticationResponse message with security computation for future encryption - */ - function f_await_NasAuthenticationRequest_send_NasAuthenticationResponse() runs on NGNASComponent { - // Await request for authentication - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // AuthenticationRequest - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_AUTHENTICATION_REQUEST( - '100'B, - -, - mw_GMM_AuthRAND, - mw_GSM_AUTN - ), - v_message - ) == false) { - setverdict(fail); - return; - } - setverdict(pass); - - // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { - setverdict(fail); - return; - } - setverdict(pass); - - // Send response - vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( - { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } - ); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } - - /******************************************************************************** - * - * FIXME Use or enhance check functions from 3GPP library such as NG_NASTemplateFunctions.f_Check_NG_SecurityModeCompleteMsg - * - ********************************************************************************/ - - function f_await_NasSecurityModeCommand() runs on NGNASComponent { - // Await SecurityModeCommand - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // Security mode command - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_SECURITY_MODE_COMMAND, - v_message - ) == false) { - setverdict(fail); - return; - } - // Extract security parameters - if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { - setverdict(fail); - return; - } - - setverdict(pass); - } - - function f_await_NasSecurityModeCommand_send_NasSecurityModeComplete() runs on NGNASComponent { - // Await SecurityModeCommand - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // Security mode command - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_SECURITY_MODE_COMMAND, - v_message - ) == false) { - setverdict(fail); - return; - } - - setverdict(pass); - // Send SecurityModeComplete - vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - ); - var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type - vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( - tsc_EPD_GMM, - tsc_SpareHalfOctet, - tsc_SHT_IntegrityProtected_Ciphered, - '00000000'O, // FIXME How to calculate MessageAuthenticationCode? - '00'O, - os // Cyphered NAS message - ) - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } - - function f_terminate_NasRegistrationRequest_with_reject( - in NAS_CauseValue_Type p_nas_cause_value := tsc_EmmCause_IllegalMe - ) runs on NGNASComponent { - // Send error message - vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( - m_GMM_GSM_Cause( - -, - p_nas_cause_value - )); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } - - function f_send_NGUERadioCApabilityInfoIndication() runs on NGNASComponent { - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UERadioCapabilityInfoIndication( - -, -, - ''O // FIXME FSCOM How to deal with UERadioCapability - ))); - } - - function f_await_NGInitialContextSetupRequest_send_NGInitialContextSetupRespone() runs on NGNASComponent { - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_InitialContextSetupRequest_withPDUSessionList( // FIXME FSCOM How to deal with it? - - ))); - f_send_NGAP_PDU( - m_ngap_succMsg( - m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes - )); - } - - function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGNASComponent { - - vc_recvNGAP_PDU := p_PDU; - - if (ischosen(p_PDU.initiatingMessage)) { - // Nothing to do - if (match(vc_recvNGAP_PDU.initiatingMessage,mw_n2_NGSetupRequest_base)){ - var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.NGSetupRequest.protocolIEs) - //log("Number of IEs:",numOfIEs); - for (var integer i:=0;i>> f_decode_5G_NAS_DL_Message: ", p_nas_pdu); - - var bitstring v_bs := oct2bit(p_nas_pdu); - var NG_NAS_DL_Message_Type v_message; - if (decvalue(v_bs, v_message) != 0) { - log("f_decode_5G_NAS_DL_Message: decvalue failure"); - return false; - } - log("f_decode_5G_NAS_DL_Message: v_message: ", v_message); - if (ischosen(v_message.security_Protected_Nas_Message)) { - if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { - // TODO Cyphered message - log("f_decode_5G_NAS_DL_Message: TODO Cyphered message"); - setverdict(inconc); - return false; - } else { - v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); - if (decvalue(v_bs, v_message) != 0) { - log("f_decode_5G_NAS_DL_Message: decvalue failure"); - return false; - } - log("f_decode_5G_NAS_DL_Message: v_message: ", v_message); - if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { - log(match(v_message, p_NG_NAS_DL_Message_Type)); - return false; - } - } - } - log("f_decode_5G_NAS_DL_Message: matching"); - - return true; - } // End of function f_decode_5G_NAS_DL_Message - - function f_Check_5GAKA_NAS_DL_Message( - in NAS_PDU p_nas_pdu, - in template NG_NAS_DL_Message_Type p_NG_NAS_DL_Message_Type, - out NG_NAS_DL_Message_Type p_message - ) return boolean { - log(">>> f_Check_5GAKA_NAS_DL_Message: ", p_nas_pdu); - - var bitstring v_bs := oct2bit(p_nas_pdu); - var NG_NAS_DL_Message_Type v_message; - if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); - return false; - } - log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); - if (ischosen(v_message.security_Protected_Nas_Message)) { - if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) - // NOthing to do, message is not cyphered - } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) - // TODO Cyphered message - // Decipher NAS container - // v_NonCleartextString := fx_NG_NasDeciphering(v_NonCleartextString, - // p_NasSecurityByRef.Ciphering.Algorithm, - // p_NasSecurityByRef.Ciphering.K_NAS, - // p_NasCount, - // p_NasSecurityByRef.BearerId); - //v_message.security_Protected_Nas_Message.plainNASMessage := v_NonCleartextString; - log("f_Check_5GAKA_NAS_DL_Message: TODO Cyphered message"); - setverdict(inconc); - return false; - } - // Message was decrypted properly - v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); - if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); - return false; - } - log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); - } - if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { - log(match(v_message, p_NG_NAS_DL_Message_Type)); - return false; - } - p_message := v_message; - log("f_Check_5GAKA_NAS_DL_Message: matching: p_message: ", p_message); - - return true; - } // End of function f_Check_5GAKA_NAS_DL_Message - - function f_Check_5GAKA_NAS_UL_Message( - in NAS_PDU p_nas_pdu, - in template NG_NAS_UL_Message_Type p_NG_NAS_UL_Message_Type - ) return boolean { - log(">>> f_Check_5GAKA_NAS_UL_Message: ", p_nas_pdu); - - var bitstring v_bs := oct2bit(p_nas_pdu); - var NG_NAS_UL_Message_Type v_message; - if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); - return false; - } - log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); - if (ischosen(v_message.security_Protected_Nas_Message)) { - // TODO Decyphered message - log("f_Check_5GAKA_NAS_UL_Message: TODO Decyphered message"); - setverdict(inconc); - return false; - } else { - v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); - if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); - return false; - } - log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); - if (not(match(v_message, p_NG_NAS_UL_Message_Type))) { - log(match(v_message, p_NG_NAS_UL_Message_Type)); - return false; - } - } - log("f_Check_5GAKA_NAS_UL_Message: matching"); - - return true; - } // End of function f_Check_5GAKA_NAS_UL_Message - - function f_Check_5GAKA_NAS_DL_Message_is_encrypted(in NAS_PDU p_nas_pdu) return boolean { - log(">>> f_Check_5GAKA_NAS_DL_Message_is_encrypted: ", p_nas_pdu); - - var bitstring v_bs := oct2bit(p_nas_pdu); - var NG_NAS_DL_Message_Type v_message; - if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_DL_Message_is_encrypted: decvalue failure"); - return false; - } - log("f_Check_5GAKA_NAS_DL_Message_is_encrypted: v_message: ", v_message); - if (not ischosen(v_message.security_Protected_Nas_Message)) { - return false - } - - return true; - } // End of function f_Check_5GAKA_NAS_DL_Message_is_encrypted - - function f_Check_5GAKA_NAS_UL_Message_is_encrypted(in NAS_PDU p_nas_pdu) return boolean { - log(">>> f_Check_5GAKA_NAS_UL_Message_is_encrypted: ", p_nas_pdu); - - var bitstring v_bs := oct2bit(p_nas_pdu); - var NG_NAS_UL_Message_Type v_message; - if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_UL_Message_is_encrypted: decvalue failure"); - return false; - } - log("f_Check_5GAKA_NAS_UL_Message_is_encrypted: v_message: ", v_message); - if (not ischosen(v_message.security_Protected_Nas_Message)) { - return false - } - - return true; - } // End of function f_Check_5GAKA_NAS_UL_Message_is_encrypted - - group fiveg_aka_security_network { // FIXME FSCOM To be re-organize later to create a security library - - /** - * @desc Compute RES and XRES values based on rAND & AUTN received in the NG_AUTHENTICATION_REQUEST - * @param [in] p_rand - * @param [in] p_autn - * @param [in] KeySeq - * @param [in,out] p_ng_nas_security_params_type Built security parameters - */ - function f_5g_aka_compute_res_xres( - in B128_Type p_subscription_key := PX_SUBSCRIPTION_KEY, - in B128_Type p_rand, - in B128_Type p_autn, - in ABBA p_abba, - in NAS_PlmnId p_PLMN, - in template (omit) hexstring p_NID := omit, - inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type - ) return boolean { - log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); - - p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); - log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); - p_ng_nas_security_params_type.ABBA := p_abba.abbaValue; - p_ng_nas_security_params_type.AuthParams.RandValue := p_rand; - p_ng_nas_security_params_type.AuthParams.AUTN := p_autn; - - log("f_5g_aka_compute_res_xres: PX_SUBSCRIPTION_KEY=", PX_SUBSCRIPTION_KEY); - - // Extract SQN from v_sqn_ak and XOR it with calculated MAC - var B48_Type v_sqn_ak := f_extract_sqn_ak_from_autn(p_autn); - var B16_Type v_amf := f_extract_amf_from_autn(p_autn); - var B64_Type v_mac := f_extract_mac_from_autn(p_autn); - log("f_5g_aka_compute_res_xres: v_sqn_ak=", bit2oct(v_sqn_ak)); - log("f_5g_aka_compute_res_xres: v_amf=", bit2oct(v_amf)); - log("f_5g_aka_compute_res_xres: v_mac=", bit2oct(v_mac)); - - // Set OP - if (PX_FORCE_USING_OPERATOR_SECRET_KEY == false) { - f_set_op(PX_OPERATOR_KEY); - } else { - f_force_opc(PX_OPERATOR_SECRET_KEY); - } - // Calculate RES, CK, IK and AK in one step - var B128_Type v_ck; - var B128_Type v_ik; - var B48_Type v_ak; - var B64_Type v_res; - if (f_f2345(PX_SUBSCRIPTION_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { - log("f_f2345 failed"); - return false; - } - p_ng_nas_security_params_type.AuthParams.CK := v_ck; - log("f_5g_aka_compute_res_xres: CK=", bit2oct(p_ng_nas_security_params_type.AuthParams.CK)); - p_ng_nas_security_params_type.AuthParams.IK := v_ik; - log("f_5g_aka_compute_res_xres: IK=", bit2oct(p_ng_nas_security_params_type.AuthParams.IK)); - p_ng_nas_security_params_type.Ks := p_ng_nas_security_params_type.AuthParams.CK & p_ng_nas_security_params_type.AuthParams.IK; - log("f_5g_aka_compute_res_xres: Ks=", bit2oct(p_ng_nas_security_params_type.Ks)); - var B48_Type v_sqn := v_sqn_ak xor4b v_ak; - log("f_5g_aka_compute_res_xres: v_sqn=", bit2oct(v_sqn)); - - // Verify that MAC-A was accepted - var B64_Type v_mac_a; - if (f_f1(PX_SUBSCRIPTION_KEY, p_rand, v_sqn, v_amf, v_mac_a) == -1) { - log("f_f1 failed: "); - return false; - } - log("f_5g_aka_compute_res_xres: v_mac_a=", bit2oct(v_mac_a)); - if (PX_CHECK_SECURITY and (v_mac != v_mac_a)) { - log("v_mac != v_mac_a"); - return false; - } - - // Compute XRES - p_ng_nas_security_params_type.AuthParams.XRES := f_NG_Authentication_A4(p_PLMN, - p_ng_nas_security_params_type.AuthParams, - p_ng_nas_security_params_type.KDF, - p_ng_nas_security_params_type.Ks, - p_NID); - p_ng_nas_security_params_type.AuthParams.XRESLength := lengthof(bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); - log("f_5g_aka_compute_res_xres: XRES=", p_ng_nas_security_params_type.AuthParams.XRES); - log("f_5g_aka_compute_res_xres: XRESLength=", p_ng_nas_security_params_type.AuthParams.XRESLength); - - // Generate KAUSF - p_ng_nas_security_params_type.KAUSF := f_NG_Authentication_A2(p_ng_nas_security_params_type.AuthParams, - p_ng_nas_security_params_type.KDF, - p_ng_nas_security_params_type.Ks, - p_PLMN, - p_NID); - log("f_5g_aka_compute_res_xres: KAUSF=", p_ng_nas_security_params_type.KAUSF); - - // Generate KSEAF - p_ng_nas_security_params_type.KSEAF := f_NG_Authentication_A6(p_PLMN, - p_ng_nas_security_params_type.KAUSF, - p_ng_nas_security_params_type.KDF, - p_NID - ); - log("f_5g_aka_compute_res_xres: KSEAF=", p_ng_nas_security_params_type.KSEAF); - - // TODO Generate KMAF - // p_ng_nas_security_params_type.KAMF := f_NG_Authentication_A7(p_Identity, - // p_ng_nas_security_params_type.KSEAF, - // p_ng_nas_security_params_type.ABBA, - // p_ng_nas_security_params_type.KDF - // ); - //log("f_5g_aka_compute_res_xres: KAMF=", p_ng_nas_security_params_type.KAMF); - - log("<<< f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); - return true; - } // End of function f_5g_aka_compute_res_xres - - function f_5g_security_context( - in template (value) NG_SECURITY_MODE_COMMAND p_ng_security_mode_command, - inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type - ) return boolean { - log(">>> f_5g_security_context: ", p_ng_security_mode_command); - - // Set security parameters - p_ng_nas_security_params_type.NAS_Integrity.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.integrityType); - p_ng_nas_security_params_type.NAS_Ciphering.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.cipheringType); - - log("<<< f_5g_security_context: ", p_ng_nas_security_params_type); - return true; - } // End of function f_5g_security_context - - - - - //-------------------------------------------------------------------------- - /* - * @desc HRES* and HXRES* derivation function - * As per annex A.5 of 33.501 - * @param p_AuthParams - * @param p_KAUSF - * @param p_KDF_Type - * @param p_NID (default value: omit) - * @return B256_Type - */ - function f_NG_Authentication_A5( - in B128_Type p_RAND, - in B64_Type p_XRESstar, - KDF_Type p_KDF_Type, - B256_Type p_Key - ) return B128_Type - { - const octetstring const_S6C_FC :='6C'O; - var octetstring v_S; - var octetstring v_P0; - var octetstring v_P1; - - log(">>> f_NG_Authentication_A5: p_RAND=", bit2oct(p_RAND)); - log(">>> f_NG_Authentication_A5: p_XRESstar=", bit2oct(p_XRESstar)); - log(">>> f_NG_Authentication_A5: p_KDF=", p_KDF_Type); - log(">>> f_NG_Authentication_A5: p_Key=", bit2oct(p_Key)); - - v_S := bit2oct(p_RAND) & bit2oct(p_XRESstar); - log("f_NG_Authentication_A5: v_S=", v_S); - - //return substr(fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S), 128, 128); - return substr(fx_sha256(v_S), 128, 128); - }; - - - - - - - - - - - - - - - - function f_extract_sqn_ak_from_autn(in B128_Type p_autn) return B48_Type { - return substr(p_autn, 0, 48); - } - - function f_extract_amf_from_autn(in B128_Type p_autn) return B16_Type { - return substr(p_autn, 48, 16); - } - - function f_extract_mac_from_autn(in B128_Type p_autn) return B64_Type { - return substr(p_autn, 64, 64); - } - - /** - * @desc Set operator variant algorithm configuration - * @param [in] p_op Operator variant algorithm configuration - * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 - */ - function f_set_op(in O16_Type p_op) { - fx_set_op(p_op); - } - /** - * @desc Get operator variant algorithm configuration - * @param [out] p_op Operator variant algorithm configuration - * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 - */ - function f_get_op(out O16_Type p_op) { - fx_get_op(p_op); - } - /** - * @desc Derived OP from from OP and K (subscriber key) - * @param [in] p_authK The subscriber key - * @param [out] p_opc The derived OP from from OP and K - * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 - */ - function f_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer { - return fx_compute_opc(p_authK, p_opc); - } - /** - * @desc Force the value of OPc. In this case, OP is ignored. - * @param [in] p_opc The derived OP from from OP and K - * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 - */ - function f_force_opc(in O16_Type p_opc) { - fx_force_opc(p_opc); - } - - /** - * @desc Encryption according to the cryptographic kernel function Rijndael. - * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3 - */ - external function fx_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer; - function f_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer { - return fx_rijndael_encrypt(p_key, p_plain_text, p_cypherer_text); - } - - function f_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer { - return fx_f1(p_authK, p_rand, v_sqn, v_amf, v_mac_a); - } - - function f_f1star(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_s) return integer { - return fx_f1star(p_authK, p_rand, v_sqn, v_amf, v_mac_s); - } - - function f_f2345(in B128_Type p_authK, in B128_Type p_rand, out B64_Type v_res, out B128_Type v_ck, out B128_Type v_ik, out B48_Type v_ak) return integer { - return fx_f2345(p_authK, p_rand, v_res, v_ck, v_ik, v_ak); - } - - function f_f5star(in B128_Type p_authK, in B128_Type p_rand, out B48_Type p_ak) return integer { - return fx_f5star(p_authK, p_rand, p_ak); - } - - external function fx_set_op(in O16_Type p_op); - external function fx_get_op(out O16_Type p_op); - external function fx_force_opc(in O16_Type p_op); - external function fx_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer; - external function fx_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer; - external function fx_f1star(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_s) return integer; - external function fx_f2345(in B128_Type p_authK, in B128_Type p_rand, out B64_Type v_res, out B128_Type v_ck, out B128_Type v_ik, out B48_Type v_ak) return integer; - external function fx_f5star(in B128_Type p_authK, in B128_Type p_rand, out B48_Type p_ak) return integer; - - } // End of function fiveg_aka_security_network - -} // End of module LIB_NG_NAS_Functions \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn similarity index 100% rename from ttcn/Lib_NG_NAS/Lib_NG_NAS_Pixits.ttcn rename to ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn new file mode 100644 index 0000000..2774ceb --- /dev/null +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -0,0 +1,438 @@ +module Lib_NG_NAS_Security_Functions { + + // Lib_NG_NAS + import from Lib_NG_NAS_Templates all; + import from Lib_NG_NAS_Pixits all; + + // NG_NAS + import from NG_NAS_TypeDefs all; + + // Lib3GPP + import from CommonDefs all; + import from NG_NAS_MsgContainers all; + import from NAS_CommonTypeDefs all; + import from NAS_CommonTemplates all; + import from NG_NAS_Common all; + import from NAS_AuthenticationCommon all; + import from NG_NAS_SecurityFunctions all; + + // Lib_NGAP + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from LibNGAP_Pixits all; + import from LibNGAP_Templates all; + import from LibNGAP_Steps all; + + function f_decode_5G_NAS_DL_Message( + in NAS_PDU p_nas_pdu, + out NG_NAS_DL_Message_Type p_NG_NAS_DL_Message_Type + ) return boolean { + log(">>> f_decode_5G_NAS_DL_Message: ", p_nas_pdu); + + var bitstring v_bs := oct2bit(p_nas_pdu); + var NG_NAS_DL_Message_Type v_message; + if (decvalue(v_bs, v_message) != 0) { + log("f_decode_5G_NAS_DL_Message: decvalue failure"); + return false; + } + log("f_decode_5G_NAS_DL_Message: v_message: ", v_message); + if (ischosen(v_message.security_Protected_Nas_Message)) { + if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { + // TODO Cyphered message + log("f_decode_5G_NAS_DL_Message: TODO Cyphered message"); + setverdict(inconc); + return false; + } else { + v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); + if (decvalue(v_bs, v_message) != 0) { + log("f_decode_5G_NAS_DL_Message: decvalue failure"); + return false; + } + log("f_decode_5G_NAS_DL_Message: v_message: ", v_message); + if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { + log(match(v_message, p_NG_NAS_DL_Message_Type)); + return false; + } + } + } + log("f_decode_5G_NAS_DL_Message: matching"); + + return true; + } // End of function f_decode_5G_NAS_DL_Message + + function f_Check_5GAKA_NAS_DL_Message( + in NAS_PDU p_nas_pdu, + in template NG_NAS_DL_Message_Type p_NG_NAS_DL_Message_Type, + out NG_NAS_DL_Message_Type p_message + ) return boolean { + log(">>> f_Check_5GAKA_NAS_DL_Message: ", p_nas_pdu); + + var bitstring v_bs := oct2bit(p_nas_pdu); + var NG_NAS_DL_Message_Type v_message; + if (decvalue(v_bs, v_message) != 0) { + log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); + return false; + } + log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); + if (ischosen(v_message.security_Protected_Nas_Message)) { + if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) + // NOthing to do, message is not cyphered + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) + // TODO Cyphered message + // Decipher NAS container + // v_NonCleartextString := fx_NG_NasDeciphering(v_NonCleartextString, + // p_NasSecurityByRef.Ciphering.Algorithm, + // p_NasSecurityByRef.Ciphering.K_NAS, + // p_NasCount, + // p_NasSecurityByRef.BearerId); + //v_message.security_Protected_Nas_Message.plainNASMessage := v_NonCleartextString; + log("f_Check_5GAKA_NAS_DL_Message: TODO Cyphered message"); + setverdict(inconc); + return false; + } + // Message was decrypted properly + v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); + if (decvalue(v_bs, v_message) != 0) { + log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); + return false; + } + log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); + } + if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { + log(match(v_message, p_NG_NAS_DL_Message_Type)); + return false; + } + p_message := v_message; + log("f_Check_5GAKA_NAS_DL_Message: matching: p_message: ", p_message); + + return true; + } // End of function f_Check_5GAKA_NAS_DL_Message + + function f_Check_5GAKA_NAS_UL_Message( + in NAS_PDU p_nas_pdu, + in template NG_NAS_UL_Message_Type p_NG_NAS_UL_Message_Type + ) return boolean { + log(">>> f_Check_5GAKA_NAS_UL_Message: ", p_nas_pdu); + + var bitstring v_bs := oct2bit(p_nas_pdu); + var NG_NAS_UL_Message_Type v_message; + if (decvalue(v_bs, v_message) != 0) { + log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); + return false; + } + log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); + if (ischosen(v_message.security_Protected_Nas_Message)) { + // TODO Decyphered message + log("f_Check_5GAKA_NAS_UL_Message: TODO Decyphered message"); + setverdict(inconc); + return false; + } else if (ispresent(v_message.security_Protected_Nas_Message.plainNASMessage)) { + v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); + if (decvalue(v_bs, v_message) != 0) { + log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); + return false; + } + log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); + } + if (not(match(v_message, p_NG_NAS_UL_Message_Type))) { + log(match(v_message, p_NG_NAS_UL_Message_Type)); + return false; + } + log("f_Check_5GAKA_NAS_UL_Message: matching"); + + return true; + } // End of function f_Check_5GAKA_NAS_UL_Message + + function f_Check_5GAKA_NAS_DL_Message_is_encrypted(in NAS_PDU p_nas_pdu) return boolean { + log(">>> f_Check_5GAKA_NAS_DL_Message_is_encrypted: ", p_nas_pdu); + + var bitstring v_bs := oct2bit(p_nas_pdu); + var NG_NAS_DL_Message_Type v_message; + if (decvalue(v_bs, v_message) != 0) { + log("f_Check_5GAKA_NAS_DL_Message_is_encrypted: decvalue failure"); + return false; + } + log("f_Check_5GAKA_NAS_DL_Message_is_encrypted: v_message: ", v_message); + if (not ischosen(v_message.security_Protected_Nas_Message)) { + return false + } + + return true; + } // End of function f_Check_5GAKA_NAS_DL_Message_is_encrypted + + function f_Check_5GAKA_NAS_UL_Message_is_encrypted(in NAS_PDU p_nas_pdu) return boolean { + log(">>> f_Check_5GAKA_NAS_UL_Message_is_encrypted: ", p_nas_pdu); + + var bitstring v_bs := oct2bit(p_nas_pdu); + var NG_NAS_UL_Message_Type v_message; + if (decvalue(v_bs, v_message) != 0) { + log("f_Check_5GAKA_NAS_UL_Message_is_encrypted: decvalue failure"); + return false; + } + log("f_Check_5GAKA_NAS_UL_Message_is_encrypted: v_message: ", v_message); + if (not ischosen(v_message.security_Protected_Nas_Message)) { + return false + } + + return true; + } // End of function f_Check_5GAKA_NAS_UL_Message_is_encrypted + + group fiveg_aka_security_network { // FIXME FSCOM To be re-organize later to create a security library + + /** + * @desc Compute RES and XRES values based on rAND & AUTN received in the NG_AUTHENTICATION_REQUEST + * @param [in] p_rand + * @param [in] p_autn + * @param [in] KeySeq + * @param [in,out] p_ng_nas_security_params_type Built security parameters + */ + function f_5g_aka_compute_res_xres( + in B128_Type p_subscription_key := PX_SUBSCRIPTION_KEY, + in B128_Type p_rand, + in B128_Type p_autn, + in ABBA p_abba, + in NAS_PlmnId p_PLMN, + in template (omit) hexstring p_NID := omit, + inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type + ) return boolean { + log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); + + p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); + log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); + p_ng_nas_security_params_type.ABBA := p_abba.abbaValue; + p_ng_nas_security_params_type.AuthParams.RandValue := p_rand; + p_ng_nas_security_params_type.AuthParams.AUTN := p_autn; + + log("f_5g_aka_compute_res_xres: PX_SUBSCRIPTION_KEY=", PX_SUBSCRIPTION_KEY); + + // Extract SQN from v_sqn_ak and XOR it with calculated MAC + var B48_Type v_sqn_ak := f_extract_sqn_ak_from_autn(p_autn); + var B16_Type v_amf := f_extract_amf_from_autn(p_autn); + var B64_Type v_mac := f_extract_mac_from_autn(p_autn); + log("f_5g_aka_compute_res_xres: v_sqn_ak=", bit2oct(v_sqn_ak)); + log("f_5g_aka_compute_res_xres: v_amf=", bit2oct(v_amf)); + log("f_5g_aka_compute_res_xres: v_mac=", bit2oct(v_mac)); + + // Set OP + if (PX_FORCE_USING_OPERATOR_SECRET_KEY == false) { + f_set_op(PX_OPERATOR_KEY); + } else { + f_force_opc(PX_OPERATOR_SECRET_KEY); + } + // Calculate RES, CK, IK and AK in one step + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + var B64_Type v_res; + if (f_f2345(PX_SUBSCRIPTION_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { + log("f_f2345 failed"); + return false; + } + p_ng_nas_security_params_type.AuthParams.CK := v_ck; + log("f_5g_aka_compute_res_xres: CK=", bit2oct(p_ng_nas_security_params_type.AuthParams.CK)); + p_ng_nas_security_params_type.AuthParams.IK := v_ik; + log("f_5g_aka_compute_res_xres: IK=", bit2oct(p_ng_nas_security_params_type.AuthParams.IK)); + p_ng_nas_security_params_type.Ks := p_ng_nas_security_params_type.AuthParams.CK & p_ng_nas_security_params_type.AuthParams.IK; + log("f_5g_aka_compute_res_xres: Ks=", bit2oct(p_ng_nas_security_params_type.Ks)); + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; + log("f_5g_aka_compute_res_xres: v_sqn=", bit2oct(v_sqn)); + + // Verify that MAC-A was accepted + var B64_Type v_mac_a; + if (f_f1(PX_SUBSCRIPTION_KEY, p_rand, v_sqn, v_amf, v_mac_a) == -1) { + log("f_f1 failed: "); + return false; + } + log("f_5g_aka_compute_res_xres: v_mac_a=", bit2oct(v_mac_a)); + if (PX_CHECK_SECURITY and (v_mac != v_mac_a)) { + log("v_mac != v_mac_a"); + return false; + } + + // Compute XRES + p_ng_nas_security_params_type.AuthParams.XRES := f_NG_Authentication_A4(p_PLMN, + p_ng_nas_security_params_type.AuthParams, + p_ng_nas_security_params_type.KDF, + p_ng_nas_security_params_type.Ks, + p_NID); + p_ng_nas_security_params_type.AuthParams.XRESLength := lengthof(bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); + log("f_5g_aka_compute_res_xres: XRES=", p_ng_nas_security_params_type.AuthParams.XRES); + log("f_5g_aka_compute_res_xres: XRESLength=", p_ng_nas_security_params_type.AuthParams.XRESLength); + + // Generate KAUSF + p_ng_nas_security_params_type.KAUSF := f_NG_Authentication_A2(p_ng_nas_security_params_type.AuthParams, + p_ng_nas_security_params_type.KDF, + p_ng_nas_security_params_type.Ks, + p_PLMN, + p_NID); + log("f_5g_aka_compute_res_xres: KAUSF=", p_ng_nas_security_params_type.KAUSF); + + // Generate KSEAF + p_ng_nas_security_params_type.KSEAF := f_NG_Authentication_A6(p_PLMN, + p_ng_nas_security_params_type.KAUSF, + p_ng_nas_security_params_type.KDF, + p_NID + ); + log("f_5g_aka_compute_res_xres: KSEAF=", bit2oct(p_ng_nas_security_params_type.KSEAF)); + + // TODO Generate KMAF + // p_ng_nas_security_params_type.KAMF := f_NG_Authentication_A7(p_Identity, + // p_ng_nas_security_params_type.KSEAF, + // p_ng_nas_security_params_type.ABBA, + // p_ng_nas_security_params_type.KDF + // ); + //log("f_5g_aka_compute_res_xres: KAMF=", p_ng_nas_security_params_type.KAMF); + + log("<<< f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); + return true; + } // End of function f_5g_aka_compute_res_xres + + function f_5g_security_context( + in template (value) NG_SECURITY_MODE_COMMAND p_ng_security_mode_command, + inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type + ) return boolean { + log(">>> f_5g_security_context: ", p_ng_security_mode_command); + + // Set security parameters + p_ng_nas_security_params_type.NAS_Integrity.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.integrityType); + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.cipheringType); + + log("<<< f_5g_security_context: ", p_ng_nas_security_params_type); + return true; + } // End of function f_5g_security_context + + + + + //-------------------------------------------------------------------------- + /* + * @desc HRES* and HXRES* derivation function + * As per annex A.5 of 33.501 + * @param p_AuthParams + * @param p_KAUSF + * @param p_KDF_Type + * @param p_NID (default value: omit) + * @return B256_Type + */ + function f_NG_Authentication_A5( + in B128_Type p_RAND, + in B64_Type p_XRESstar, + KDF_Type p_KDF_Type, + B256_Type p_Key + ) return B128_Type + { + const octetstring const_S6C_FC :='6C'O; + var octetstring v_S; + var octetstring v_P0; + var octetstring v_P1; + + log(">>> f_NG_Authentication_A5: p_RAND=", bit2oct(p_RAND)); + log(">>> f_NG_Authentication_A5: p_XRESstar=", bit2oct(p_XRESstar)); + log(">>> f_NG_Authentication_A5: p_KDF=", p_KDF_Type); + log(">>> f_NG_Authentication_A5: p_Key=", bit2oct(p_Key)); + + v_S := bit2oct(p_RAND) & bit2oct(p_XRESstar); + log("f_NG_Authentication_A5: v_S=", v_S); + + //return substr(fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S), 128, 128); + return substr(fx_sha256(v_S), 128, 128); + }; + + + + + + + + + + + + + + + + function f_extract_sqn_ak_from_autn(in B128_Type p_autn) return B48_Type { + return substr(p_autn, 0, 48); + } + + function f_extract_amf_from_autn(in B128_Type p_autn) return B16_Type { + return substr(p_autn, 48, 16); + } + + function f_extract_mac_from_autn(in B128_Type p_autn) return B64_Type { + return substr(p_autn, 64, 64); + } + + /** + * @desc Set operator variant algorithm configuration + * @param [in] p_op Operator variant algorithm configuration + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ + function f_set_op(in O16_Type p_op) { + fx_set_op(p_op); + } + /** + * @desc Get operator variant algorithm configuration + * @param [out] p_op Operator variant algorithm configuration + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ + function f_get_op(out O16_Type p_op) { + fx_get_op(p_op); + } + /** + * @desc Derived OP from from OP and K (subscriber key) + * @param [in] p_authK The subscriber key + * @param [out] p_opc The derived OP from from OP and K + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ + function f_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer { + return fx_compute_opc(p_authK, p_opc); + } + /** + * @desc Force the value of OPc. In this case, OP is ignored. + * @param [in] p_opc The derived OP from from OP and K + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 2 + */ + function f_force_opc(in O16_Type p_opc) { + fx_force_opc(p_opc); + } + + /** + * @desc Encryption according to the cryptographic kernel function Rijndael. + * @see ETSI TS 135 207 V16.0.0 (2020-08) Clause 3 + */ + external function fx_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer; + function f_rijndael_encrypt(in octetstring p_key, in octetstring p_plain_text, out octetstring p_cypherer_text) return integer { + return fx_rijndael_encrypt(p_key, p_plain_text, p_cypherer_text); + } + + function f_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer { + return fx_f1(p_authK, p_rand, v_sqn, v_amf, v_mac_a); + } + + function f_f1star(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_s) return integer { + return fx_f1star(p_authK, p_rand, v_sqn, v_amf, v_mac_s); + } + + function f_f2345(in B128_Type p_authK, in B128_Type p_rand, out B64_Type v_res, out B128_Type v_ck, out B128_Type v_ik, out B48_Type v_ak) return integer { + return fx_f2345(p_authK, p_rand, v_res, v_ck, v_ik, v_ak); + } + + function f_f5star(in B128_Type p_authK, in B128_Type p_rand, out B48_Type p_ak) return integer { + return fx_f5star(p_authK, p_rand, p_ak); + } + + external function fx_set_op(in O16_Type p_op); + external function fx_get_op(out O16_Type p_op); + external function fx_force_opc(in O16_Type p_op); + external function fx_compute_opc(in O16_Type p_authK, out O16_Type p_opc) return integer; + external function fx_f1(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_a) return integer; + external function fx_f1star(in B128_Type p_authK, in B128_Type p_rand, in B48_Type v_sqn, in B16_Type v_amf, out B64_Type v_mac_s) return integer; + external function fx_f2345(in B128_Type p_authK, in B128_Type p_rand, out B64_Type v_res, out B128_Type v_ck, out B128_Type v_ik, out B48_Type v_ak) return integer; + external function fx_f5star(in B128_Type p_authK, in B128_Type p_rand, out B48_Type p_ak) return integer; + + } // End of function fiveg_aka_security_network + +} // End of module Lib_NG_NAS_Security_Functions \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn similarity index 95% rename from ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn rename to ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 1148ff5..8630a22 100644 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -70,11 +70,11 @@ module Lib_NG_NAS_Templates { authentication_Response := {} } // End of template mw_NG_AUTHENTICATION_RESPONSE - template (value) NG_NAS_DL_Message_Type m_NG_AUTHENTICATION_RESULT( - in NAS_KsiValue p_KeySetId, - in template (omit) EAP_Message p_EAP, - in template (omit) ABBA p_ABBA - ) modifies cs_NG_AUTHENTICATION_RESULT := { /* @status APPROVED (NR5GC) */ + template (omit) NG_NAS_DL_Message_Type m_NG_AUTHENTICATION_RESULT( + in NAS_KsiValue p_KeySetId, + in template (omit) EAP_Message p_EAP, + in template (omit) ABBA p_ABBA + ) modifies cs_NG_AUTHENTICATION_RESULT := { /* @status APPROVED (NR5GC) */ /* 24.501 cl. 8.2.3 */ authentication_Result := { } @@ -334,59 +334,59 @@ module Lib_NG_NAS_Templates { smsRequested := p_SmsRequested } // End of template mw_NG_Update - template (value) NG_NAS_DL_Message_Type m_NG_REGISTRATION_ACCEPT( - in template (value) RegistrationResult p_RegistrationResult, - in template (omit) NG_MobileIdentity p_GUTI := omit, - in template (omit) PLMN_List p_EPLMNs := omit, - in template (omit) NG_TrackingAreaIdList p_TAIList := omit, - in template (omit) NSSAI p_AllowedNSSAI := omit, - in template (omit) RejectedNSSAI p_RejectedNSSAI := omit, - in template (omit) NSSAI p_ConfiguredNSSAI := omit, - in template (omit) NG_NetworkFeatureSupport p_NwkFeatureSupport := omit, - in template (omit) PDU_SessionStatus p_PDU_SessionStatus := omit, - in template (omit) PDU_SessionReactivationResult p_PDU_SessionReactResult := omit, - in template (omit) PDU_SessionReactivationError p_PDU_SessionReactError := omit, - in template (omit) LADN_Info p_LADN_Info := omit, - in template (omit) MICO_Ind p_MICO_Ind := omit, - in template (omit) NetworkSlicingInd p_NetworkSlicingInd := omit, - in template (omit) ServiceAreaIdList p_SAIList := omit, - in template (omit) GPRS_Timer3 p_T3512 := omit, - in template (omit) GPRS_Timer2 p_Non3GPPDereg := omit, - in template (omit) GPRS_Timer2 p_T3502 := omit, - in template (omit) EmergNumList p_EmergNumList := omit, - in template (omit) ExtdEmergNumList p_ExtdEmergNumList := omit, - in template (omit) SORTransparentContainer p_SOR := omit, - in template (omit) EAP_Message p_EAP := omit, - in template (omit) InclusionModeNSSAI p_InclusionModeNSSAI := omit, - in template (omit) OperatorAccessCatDefinitions p_AccessCatDefinition := omit, - in template (omit) NG_DRXparameter p_NG_DRXparameter := omit, - in template (omit) Non3GPP_NW_ProvidedPolicies p_Non3GPP_NW_ProvidedPolicies := omit, - in template (omit) EPS_BearerContextStatus p_EPS_BearerContextStatus := omit, - in template (omit) ExtdDRXParams p_NegotiatedExtdDRXParams := omit, - in template (omit) GPRS_Timer3 p_T3447 := omit, - in template (omit) GPRS_Timer3 p_T3448 := omit, - in template (omit) GPRS_Timer3 p_T3324 := omit, - in template (omit) UERadioCapId p_UERadioCapId := omit, - in template (omit) UERadioCapIdDeletion p_UERadioCapIdDeletion := omit, - in template (omit) NSSAI p_PendingNSSAI := omit, - in template (omit) NG_CipheringKeyData p_CipheringKeyData := omit, - in template (omit) CAGInfoList p_CAGInfoList := omit, - in template (omit) TruncatedS_TMSIConfig p_TruncatedS_TMSIConfig := omit, - in template (omit) WUSAssistInfo p_WUSAssistInfo := omit, - in template (omit) NB_N1ModeDRXParams p_NB_N1ModeDRXParams := omit, - in template (omit) ExtdRejectedNSSAI p_ExtdRejectedNSSAI := omit, - in template (omit) ServiceLvlAAContainer p_ServiceLvlAA := omit, - in template (omit) PEIPS_AssistInfo p_NegotiatedPEIPS_AssistInfo := omit, - in template (omit) NG_AddReqResult p_AddRequestResult := omit, - in template (omit) NSSRG_Info p_NssrgInfo := omit, - in template (omit) RegistrationWaitRange p_DisasterRoamingWaitRange := omit, - in template (omit) RegistrationWaitRange p_DisasterReturnWaitRange := omit, - in template (omit) DisasterPLMNList p_DisasterPLMNList := omit, - in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_Roaming := omit, - in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := omit, - in template (omit) ExtdCAGInfoList p_ExtdCAGInfoList := omit, - in template (omit) NSAG_Info p_NsagInfo := omit - ) modifies cs_NG_REGISTRATION_ACCEPT := { /* 24.501 cl. 8.2.7 */ + template (omit) NG_NAS_DL_Message_Type m_NG_REGISTRATION_ACCEPT( + in template (value) RegistrationResult p_RegistrationResult, + in template (omit) NG_MobileIdentity p_GUTI := omit, + in template (omit) PLMN_List p_EPLMNs := omit, + in template (omit) NG_TrackingAreaIdList p_TAIList := omit, + in template (omit) NSSAI p_AllowedNSSAI := omit, + in template (omit) RejectedNSSAI p_RejectedNSSAI := omit, + in template (omit) NSSAI p_ConfiguredNSSAI := omit, + in template (omit) NG_NetworkFeatureSupport p_NwkFeatureSupport := omit, + in template (omit) PDU_SessionStatus p_PDU_SessionStatus := omit, + in template (omit) PDU_SessionReactivationResult p_PDU_SessionReactResult := omit, + in template (omit) PDU_SessionReactivationError p_PDU_SessionReactError := omit, + in template (omit) LADN_Info p_LADN_Info := omit, + in template (omit) MICO_Ind p_MICO_Ind := omit, + in template (omit) NetworkSlicingInd p_NetworkSlicingInd := omit, + in template (omit) ServiceAreaIdList p_SAIList := omit, + in template (omit) GPRS_Timer3 p_T3512 := omit, + in template (omit) GPRS_Timer2 p_Non3GPPDereg := omit, + in template (omit) GPRS_Timer2 p_T3502 := omit, + in template (omit) EmergNumList p_EmergNumList := omit, + in template (omit) ExtdEmergNumList p_ExtdEmergNumList := omit, + in template (omit) SORTransparentContainer p_SOR := omit, + in template (omit) EAP_Message p_EAP := omit, + in template (omit) InclusionModeNSSAI p_InclusionModeNSSAI := omit, + in template (omit) OperatorAccessCatDefinitions p_AccessCatDefinition := omit, + in template (omit) NG_DRXparameter p_NG_DRXparameter := omit, + in template (omit) Non3GPP_NW_ProvidedPolicies p_Non3GPP_NW_ProvidedPolicies := omit, + in template (omit) EPS_BearerContextStatus p_EPS_BearerContextStatus := omit, + in template (omit) ExtdDRXParams p_NegotiatedExtdDRXParams := omit, + in template (omit) GPRS_Timer3 p_T3447 := omit, + in template (omit) GPRS_Timer3 p_T3448 := omit, + in template (omit) GPRS_Timer3 p_T3324 := omit, + in template (omit) UERadioCapId p_UERadioCapId := omit, + in template (omit) UERadioCapIdDeletion p_UERadioCapIdDeletion := omit, + in template (omit) NSSAI p_PendingNSSAI := omit, + in template (omit) NG_CipheringKeyData p_CipheringKeyData := omit, + in template (omit) CAGInfoList p_CAGInfoList := omit, + in template (omit) TruncatedS_TMSIConfig p_TruncatedS_TMSIConfig := omit, + in template (omit) WUSAssistInfo p_WUSAssistInfo := omit, + in template (omit) NB_N1ModeDRXParams p_NB_N1ModeDRXParams := omit, + in template (omit) ExtdRejectedNSSAI p_ExtdRejectedNSSAI := omit, + in template (omit) ServiceLvlAAContainer p_ServiceLvlAA := omit, + in template (omit) PEIPS_AssistInfo p_NegotiatedPEIPS_AssistInfo := omit, + in template (omit) NG_AddReqResult p_AddRequestResult := omit, + in template (omit) NSSRG_Info p_NssrgInfo := omit, + in template (omit) RegistrationWaitRange p_DisasterRoamingWaitRange := omit, + in template (omit) RegistrationWaitRange p_DisasterReturnWaitRange := omit, + in template (omit) DisasterPLMNList p_DisasterPLMNList := omit, + in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_Roaming := omit, + in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := omit, + in template (omit) ExtdCAGInfoList p_ExtdCAGInfoList := omit, + in template (omit) NSAG_Info p_NsagInfo := omit + ) modifies cs_NG_REGISTRATION_ACCEPT := { /* 24.501 cl. 8.2.7 */ /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ registration_Accept := { } @@ -518,8 +518,19 @@ module Lib_NG_NAS_Templates { } } // End of template m_NG_REGISTRATION_COMPLETE + template (value) NG_NAS_UL_Message_Type m_NG_REGISTRATION_COMPLETE_noSOR := { /* 24.501 cl. 8.2.8 */ + /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ + registration_Complete := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_RegistrationComplete, /* cl. 9.7 M V 1 */ + sorTransparentContainer := omit + } + } // End of template m_NG_REGISTRATION_COMPLETE + template (present) NG_NAS_UL_Message_Type mw_NG_REGISTRATION_COMPLETE( - template SORTransparentContainer p_SOR := ? + template (present) SORTransparentContainer p_SOR := ? ) modifies cr_NG_REGISTRATION_COMPLETE := { /* 24.501 cl. 8.2.8 */ /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ registration_Complete := { @@ -531,20 +542,20 @@ module Lib_NG_NAS_Templates { } } // End of template mw_NG_REGISTRATION_COMPLETE - template (value) NG_NAS_DL_Message_Type m_NG_REGISTRATION_REJECT( - in template (value) GMM_GSM_Cause p_Cause, - in template (omit) GPRS_Timer2 p_T3346 := omit, - in template (omit) GPRS_Timer2 p_T3502 := omit, - in template (omit) EAP_Message p_EAP := omit, - in template (omit) RejectedNSSAI p_RejectedNSSAI := omit, - in template (omit) CAGInfoList p_CAGInfoList := omit, - in template (omit) ExtdRejectedNSSAI p_ExtdRejectedNSSAI := omit, - in template (omit) RegistrationWaitRange p_DisasterReturnWaitRange := omit, - in template (omit) ExtdCAGInfoList p_ExtdCAGInfoList := omit, - in template (omit) GPRS_Timer3 p_LowerBoundTimerValue := omit, - in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_Roaming := omit, - in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := omit - ) modifies cs_NG_REGISTRATION_REJECT := { /* @status APPROVED (NR5GC, NR5GC_IRAT) */ + template (omit) NG_NAS_DL_Message_Type m_NG_REGISTRATION_REJECT( + in template (value) GMM_GSM_Cause p_Cause, + in template (omit) GPRS_Timer2 p_T3346 := omit, + in template (omit) GPRS_Timer2 p_T3502 := omit, + in template (omit) EAP_Message p_EAP := omit, + in template (omit) RejectedNSSAI p_RejectedNSSAI := omit, + in template (omit) CAGInfoList p_CAGInfoList := omit, + in template (omit) ExtdRejectedNSSAI p_ExtdRejectedNSSAI := omit, + in template (omit) RegistrationWaitRange p_DisasterReturnWaitRange := omit, + in template (omit) ExtdCAGInfoList p_ExtdCAGInfoList := omit, + in template (omit) GPRS_Timer3 p_LowerBoundTimerValue := omit, + in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_Roaming := omit, + in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := omit + ) modifies cs_NG_REGISTRATION_REJECT := { /* @status APPROVED (NR5GC, NR5GC_IRAT) */ /* 24.501 cl. 8.2.9 */ registration_Reject := { } @@ -845,7 +856,7 @@ module Lib_NG_NAS_Templates { template (present) NG_NAS_UL_Message_Type mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( template (present) NG_PDU_SessionId p_PDU_SessionId := ?, template (present) ProcedureTransactionIdentifier p_PTI := ?, - template PDU_SessionType p_PDU_SessionType, + template PDU_SessionType p_PDU_SessionType := *, template SSC_Mode p_SSC_Mode := *, template NG_UE_SM_Cap p_UECap := *, template MaxNumPacketFilters p_MaxNumPacketFilters := *, @@ -862,39 +873,39 @@ module Lib_NG_NAS_Templates { template ServiceLvlAAContainer p_ServiceLvlAA := *, template RequestedMBSContainer p_RequestedMBS := *, template PDUSessionPairId p_PduSessionPairId := *, - template RSN p_RSN + template RSN p_RSN := * ) modifies cr_NG_PDU_SESSION_ESTABLISHMENT_REQUEST := { /* 24.501 cl. 8.3.1 */ /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ pdu_Session_Establishment_Request := { } } // End of template mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST - template (value) NG_NAS_DL_Message_Type m_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT( - in template (value) NG_PDU_SessionId p_PDU_SessionId, - in ProcedureTransactionIdentifier p_PTI, - in template (value) SSC_Mode p_SSC_Mode, - in template (value) PDU_SessionType p_PDU_SessionType, - in template (value) QoS_Rules p_QoS_Rules, - in template (value) Session_AMBR p_Session_AMBR, - in template (omit) GMM_GSM_Cause p_Cause := omit, - in template (omit) PDU_Address p_PDU_Address := omit, - in template (omit) GPRS_Timer p_RQTimer := omit, - in template (omit) S_NSSAI_Type p_S_NSSAI := omit, - in template (omit) AlwaysOnPDUSessionInd p_AlwaysOnPDUSessionInd := omit, - in template (omit) MappedEPSBearerContexts p_MappedEPSBearerContexts := omit, - in template (omit) EAP_Message p_EAP := omit, - in template (omit) QoSFlowDescr p_QoSFlowDescr := omit, - in template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit, - in template (omit) DNN p_DNN := omit, - in template (omit) NGSM_NetworkFeatureSupport p_NGSM_NtwkFeatSupport := omit, - in template (omit) ServingPLMNRateControl p_ServingPLMNRateCtrl := omit, - in template (omit) ATSSSContainer p_ATSSSContainer := omit, - in template (omit) ControlPlaneInd p_ControlPlaneInd := omit, - in template (omit) IPHeaderCompressionConfig p_IPHeaderCompConfig := omit, - in template (omit) EthernetHeaderCompressConfig p_EthernetHeaderCompConfig := omit, - in template (omit) ServiceLvlAAContainer p_ServiceLvlAA := omit, - in template (omit) ReceivedMBSContainer p_ReceivedMBS := omit - ) modifies cs_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT := { /* 24.501 cl. 8.3.2 */ + template (omit) NG_NAS_DL_Message_Type m_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT( + in template (value) NG_PDU_SessionId p_PDU_SessionId, + in ProcedureTransactionIdentifier p_PTI, + in template (value) SSC_Mode p_SSC_Mode, + in template (value) PDU_SessionType p_PDU_SessionType, + in template (value) QoS_Rules p_QoS_Rules, + in template (value) Session_AMBR p_Session_AMBR, + in template (omit) GMM_GSM_Cause p_Cause := omit, + in template (omit) PDU_Address p_PDU_Address := omit, + in template (omit) GPRS_Timer p_RQTimer := omit, + in template (omit) S_NSSAI_Type p_S_NSSAI := omit, + in template (omit) AlwaysOnPDUSessionInd p_AlwaysOnPDUSessionInd := omit, + in template (omit) MappedEPSBearerContexts p_MappedEPSBearerContexts := omit, + in template (omit) EAP_Message p_EAP := omit, + in template (omit) QoSFlowDescr p_QoSFlowDescr := omit, + in template (omit) ExtdProtocolConfigOptions p_ExtdPCO := omit, + in template (omit) DNN p_DNN := omit, + in template (omit) NGSM_NetworkFeatureSupport p_NGSM_NtwkFeatSupport := omit, + in template (omit) ServingPLMNRateControl p_ServingPLMNRateCtrl := omit, + in template (omit) ATSSSContainer p_ATSSSContainer := omit, + in template (omit) ControlPlaneInd p_ControlPlaneInd := omit, + in template (omit) IPHeaderCompressionConfig p_IPHeaderCompConfig := omit, + in template (omit) EthernetHeaderCompressConfig p_EthernetHeaderCompConfig := omit, + in template (omit) ServiceLvlAAContainer p_ServiceLvlAA := omit, + in template (omit) ReceivedMBSContainer p_ReceivedMBS := omit + ) modifies cs_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT := { /* 24.501 cl. 8.3.2 */ /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ pdu_Session_Establishment_Accept := { } @@ -1532,7 +1543,7 @@ module Lib_NG_NAS_Templates { in template (omit) NASMessageContainer p_NASMsg := omit, in template (omit) UE_RequestType p_UeRequestType := omit, in template (omit) NG_PagingRestriction p_PagingRestrict := omit - ) modifies cr_NG_CP_SERVICE_REQUEST := { + ) := { cp_Service_Request := { protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ @@ -2125,8 +2136,23 @@ module Lib_NG_NAS_Templates { } // End of template mw_IdentityType //from template (present) NG_MobileIdentity cr_NG_MobileIdentitySUCI - NG_NAS_Common - template (value) NG_MobileIdentity m_NG_MobileIdentitySUCI(template (value) B4_Type p_SUPIFormat, - template (value) octetstring p_OtherDigits) := + template (value) NG_MobileIdentity m_NG_MobileIdentitySUCI( + in template (value) B4_Type p_SUPIFormat, + in template (value) octetstring p_OtherDigits + ) := + { /* @status APPROVED (NR5GC) */ + iei := omit, + iel := int2oct(1+lengthof(p_OtherDigits), 2), // @sic R5s190719 sic@ + idDigit1 := p_SUPIFormat, // 4 bits + oddEvenInd := '0'B, // 1 bit + typeOfId := tsc_IdType_NG_SUCI, // 3 bits + otherDigits := p_OtherDigits + }; + + template (present) NG_MobileIdentity mw_NG_MobileIdentitySUCI( + in template (present) B4_Type p_SUPIFormat := ?, + in template (present) octetstring p_OtherDigits := ? + ) := { /* @status APPROVED (NR5GC) */ iei := omit, iel := int2oct(1+lengthof(p_OtherDigits), 2), // @sic R5s190719 sic@ @@ -2220,4 +2246,38 @@ module Lib_NG_NAS_Templates { iei := p_iei } // End of template mw_NAS_KeySetIdentifier + template (omit) NG_UE_SecurityCapability m_ng_ue_security_capability( + in template (value) Type4Length_Type p_iel := '2e'O, + in O1_Type p_ngeaCap := 'f0'O, + in O1_Type p_ngiaCap := 'f0'O, + in template (omit) O1_Type p_eeaCap := omit, + in template (omit) O1_Type p_eiaCap := omit, + in template (omit) octetstring p_spare := omit + ) := { + iei := omit, + iel := p_iel, + ngeaCap := p_ngeaCap, + ngiaCap := p_ngiaCap, + eeaCap := p_eeaCap, + eiaCap := p_eiaCap, + spare := p_spare + } // End of template m_ng_ue_security_capability + + template (present) NG_UE_SecurityCapability mw_ng_ue_security_capability( + template (present) Type4Length_Type p_iel := '2e'O, + template (present) O1_Type p_ngeaCap := 'f0'O, + template (present) O1_Type p_ngiaCap := 'f0'O, + template O1_Type p_eeaCap := *, + template O1_Type p_eiaCap := *, + template octetstring p_spare := * + ) := { + iei := omit, + iel := p_iel, + ngeaCap := p_ngeaCap, + ngiaCap := p_ngiaCap, + eeaCap := p_eeaCap, + eiaCap := p_eiaCap, + spare := p_spare + } // End of template mw_ng_ue_security_capability + } // End of module Lib_NG_NAS_Templates \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/NG_NAS_BaseTemplates.ttcn b/ttcn/Lib_NG_NAS/lib/NG_NAS_BaseTemplates.ttcn similarity index 100% rename from ttcn/Lib_NG_NAS/NG_NAS_BaseTemplates.ttcn rename to ttcn/Lib_NG_NAS/lib/NG_NAS_BaseTemplates.ttcn diff --git a/ttcn/Lib_NG_NAS/NG_NAS_EncdecDeclarations b/ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations similarity index 100% rename from ttcn/Lib_NG_NAS/NG_NAS_EncdecDeclarations rename to ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn new file mode 100644 index 0000000..ee0e915 --- /dev/null +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -0,0 +1,282 @@ +module Lib_NG_NAS_Functions { + + // Lib_NG_NAS + import from Lib_NG_NAS_Interface all; + import from Lib_NG_NAS_Templates all; + import from Lib_NG_NAS_Security_Functions all; + import from Lib_NG_NAS_Pixits all; + + // NG_NAS + import from NG_NAS_TypeDefs all; + + // Lib3GPP + import from CommonDefs all; + import from NG_NAS_MsgContainers all; + import from NAS_CommonTypeDefs all; + import from NAS_CommonTemplates all; + import from NG_NAS_Common all; + import from NAS_AuthenticationCommon all; + import from NG_NAS_SecurityFunctions all; + + // Lib_NGAP + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from LibNGAP_Pixits all; + import from LibNGAP_Templates all; + import from LibNGAP_Interface all; + import from LibNGAP_Steps all; + import from LibNGAP_Functions all; + + /** + * @desc Function to send NAS RegistrationRequest message + * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg + */ + function f_send_NasRegistrationRequest() runs on NGNASComponent { + vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( + {'0'B,'001'B}, + '111'B, + '0'B, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) // TODO Use PIXIT here? + ); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + } + + /** + * @desc Function to await NAS NGSetupResponse message + */ + function f_await_registration_accept() runs on NGNASComponent { + // Await request for REGISTRATION_ACCEPT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // AuthorizationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT( + -, + ?, + mw_PLMN_List( + -, -, + { + *, + PX_PLMN_IDENTITY, + * + } + ), + -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + ? + ), + v_message) == false) { + setverdict(fail); + return; + } + + setverdict(pass); + } + + /** + * @desc Function to await NAS AuthenticationRequest message and send AuthenticationResponse message with security computation for future encryption + */ + function f_await_NasAuthenticationRequest_send_NasAuthenticationResponse() runs on NGNASComponent { + // Await request for authentication + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // AuthenticationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + '100'B, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + v_message + ) == false) { + setverdict(fail); + return; + } + setverdict(pass); + + // Compute RES/XRES + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + setverdict(pass); + + // Send response + vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( + { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + ); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + } + + /******************************************************************************** + * + * FIXME Use or enhance check functions from 3GPP library such as NG_NASTemplateFunctions.f_Check_NG_SecurityModeCompleteMsg + * + ********************************************************************************/ + + function f_await_NasSecurityModeCommand() runs on NGNASComponent { + // Await SecurityModeCommand + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // Security mode command + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMMAND, + v_message + ) == false) { + setverdict(fail); + return; + } + // Extract security parameters + if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + + setverdict(pass); + } + + function f_await_NasSecurityModeCommand_send_NasSecurityModeComplete() runs on NGNASComponent { + // Await SecurityModeCommand + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // Security mode command + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMMAND, + v_message + ) == false) { + setverdict(fail); + return; + } + + setverdict(pass); + // Extract security parameters + if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + + // Send SecurityModeComplete + vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + ); + var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type + vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + tsc_EPD_GMM, + tsc_SpareHalfOctet, + tsc_SHT_IntegrityProtected_Ciphered, + '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + '00'O, + os // Cyphered NAS message + ) + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + } + + function f_terminate_NasRegistrationRequest_with_reject( + in NAS_CauseValue_Type p_nas_cause_value := tsc_EmmCause_IllegalMe + ) runs on NGNASComponent { + // Send error message + vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( + m_GMM_GSM_Cause( + -, + p_nas_cause_value + )); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + } + + function f_send_NGUERadioCApabilityInfoIndication() runs on NGNASComponent { + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UERadioCapabilityInfoIndication( + -, -, + ''O // FIXME FSCOM How to deal with UERadioCapability + ))); + } + + function f_await_NGInitialContextSetupRequest_send_NGInitialContextSetupRespone() runs on NGNASComponent { + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_InitialContextSetupRequest_withPDUSessionList( // FIXME FSCOM How to deal with it? + + ))); + f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes + )); + } + +} // End of module Lib_NG_NAS_Functions \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Interface.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn similarity index 67% rename from ttcn/Lib_NG_NAS/Lib_NG_NAS_Interface.ttcn rename to ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn index d2b0d8f..8a4baf8 100644 --- a/ttcn/Lib_NG_NAS/Lib_NG_NAS_Interface.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn @@ -19,9 +19,6 @@ module Lib_NG_NAS_Interface { import from NG_NAS_SecurityFunctions all; // LibNGAP - //import from NGAP_IEs language "ASN.1:1997" all; - //import from NGAP_PDU_Descriptions language "ASN.1:1997" all; - //import from LibNGAP_Pixits all; import from LibNGAP_Interface all; group portDefinitions { @@ -31,16 +28,6 @@ module Lib_NG_NAS_Interface { type component NGNASComponent extends NGAPComponent {//extends SelfSyncComp { // Port //port NGAPPort N2_gNBaMF_P; - - // Global variables - var template NG_NAS_UL_Message_Type vt_NgNasUl_Msg := omit; - var template NG_NAS_DL_Message_Type vt_NgNasDl_Msg := omit; - var octetstring vc_sendNAS_PDU :=''O; - var octetstring vc_recvNAS_PDU :=''O; - var octetstring vc_recvNAS_PDUDefault:=''O; - var NG_NAS_UL_Message_Type vc_recvNgNasUl_Msg; - var NG_NAS_DL_Message_Type vc_recvNgNasDl_Msg; - var NG_NAS_SecurityParams_Type vc_ng_nas_security_params_type := {}; // Init of values at component started diff --git a/ttcn/Lib_NG_NAS/module.mk b/ttcn/Lib_NG_NAS/module.mk index 34a512a..8cd3d19 100644 --- a/ttcn/Lib_NG_NAS/module.mk +++ b/ttcn/Lib_NG_NAS/module.mk @@ -1,8 +1,9 @@ -sources := \ - Lib_NG_NAS_Interface.ttcn \ - Lib_NG_NAS_Templates.ttcn \ - LIB_NG_NAS_Functions.ttcn \ - Lib_NG_NAS_Pixits.ttcn \ +sources := \ + lib/Lib_NG_NAS_Templates.ttcn \ + lib/Lib_NG_NAS_Pixits.ttcn \ + lib/Lib_NG_NAS_Security_Functions.ttcn \ + lib_system/Lib_NG_NAS_Interface.ttcn \ + lib_system/Lib_NG_NAS_Functions.ttcn \ #../Lib3GPP/NG_NAS_EncdecDeclarations.ttcn -- GitLab From 399f64327de756c5445c630e18f54ff40da977fa Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 26 Nov 2025 14:57:32 +0100 Subject: [PATCH 013/151] validation --- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index bc84a8d..ad259e3 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -74,7 +74,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -83,7 +83,7 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - '100'B, + ?,//'100'B, -, ?, // Authentication_parameter_RAND ? // Authentication_parameter_AUTN -- GitLab From faf7fbaf8ebedf0c1b95212bc87e097630858851 Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 26 Nov 2025 14:57:45 +0100 Subject: [PATCH 014/151] validation --- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 8630a22..eadfd5b 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -2254,8 +2254,8 @@ module Lib_NG_NAS_Templates { in template (omit) O1_Type p_eiaCap := omit, in template (omit) octetstring p_spare := omit ) := { - iei := omit, - iel := p_iel, + iei := '2e'O, + iel := '02'O,//p_iel, ngeaCap := p_ngeaCap, ngiaCap := p_ngiaCap, eeaCap := p_eeaCap, -- GitLab From d1a006f93a7aaed0a0d8c6c3cb3dc4b7dbbf2eb5 Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 26 Nov 2025 14:58:01 +0100 Subject: [PATCH 015/151] validation --- ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index ee0e915..ca56181 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -36,14 +36,17 @@ module Lib_NG_NAS_Functions { vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'0'B,'001'B}, '111'B, - '0'B, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) // TODO Use PIXIT here? + '0'B, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS), + -,-, + m_ng_ue_security_capability + + // TODO Use PIXIT here? ); vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); f_send_NGAP_PDU( m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + m_n2_initialUeMessage( PX_RAN_UE_NGAP_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( -- GitLab From d1b97ea416f143209fd85516dff7fc59bb543b37 Mon Sep 17 00:00:00 2001 From: pintar Date: Wed, 26 Nov 2025 17:53:53 +0100 Subject: [PATCH 016/151] Initial conditions aligned and Messages in Test objectives with underscore --- test_purposes/ngnas/TP_AMF_NGAP.tplan2 | 10 +- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 1860 +++++++++++------------ 2 files changed, 896 insertions(+), 974 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGAP.tplan2 b/test_purposes/ngnas/TP_AMF_NGAP.tplan2 index 0180cfb..3ab2b8b 100644 --- a/test_purposes/ngnas/TP_AMF_NGAP.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGAP.tplan2 @@ -32,7 +32,7 @@ Package TP_AMF_NGAP { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour @@ -99,7 +99,7 @@ Package TP_AMF_NGAP { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour @@ -154,7 +154,7 @@ Package TP_AMF_NGAP { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour @@ -203,7 +203,7 @@ Package TP_AMF_NGAP { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour @@ -240,7 +240,7 @@ Package TP_AMF_NGAP { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 3253fa1..24efb99 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2024. +Copyright (c) ETSI 2025. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -17,593 +17,517 @@ file and shall not imply any sub-license right. Package TP_AMF { - Group "5.4 5GMM Common Procedures" + Group "5.4 5GMM Common Procedures" { - Group "5.4.1 Primary authentication and key agreement procedure" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_01 - - Test objective "Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type, - 5GS_mobile_identity - ; - ; - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111" - ;, - Authentication_parameter_RAND, - Authentication_parameter_AUTN - ; - ; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_01 + Group "5.4.1 Primary authentication and key agreement procedure" + { + import all from Ngnas_Common; + + Test Purpose { + + TP Id TP_5GNAS_AMF_AUT_REQ_01 + + Test objective "Verify that the IUT sends an AUTHENTICATION_REQUEST message correctly upon receipt of a NAS Registration without an active security context." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE + + Initial conditions with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type, + 5GS_mobile_identity;; + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + authentication_request_message_identity set to AUTHENTICATION_REQUEST, + ngKSI containing + nas_key_set_identifier set to "111";, + Authentication_parameter_RAND, + Authentication_parameter_AUTN;; + to the UE entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_01 - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_02 - - Test objective "Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - event AUTHENTICATION_REQUEST occurs - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - authentication_response_message_identity set to AUTHENTICATION_RESPONSE, - authentication_response_parameter containing - Authentication_response_parameter_IEI indicating value PX_WRONG_ARP_IEI - ; - ; - ; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - authentication_reject_message_identity set to AUTHENTICATION_REJECT - ; - ; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_02 + Test Purpose { + + TP Id TP_5GNAS_AMF_AUT_REQ_02 + + Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message correctly upon receipt of an AUTHENTICATION_RESPONSE message indicating a wrong ARP IEI." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE + + Initial conditions with { + the UE entity isNotRegisteredToAMF and + event AUTHENTICATION_REQUEST occurs + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + authentication_response_message_identity set to AUTHENTICATION_RESPONSE, + authentication_response_parameter containing + Authentication_response_parameter_IEI indicating value PX_WRONG_ARP_IEI;;; + from the UE entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + authentication_reject_message_identity set to AUTHENTICATION_REJECT;; + to the UE entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_02 - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_03 - - Test objective "Verify that the IUT stops re-sending an AUTHENTICATION REQUEST message if no AUTHENTICATION RESPONSE message is received on the fifth expiry of timer T3560." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - and (.) at time point start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 6s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 12s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 18s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - } - Expected behaviour - ensure that { - when { - (.) at time point start_trigger_T3560 : event AUTHENTICATION_REQUEST occurs - } - then { - (!) 6s after start_trigger_T3560 : the IUT entity aborts AUTHENTICATION_REQUEST procedure - (Note 1: "It is not expected to receive another AUTHENTICATION message on the N2N1 interface.") - } - } - } // end TP_5GNAS_AMF_AUT_REQ_03 + Test Purpose { + + TP Id TP_5GNAS_AMF_AUT_REQ_03 + + Test objective "Verify that the IUT stops re-sending an AUTHENTICATION_REQUEST message if no AUTHENTICATION_RESPONSE message is received on the fifth expire of timer T3560." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE + + Initial conditions with { + the UE entity isNotRegisteredToAMF + and (.) at time point start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + and (!) 6s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + and (!) 12s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + and (!) 18s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + } + Expected behaviour + ensure that { + when { + (.) at time point start_trigger_T3560 : event AUTHENTICATION_REQUEST occurs + } + then { + (!) 6s after start_trigger_T3560 : the IUT entity aborts AUTHENTICATION_REQUEST procedure + (Note 1: "It is not expected to receive another AUTHENTICATION message on the N2N1 interface.") + } + } + } // end TP_5GNAS_AMF_AUT_REQ_03 - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_04 - - Test objective "Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c) and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - security_header_type set to INTEGRITY_PROTECTED, + Test Purpose { + + TP Id TP_5GNAS_AMF_AUT_REQ_04 + + Test objective "Verify that the IUT sends an IDENTITY_REQUEST message correctly upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #20 - MAC failure." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c) and 8.2.4" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE + + Initial conditions with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + security_header_type set to INTEGRITY_PROTECTED, authentication_parameter_AUTN containing - AUTN indicating value PX_WRONG_MAC_CODE - ; - ; - ; - to the UE entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, - 5GMM_cause set to MAC_failure - - ; - ; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - identity_request_message_identity set to IDENTITY_REQUEST, - identity_type set to SUCI - ; - ; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_04 + AUTN indicating value PX_WRONG_MAC_CODE;;; + to the UE entity + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + authentication_failure_message_identity set to AUTHENTICATION_FAILURE, + 5GMM_cause set to MAC_failure;; + from the UE entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + identity_request_message_identity set to IDENTITY_REQUEST, + identity_type set to SUCI;; + to the UE entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_04 - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_05 - - Test objective "Verify that the IUT sends a new AUTHENTICATION REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111" //value for nas_key_set_identifier was already used before - ;, - spare_half_octet, - ABBA, + Test Purpose { + + TP Id TP_5GNAS_AMF_AUT_REQ_05 + + Test objective "Verify that the IUT sends a new AUTHENTICATION_REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE + + Initial conditions with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + security_header_type set to NOT_SECURITY_PROTECTED, + spare_half_octet, + authentication_request_message_identity set to AUTHENTICATION_REQUEST, + ngKSI containing + nas_key_set_identifier set to "111";, //value for nas_key_set_identifier was already used before + spare_half_octet, + ABBA, Authentication_parameter_RAND, - Authentication_parameter_AUTN - ; - ; - to the UE entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, - 5GMM_cause set to ngKSI_already_in_use - - ; - ; - from the UE entity - } - then { - event AUTHENTICATION_REQUEST occurs with { - argument replaced by the AUTHENTICATION_REQUEST containing - ngKSI containing - nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI - ; - ; - } - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_05 + Authentication_parameter_AUTN;; + to the UE entity + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + authentication_failure_message_identity set to AUTHENTICATION_FAILURE, + 5GMM_cause set to ngKSI_already_in_use;; + from the UE entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + security_header_type set to NOT_SECURITY_PROTECTED, + spare_half_octet, + authentication_request_message_identity set to AUTHENTICATION_REQUEST, + ngKSI containing + nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI;, + spare_half_octet, + ABBA, + Authentication_parameter_RAND, + Authentication_parameter_AUTN;; + to the UE entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_05 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_ABN_01 - - Test objective "Verify that the IUT sends a new IDENTITY REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE + + Test Purpose { + + TP Id TP_5GNAS_AMF_AUT_ABN_01 + + Test objective "Verify that the IUT sends a new IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.1.3.7, 8.2.4, 5.4.3.2 and 8.2.21.1" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111" - ;, - spare_half_octet, - ABBA, + Initial conditions with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + security_header_type set to NOT_SECURITY_PROTECTED, + spare_half_octet, + authentication_request_message_identity set to AUTHENTICATION_REQUEST, + ngKSI containing + nas_key_set_identifier set to "111";, + spare_half_octet, + ABBA, Authentication_parameter_RAND, - Authentication_parameter_AUTN //the "separation bit" in the AMF field of AUTN is set to 0 - ; - ; - to the UE entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, - 5GMM_cause set to "Non-5G authentication unacceptable (26)" - - ; - ; - from the UE entity - } - then { - event IDENTITY_REQUEST occurs with { - argument replaced by the AUTHENTICATION_REQUEST containing - 5GS_identity_type_IEI set to "SUCI" - ; - ; - } - to the UE entity - } - } + Authentication_parameter_AUTN;; //the "separation bit" in the AMF field of AUTN is set to 0 + to the UE entity + } - } // end TP_5GNAS_AMF_AUT_ABN_01 + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + authentication_failure_message_identity set to AUTHENTICATION_FAILURE, + 5GMM_cause set to "Non-5G authentication unacceptable (26)";; + from the UE entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + security_header_type set to NOT_SECURITY_PROTECTED, + spare_half_octet, + identity_request_message_identity set to IDENTITY_REQUEST, + 5GS_identity_type_IEI set to "SUCI";; + to the UE entity + } + } - } // end Group Primary authentication and key agreement procedure + } // end TP_5GNAS_AMF_AUT_ABN_01 - Group "5.4.2 Security mode control procedure" - { + } // end Group Primary authentication and key agreement procedure - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_NGNAS_AMF_AUT_SEQ_01 - - Test objective "Verify that the IUT sends a SECURITY MODE CONTROL message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.1.2" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - event AUTHENTICATION_REQUEST occurs with { - argument replaced by the AUTHENTICATION_REQUEST containing - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT - ; - } - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing // AUTHENTICATION_RESPONSE - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - authentication_response_message_identity set to AUTHENTICATION_RESPONSE //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - ; - ; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // Security mode command - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_command_message_identity set to SECURITY_MODE_COMMAND, - selected_NAS_security_algorithms, - ngKSI containing - nas_key_set_identifier set to "111" - ; - replayed_UE_security_capabilities // UE security capability 9.11.3.54 - ; - ; - to the UE entity - } - } - } // end TP_NGNAS_AMF_AUT_SEQ_01 - - Test Purpose { - - TP Id TP_NGNAS_AMF_AUT_SEQ_02 - - Test objective "Verify that the IUT, upon receiving the NAS Security Mode Complete Message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.2.2, Clause 8.2.26" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - // TODO - - } // end TP_NGNAS_AMF_AUT_SEQ_02 - - Test Purpose { - - TP Id TP_NGNAS_AMF_AUT_SEQ_03 - - Test objective "Verify that the IUT, upon receiving the NAS Security Mode Reject Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.2.5, Clause 8.2.27" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - // TODO - - } // end TP_NGNAS_AMF_AUT_SEQ_03 + Group "5.4.2 Security mode control procedure" + { - Test Purpose { - - TP Id TP_5GNAS_AMF_SEC_ACC_01 - - Test objective "Verify that the IUT, upon receiving the NAS Security Mode Complete Message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." + import all from Ngnas_Common; + + Test Purpose { + + TP Id TP_NGNAS_AMF_AUT_SEQ_01 + + Test objective "Verify that the IUT sends a SECURITY_MODE_COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION_RESPONSE." + + Reference + "ETSI TS 124 501 [1], Clause 5.4.1.2" + + Config Id CF_AMF_N2N1 + + PICS Selection NONE + + Initial conditions with { + the UE entity isNotRegisteredToAMF and + event AUTHENTICATION_REQUEST occurs with { + argument replaced by the AUTHENTICATION_REQUEST containing + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT; + } + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a UPLINK_NAS_TRANSPORT containing // AUTHENTICATION_RESPONSE + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + authentication_response_message_identity set to AUTHENTICATION_RESPONSE;; //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + from the UE entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // SECURITY_MODE_COMMAND + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + security_mode_command_message_identity set to SECURITY_MODE_COMMAND, + selected_NAS_security_algorithms, + ngKSI containing + nas_key_set_identifier set to "111";, + replayed_UE_security_capabilities;; // UE security capability 9.11.3.54 + to the UE entity + } + } + } // end TP_NGNAS_AMF_AUT_SEQ_01 - Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2 + Test Purpose { + + TP Id TP_5GNAS_AMF_SEC_ACC_01 + + Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - + Reference + "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" + + Config Id CF_AMF_N2N1 + + PICS Selection PICS_A4/2 - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, / - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_complete_message_identity set to SECURITY_MODE_COMPLETE - ; - ; - from the UE entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 55GS_registration_result_value set to 3GPP_ACCESS;, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC - ; - - ;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - - } + Initial conditions with { + the UE entity isNotRegisteredToAMF + } + - } // end TP_5GNAS_AMF_SEC_ACC_01 + Expected behaviour + ensure that { + when { + the IUT entity receives a UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + security_mode_complete_message_identity set to SECURITY_MODE_COMPLETE;; + from the UE entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_accept_message_identity set to REGISTRATION_ACCEPT, + 5GS_registration_result containing + 55GS_registration_result_value set to 3GPP_ACCESS;, + 5G_GUTI containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;, + TAI_list containing + Partial_tracking_area_list_1 containing + Type_of_list, + Number_of_elements, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + TAC indicating value PX_TAC;;, + T3512_value containing + Timer_value indicating value nonZeroValue;;; + to the GNB entity + } + + } - Test Purpose { - - TP Id TP_5GNAS_AMF_SEC_REJ_01 - - Test objective "Verify that the IUT, upon receiving the NAS Security Mode Reject Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration." + } // end TP_5GNAS_AMF_SEC_ACC_01 - Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2 + Test Purpose { + + TP Id TP_5GNAS_AMF_SEC_REJ_01 + + Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_REJECT message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration." - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } + Reference + "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" + + Config Id CF_AMF_N2N1 + + PICS Selection PICS_A4/2 - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_reject_message_identity set to SECURITY_MODE_REJECT, - 5GMM_cause set to "UE security capabilities mismatch (23)" - ; - ; - from the UE entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_reject_message_identity set to REGISTRATION_REJECT, - 5GMM_cause set to "UE security capabilities mismatch (23)", - T3346_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity + Initial conditions with { + the UE entity isNotRegisteredToAMF + } - } - - } + Expected behaviour + ensure that { + when { + the IUT entity receives a UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + security_mode_reject_message_identity set to SECURITY_MODE_REJECT, + 5GMM_cause set to "UE security capabilities mismatch (23)";; + from the UE entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_reject_message_identity set to REGISTRATION_REJECT, + 5GMM_cause set to "UE security capabilities mismatch (23)", + T3346_value containing + Timer_value indicating value nonZeroValue;;; + to the GNB entity + } + + } - } // end TP_5GNAS_AMF_SEC_REJ_01 - - + } // end TP_5GNAS_AMF_SEC_REJ_01 + + - } // end Group Security mode control procedure + } // end Group Security mode control procedure - Group "5.4.5 NAS transport procedure" - { - Test Purpose { - - TP Id TP_5GNAS_AMF_DLN_ACC_01 - - Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU SESSION ESTABLISHMENT REQUEST from the UE and responds with a DL NAS transport message containing a PDU SESSION ESTABLISHMENT ACCEPT." + Group "5.4.5 NAS transport procedure" + { + import all from Ngnas_Common; + + Test Purpose { + + TP Id TP_5GNAS_AMF_DLN_ACC_01 + + Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_REQUEST from the UE and responds with a DL NAS transport message containing a PDU SESSION ESTABLISHMENT ACCEPT." - Reference - "ETSI TS 124 501 [1], Clause 5.4.5 and 8.2.10, 8.2.11" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A5/6 + Reference + "ETSI TS 124 501 [1], Clause 5.4.5 and 8.2.10, 8.2.11" + + Config Id CF_AMF_N2N1 + + PICS Selection PICS_A5/6 - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } + Initial conditions with { + the UE entity isRegisteredToAMF + } - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - uL_NAS_TRANSPORT_message_identity, - payload_container containing - payload_container_type set to "N1 SM information", - number_of_optional_IEs set to 1, - optional_IE_1 set to "PDU SESSION ESTABLISHMENT REQUEST" - ;, - old_PDU_session_ID - ; - ; - from the UE entity - } - then { - the IUT entity sends an PDU_SESSION_RESOURCE_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - dL_NAS_TRANSPORT_message_identity, - payload_container containing - payload_container_type set to "N1 SM information" - number_of_optional_IEs set to 1, - optional_IE_1 set to "PDU SESSION ESTABLISHMENT ACCEPT" - ;, - pDU_session_ID - ; - ; - to the UE entity - } + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + uL_NAS_TRANSPORT_message_identity set to UL_NAS_TRANSPORT, + payload_container containing + payload_container_type set to "N1 SM information", + number_of_optional_IEs set to 1, + optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_REQUEST;, + old_PDU_session_ID;; + from the UE entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + dL_NAS_TRANSPORT_message_identity set to DL_NAS_TRANSPORT, + payload_container containing + payload_container_type set to "N1 SM information", + number_of_optional_IEs set to 1, + optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_ACCEPT;, + pDU_session_ID;; + to the UE entity + } - } - }// end TP_5GNAS_AMF_DLN_ACC_01 + } + }// end TP_5GNAS_AMF_DLN_ACC_01 - } // end Group 5.4.5 NAS transport procedure + } // end Group 5.4.5 NAS transport procedure - } // end Group 5.4 5GMM Common Procedures + } // end Group 5.4 5GMM Common Procedures Group "5.5.1.2 Registration Procedure for initial registration" { - import all from Ngnas_Common; - - Test Purpose { - + import all from Ngnas_Common; + + Test Purpose { + TP Id TP_5GNAS_AMF_REG_ACC_01 - Test objective "Verify that the IUT sends a REGISTRATION ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 when initial registration is accepted by the network." + Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 when initial registration is accepted by the network." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -613,67 +537,67 @@ Package TP_AMF { PICS Selection PICS_A4/8_1 Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 55GS_registration_result_value set to 3GPP_ACCESS;, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;; - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_idenity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;;; + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_accept_message_identity set to REGISTRATION_ACCEPT, + 5GS_registration_result containing + 55GS_registration_result_value set to 3GPP_ACCESS;, + 5G_GUTI containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;, + TAI_list containing + Partial_tracking_area_list_1 containing + Type_of_list, + Number_of_elements, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + TAC indicating value PX_TAC;;, + T3512_value containing + Timer_value indicating value nonZeroValue;;; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_ACC_01 - Test Purpose { - + Test Purpose { + TP Id TP_5GNAS_AMF_REG_ACC_02 - Test objective "Verify that the IUT sends a REGISTRATION ACCEPT message indicating SMS over NAS allowed when initial registration with SMS over NAS is requested and network allows SMS service." + Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message indicating SMS over NAS allowed when initial registration with SMS over NAS is requested and network allows SMS service." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -683,142 +607,142 @@ Package TP_AMF { PICS Selection PICS_A4/8_1_3 Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, - 5GS_update_type containing - SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 1;, //SMS over NAS allowed - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_idenity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;, + 5GS_update_type containing + SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_accept_message_identity set to REGISTRATION_ACCEPT, + 5GS_registration_result containing + 5GS_registration_result_value set to 3GPP_ACCESS, + SMS_over_NAS_transport_allowed set to 1;, //SMS over NAS allowed + 5G_GUTI containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;, + TAI_list containing + Partial_tracking_area_list_1 containing + Type_of_list, + Number_of_elements, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + TAC indicating value PX_TAC;;, + T3512_value containing + Timer_value indicating value nonZeroValue;;; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_ACC_02 - Test Purpose { - + Test Purpose { + TP Id TP_5GNAS_AMF_REG_ACC_03 - Test objective "Verify that the IUT sends a REGISTRATION ACCEPT message indicating SMS over NAS not allowed when initial registration with SMS over NAS is requested and network does not support SMS service." + Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message indicating SMS over NAS not allowed when initial registration with SMS over NAS is requested and network does not support SMS service." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" Config Id CF_AMF_N2N1 - PICS Selection NOT PICS_A4/8_1_3 + PICS Selection not PICS_A4/8_1_3 Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, - 5GS_update_type containing - SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 0;, //SMS over NAS not allowed - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_idenity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;, + 5GS_update_type containing + SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_accept_message_identity set to REGISTRATION_ACCEPT, + 5GS_registration_result containing + 5GS_registration_result_value set to 3GPP_ACCESS, + SMS_over_NAS_transport_allowed set to 0;, //SMS over NAS not allowed + 5G_GUTI containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;, + TAI_list containing + Partial_tracking_area_list_1 containing + Type_of_list, + Number_of_elements, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + TAC indicating value PX_TAC;;, + T3512_value containing + Timer_value indicating value nonZeroValue;;; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_ACC_03 - Test Purpose { - + Test Purpose { + TP Id TP_5GNAS_AMF_REG_ACC_04 - Test objective "Verify that the IUT includes the allowed NSSAI in the REGISTRATION ACCEPT message when the UE includes a requested NSSAI in the REGISTRATION REQUEST message and the network allows one or more S-NSSAIs from the requested NSSAI." + Test objective "Verify that the IUT includes the allowed NSSAI in the REGISTRATION_ACCEPT message when the UE includes a requested NSSAI in the REGISTRATION_REQUEST message and the network allows one or more S-NSSAIs from the requested NSSAI." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -828,61 +752,61 @@ Package TP_AMF { PICS Selection PICS_A4/8_1 Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - Allowed_NSSAI containing - S_NSSAI_1 containing - SST set to PX_SST_1, - SD set to PX_SD_1, - Mapped_HPLMN_SST set to PX_MAPPED_HPLMN_SST_1, - Mapped_HPLMN_SD set to PX_MAPPED_HPLMN_SD_1;;;; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_idenity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;;; + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_accept_message_identity set to REGISTRATION_ACCEPT, + 5G_GUTI containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;, + Allowed_NSSAI containing + S_NSSAI_1 containing + SST set to PX_SST_1, + SD set to PX_SD_1, + Mapped_HPLMN_SST set to PX_MAPPED_HPLMN_SST_1, + Mapped_HPLMN_SD set to PX_MAPPED_HPLMN_SD_1;;;; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_ACC_04 - Test Purpose { - + Test Purpose { + TP Id TP_5GNAS_AMF_REG_ACC_05 - Test objective "Verify that the IUT optionally includes rejected NSSAI in the REGISTRATION ACCEPT message when the network rejects one or more S-NSSAIs from the requested NSSAI." + Test objective "Verify that the IUT optionally includes rejected NSSAI in the REGISTRATION_ACCEPT message when the network rejects one or more S-NSSAIs from the requested NSSAI." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -892,57 +816,57 @@ Package TP_AMF { PICS Selection PICS_A4/8_1_2_3 Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - Rejected_NSSAI containing - Rejected_S_NSSAI_1 containing - Cause_value, - SST set to PX_SST_Rejected, - SD set to PX_SD_Rejected;;;; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_idenity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;;; + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_accept_message_identity set to REGISTRATION_ACCEPT, + 5G_GUTI containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;, + Rejected_NSSAI containing + Rejected_S_NSSAI_1 containing + Cause_value, + SST set to PX_SST_Rejected, + SD set to PX_SD_Rejected;;;; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_ACC_05 - - Test Purpose { - + + Test Purpose { + TP Id TP_5GNAS_AMF_REG_REJ_01 Test objective "Verify that the IUT rejects initial registration request due to general NAS level mobility management congestion control with 5GMM cause value #22 - congestion and assign a value for back-off timer T3346." @@ -955,48 +879,48 @@ Package TP_AMF { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF and + the UE entity isNotRegisteredToAMF and the AMF entity isInOverloadedState } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_reject_message_identity set to REGISTRATION_REJECT, - 5GMM_cause set to "Congestion (22)", - T3346_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_idenity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;;; + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Registration_reject_message_identity set to REGISTRATION_REJECT, + 5GMM_cause set to "Congestion (22)", + T3346_value containing + Timer_value indicating value nonZeroValue;;; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_REJ_01 - - Test Purpose { - + + Test Purpose { + TP Id TP_5GNAS_AMF_REG_REJ_02 Test objective "Verify that the IUT rejects initial registration request because all the S-NSSAI(s) included in the requested NSSAI are either rejected for current PLMN, rejected for the current registration area or rejected due to failed or revoked NSSAIs." @@ -1009,30 +933,28 @@ Package TP_AMF { PICS Selection NONE Initial conditions with { - the UE entity isNotRegisteredTo the AMF + the UE entity isNotRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - Requested_NSSAI indicating value PX_NSSAI_REVOKED - ; - ; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - Registration_reject_message_identity set to REGISTRATION_REJECT, - 5GMM_cause set to "No network slice available (62)";; - to the GNB entity - } + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + Registration_request_message_identity set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION, + FOR indicating value 1;, //Follow-on request pending + Requested_NSSAI indicating value PX_NSSAI_REVOKED;; + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + Registration_reject_message_identity set to REGISTRATION_REJECT, + 5GMM_cause set to "No network slice available (62)";; + to the GNB entity + } } }// end TP_5GNAS_AMF_REG_REJ_02 @@ -1040,14 +962,14 @@ Package TP_AMF { Group "5.5.2.2.3 UE-initiated de-registration procedure completion" { - import all from Ngnas_Common; - - - Test Purpose { - + import all from Ngnas_Common; + + + Test Purpose { + TP Id TP_5GNAS_AMF_DRG_ACC_01 - Test objective "Verify that the IUT, upon receiving a DEREGISTRATION REQUEST message containing the De-registration type IE with Normal de-registration from the UE, sends a DEREGISTRATION ACCEPT message." + Test objective "Verify that the IUT, upon receiving a DEREGISTRATION_REQUEST message containing the De-registration type IE with Normal de-registration from the UE, sends a DEREGISTRATION_ACCEPT message." Reference "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" @@ -1057,47 +979,47 @@ Package TP_AMF { PICS Selection PICS_A4/9_1 Initial conditions with { - the UE entity isRegisteredTo the AMF + the UE entity isRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; - from the GNB entity + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + Deregistration_type containing + Switch_off_value set to NORMAL_DEREGISTRATION, + Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS;, + 5GS_mobile_identity containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;;; + from the GNB entity } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; - to the GNB entity + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; + to the GNB entity } } }// end TP_5GNAS_AMF_DRG_ACC_01 - Test Purpose { - + Test Purpose { + TP Id TP_5GNAS_AMF_DRG_ACC_02 - Test objective "Verify that the IUT, upon receiving a DEREGISTRATION REQUEST message containing the De-registration type IE with Switch-off from the UE, does not send a DEREGISTRATION ACCEPT message and IUT completes de-registration procedure." + Test objective "Verify that the IUT, upon receiving a DEREGISTRATION_REQUEST message containing the De-registration type IE with Switch-off from the UE, does not send a DEREGISTRATION_ACCEPT message and IUT completes de-registration procedure." Reference "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" @@ -1107,54 +1029,54 @@ Package TP_AMF { PICS Selection PICS_A4/9_1 Initial conditions with { - the UE entity isRegisteredTo the AMF + the UE entity isRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to SWITCH_OFF, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; - from the GNB entity + the IUT entity receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + Deregistration_type containing + Switch_off_value set to SWITCH_OFF, + Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS;, + 5GS_mobile_identity containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;;; + from the GNB entity } then { - the IUT entity not sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; - to the GNB entity + the IUT entity not sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; + to the GNB entity } } }// end TP_5GNAS_AMF_DRG_ACC_02 - + } //end Group "5.5.2.2.3 UE-initiated de-registration procedure completion" Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" { - import all from Ngnas_Common; - - - Test Purpose { - + import all from Ngnas_Common; + + + Test Purpose { + TP Id TP_5GNAS_AMF_DRG_REQ_01 - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION REQUEST message containing De-registration type IE with re-registration not required and the access type based on the UE’s registration status (3GPP access only). **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" + Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing De-registration type IE with re-registration not required and the access type based on the UE’s registration status (3GPP access only). **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" Reference "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" @@ -1164,34 +1086,34 @@ Package TP_AMF { PICS Selection PICS_A4/9_2 Initial conditions with { - the UE entity isRegisteredTo the AMF + the UE entity isRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity indicate a UE deactivation + the IUT entity indicateUEdeactivation } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + Deregistration_type containing + Switch_off_value set to NORMAL_DEREGISTRATION, + Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS;;; + to the GNB entity } } - }// end TP_5GNAS_AMF_DRG_REQ_01 - - Test Purpose { - + }// end TP_5GNAS_AMF_DRG_REQ_01 + + Test Purpose { + TP Id TP_5GNAS_AMF_DRG_REQ_02 - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION REQUEST message and if UE does not send DEREGISTRATION ACCEPT then IUT retransmits DEREGISTRATION REQUEST message after timer T3522 expiration. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." + Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message and if UE does not send DEREGISTRATION_ACCEPT then IUT retransmits DEREGISTRATION_REQUEST message after timer T3522 expiration. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." Reference "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" @@ -1201,42 +1123,42 @@ Package TP_AMF { PICS Selection PICS_A4/9_2 Initial conditions with { - the UE entity isRegisteredTo the AMF + the UE entity isRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity indicate a UE deregistration and - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST;; - to the GNB entity and - the IUT entity does not receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; - from the GNB entity + the IUT entity indicateUEderegistration and + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + Deregistration_request_message_identity set to DEREGISTRATION_REQUEST;; + to the GNB entity and + the IUT entity does not receives an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; + from the GNB entity } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + Deregistration_type containing + Switch_off_value set to NORMAL_DEREGISTRATION, + Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS;;; + to the GNB entity } } - }// end TP_5GNAS_AMF_DRG_REQ_02 - - Test Purpose { - + }// end TP_5GNAS_AMF_DRG_REQ_02 + + Test Purpose { + TP Id TP_5GNAS_AMF_DRG_REQ_03 - Test objective "Verify that the IUT initiates network de-registration by sending DEREGISTRATION REQUEST message containing De-registration type IE with re-registration required and the access type based on the UE’s registration status (3GPP access only). **NOTE 1:** UE sends DEREGISTRATION ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" + Test objective "Verify that the IUT initiates network de-registration by sending DEREGISTRATION_REQUEST message containing De-registration type IE with re-registration required and the access type based on the UE’s registration status (3GPP access only). **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" Reference "ETSI TS 124 501 [1], Clauses 5.5.2.3.1, 5.5.2.3.2 and 8.2.14" @@ -1246,31 +1168,31 @@ Package TP_AMF { PICS Selection PICS_A4/9_2 Initial conditions with { - the UE entity isRegisteredTo the AMF + the UE entity isRegisteredToAMF } Expected behaviour ensure that { when { - the IUT entity indicate a UE deregistration + the IUT entity indicateUEderegistration } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + Deregistration_type containing + Switch_off_value set to NORMAL_DEREGISTRATION, + Reregistration_required_value set to REREGISTRATION_REQUIRED, + Access_type set to 3GPP_ACCESS;;; + to the GNB entity } } }// end TP_5GNAS_AMF_DRG_REQ_03 } //end Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" - } + } // End of Package TP_AMF -- GitLab From ecd66ae6e05c058b1d58e23c69e821ae17ce3a44 Mon Sep 17 00:00:00 2001 From: pintar Date: Wed, 26 Nov 2025 17:55:18 +0100 Subject: [PATCH 017/151] Initial conditions aligned --- test_purposes/Ngnas_Common.tplan2 | 68 ++++++------------------------- 1 file changed, 12 insertions(+), 56 deletions(-) diff --git a/test_purposes/Ngnas_Common.tplan2 b/test_purposes/Ngnas_Common.tplan2 index 419fbca..0b4e0ac 100644 --- a/test_purposes/Ngnas_Common.tplan2 +++ b/test_purposes/Ngnas_Common.tplan2 @@ -123,67 +123,23 @@ Package Ngnas_Common { - receives - sends - forwards - - isRequestedToPlaceACall - aborts // Initial conditions - - isNotRegisteredTo - - hasAchievedFirstRegistration - - isRegisteredTo - - isNotAttachedTo - - isAttachedTo - - isNotConfiguredForTopologyHiding - - isConfiguredForTopologyHiding - - isExistingIn - - isNotAppropriateToServe - - establishedSecurityRelation - - registeredIdentityTelURI - - registeredIdentitySipURI - - hasInitiatedDialogWith - - hasInitiatedPS2CSinEarlydialog - - hasInitiatedPS2CSinAlertingState - - hasEstablishedDialog - - hasEstablishedPS2CSDialog + - isNotRegisteredToAMF + - isRegisteredToAMF - hasEstablishedInitialContext - - hasEstablishedRRCConnection - - hasEstablishedContextInproperly - - hasEstablishedPDUsessionWithSameId - hasEstablishedPDUsession - - isConfiguredWithENUMentryForTelURI_E164NumberOf - - hasReceivedInitialRequestForDialog - - hasReceived200OkOnInitialRequestForDialogWith - - hasReceived180OnInitialRequest - - hasReceived200OkCancel - - hasReceivedTerminatedRequest - - hasReceivedNASMessage - - hasReceivedPAGINGMessage - - hasReceivedOVERLOADSTARTtMessage - - hasSuspendedContext - - hasPendingDataTransmission - - registeredPublicIdsWithTelUriAndSipUri - - hasReceivedSubsequentOrTargetRefreshRequestInDialog - - previouslyEstablishedCallWith - - isRequestedToSend - - isRequestedToDeregisterUser - - isBusy - - isNoLongerAvailable - - isTriggeredToDetachUser - - isRequestedToDetachfromNetwork - - isTransitioningTo - - hasAchievedFirstREGISTER - - hasResponded486INVITE - - hasAchievedInitialINVITE - - hasAchievedINVITE - - hasAchievedUPDATEuponINVITE - - timerOperatorSpecificTimeout //NOTE: 8 seconds is an appropriate value for the operator policy. - - isAttachingToNetwork - - hasDoneSubscription - - indicate - - trigger - - isCMIDLE - - isCMCONNECTED - - alreadyPreparedHandover - - completedHandover + - indicateConnectionEstablishmentIndicationProcedure + - hasEstablished_NG_C_AssociationToAMF + - hasNotEstablished_NG_C_AssociationToAMF + - hasEstablishedTNL_AssociationToAMF + - processTheUEderegistration - isInOverloadedState + //When Triggers + - u_Plane_inactivity_timer_expires + - hasSuccessfullyEstablishedTNLconnection + - indicateUEdeactivation + - indicateUEderegistration ; event templates: /* This template can be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSFER message. */ -- GitLab From 193733e96cd3ad358ad0bfedd48d1fd1936893e0 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 27 Nov 2025 10:32:53 +0100 Subject: [PATCH 018/151] First round of validation --- UE_Reg_Failure_HMAC.plantuml | 363 ++++++++++++++++++ ...ation.plantuml => UE_Registration.plantuml | 2 +- ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc | 3 + etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 14 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 34 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 178 +++++---- .../NG_NAS/NG_NAS_SecurityFunctions.ttcn | 1 + ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 2 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 16 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 28 +- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 10 +- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 4 +- .../lib_system/Lib_NG_NAS_Functions.ttcn | 80 ++-- 13 files changed, 580 insertions(+), 155 deletions(-) create mode 100644 UE_Reg_Failure_HMAC.plantuml rename UE Registration.plantuml => UE_Registration.plantuml (99%) diff --git a/UE_Reg_Failure_HMAC.plantuml b/UE_Reg_Failure_HMAC.plantuml new file mode 100644 index 0000000..5426b29 --- /dev/null +++ b/UE_Reg_Failure_HMAC.plantuml @@ -0,0 +1,363 @@ +@startuml +title 5G UE Registration with HMAC-A Failure and gNodeB Session Termination\n(3GPP Release 16) + +skinparam backgroundColor #FEFEFE +skinparam sequenceArrowThickness 2 +skinparam roundcorner 10 +skinparam maxmessagesize 200 +skinparam sequenceParticipant underline + +actor UE +participant "gNB" as RAN +participant AMF +participant AUSF +participant UDM + +== RRC Connection Establishment == +UE -> RAN: RRC Setup Request +activate RAN +RAN -> UE: RRC Setup +deactivate RAN +UE -> RAN: RRC Setup Complete\n(NAS: Registration Request attached) + +note right of UE +UE enters RRC_CONNECTED state +RRC connection is established +end note + +== Initial Registration Request == +UE -> RAN: NAS: Registration Request\n(Registration Type: Initial,\n5G-GUTI/SUCI, Requested NSSAI,\nUE Security Capability) +activate RAN + +RAN -> RAN: Store UE context\nAllocate RAN UE NGAP ID + +RAN -> AMF: INITIAL UE MESSAGE\n(Registration Request, RAN UE NGAP ID,\nUser Location Info, RRC Establishment Cause) +activate AMF + +AMF -> AMF: Allocate AMF UE NGAP ID\nCreate UE context +deactivate RAN + +note over RAN, AMF +UE-associated logical NG connection +is now established between gNB and AMF +end note + +== UE Identity Retrieval == +alt SUCI provided + AMF -> UDM: Nudm_UECM_Registration (SUCI) + activate UDM + UDM -> UDM: De-conceal SUCI\nRetrieve SUPI + UDM -> AMF: SUPI, Subscription Data + deactivate UDM +else 5G-GUTI provided + note over AMF + AMF resolves SUPI + from 5G-GUTI mapping + end note +end + +== Authentication Vector Request == +AMF -> AUSF: Nausf_UEAuthentication_Authenticate Request\n(SUPI, Serving Network Name) +activate AUSF + +AUSF -> UDM: Nudm_Authentication_Get Request\n(SUPI, Serving Network Name) +activate UDM + +UDM -> UDM: Generate 5G Authentication Vector:\n1. Retrieve permanent key K for SUPI\n2. Generate RAND (128 bits)\n3. Compute MAC-A = f1(K, SQN || RAND || AMF)\n4. Compute AUTN = SQN ⊕ AK || AMF || MAC-A\n5. Compute RES, CK, IK\n6. Derive XRES* = KDF(CK||IK, ...)\n7. Derive KAUSF + +note right of UDM +5G AKA Authentication Vector: +- RAND: Random challenge +- AUTN: Authentication token +- XRES*: Expected response +- KAUSF: Key for AUSF +MAC-A = f1(K, SQN || RAND || AMF) +is critical for authentication +end note + +UDM -> AUSF: 5G AV\n(RAND, AUTN, XRES*, KAUSF) +deactivate UDM + +AUSF -> AUSF: Store XRES* and KAUSF\nDerive HXRES* = SHA-256(RAND || XRES*) + +AUSF -> AMF: Authentication Material\n(RAND, AUTN, HXRES*) +deactivate AUSF + +AMF -> AMF: Store HXRES*\nAllocate ngKSI\nStart authentication timer + +== Authentication Request to UE == +AMF -> RAN: DOWNLINK NAS TRANSPORT\n(AMF UE NGAP ID, RAN UE NGAP ID,\nNAS: Authentication Request: RAND, AUTN, ngKSI) +activate RAN +RAN -> UE: NAS: Authentication Request\n(RAND, AUTN, ngKSI, ABBA) +deactivate RAN + +note right of UE +UE stores ngKSI and ABBA +Prepares to verify authentication +end note + +== UE Authentication Processing - HMAC-A FAILURE == +UE -> UE: Process AUTN\n1. Extract AK from AUTN\n2. Compute AK = f5(K, RAND)\n3. Retrieve SQN = (SQN ⊕ AK) ⊕ AK\n4. Extract AMF from AUTN\n5. Extract MAC-A from AUTN + +UE -> UE: Verify MAC-A:\nCompute XMAC-A = f1(K, SQN || RAND || AMF) + +note right of UE #FFB6C1 +**CRITICAL FAILURE DETECTED** +XMAC-A ≠ MAC-A + +Root Causes: +1. Key mismatch: K in USIM ≠ K in UDM +2. USIM malfunction or corruption +3. Incorrect subscription provisioning +4. Security breach attempt +5. SIM card authentication failure + +Result: UE cannot authenticate network +Cannot derive security keys +Cannot proceed with registration +end note + +UE -> UE: **AUTHENTICATION FAILED**\nDo NOT compute RES*\nDo NOT derive security keys + +== Authentication Failure Reporting == +UE -> RAN: NAS: Authentication Failure\n(Cause: "MAC failure",\nNo RES* included) +activate RAN + +note right of UE +Authentication Failure Message: +- Cause: "MAC failure" (0x14) +- Indicates HMAC-A verification failed +- No RES* is computed or sent +- No security keys derived +end note + +RAN -> AMF: UPLINK NAS TRANSPORT\n(AMF UE NGAP ID, RAN UE NGAP ID,\nNAS: Authentication Failure, Cause = "MAC failure") +deactivate RAN + +AMF -> AMF: **Authentication Failed**\nStop authentication timer\nVerification impossible + +note over AMF #FFB6C1 +AMF cannot verify RES* +Authentication procedure failed +Cannot establish security context +Registration must be rejected +end note + +== Failure Notification to AUSF/UDM == +AMF -> AUSF: Nausf_UEAuthentication_Authenticate Response\n(SUPI, Result: FAILURE,\nFailure Cause: "MAC failure") +activate AUSF + +AUSF -> AUSF: Record authentication failure\nIncrement failure counter for SUPI\nPrepare security alert + +AUSF -> UDM: Nudm_Authentication_ResultConfirmation\n(SUPI, Auth Result: FAILURE) +activate UDM + +UDM -> UDM: Log authentication failure:\n- Timestamp\n- SUPI\n- Failure type: MAC failure\n- Increment failure counter\n- Check threshold for blocking + +note right of UDM #FFB6C1 +Security Actions: +1. Log failure in security database +2. Increment failure counter +3. If threshold exceeded: + - Temporary SUPI blocking + - Security investigation trigger + - Operator notification +4. Check for fraud patterns +end note + +UDM -> AUSF: Confirmation\n(Failure recorded) +deactivate UDM + +AUSF -> AMF: Authentication Failure Confirmed +deactivate AUSF + +== Registration Rejection == +AMF -> AMF: Prepare Registration Reject:\n- Clear temporary UE context\n- Select reject cause\n- Optionally set T3346 timer + +note over AMF +Registration Reject Cause Options: +- #20: "MAC failure" +- #23: "Illegal UE" +- #3: "Illegal MS" +T3346 controls retry attempts +end note + +AMF -> RAN: DOWNLINK NAS TRANSPORT\n(AMF UE NGAP ID, RAN UE NGAP ID,\nNAS: Registration Reject,\nCause = "MAC failure",\nT3346 = 1800 seconds) +activate RAN + +RAN -> RAN: Forward NAS message\nStore reject information\nPrepare for cleanup + +RAN -> UE: NAS: Registration Reject\n(Cause: "MAC failure",\nT3346 = 1800 seconds) +deactivate RAN + +UE -> UE: **Registration REJECTED**\n- Delete temporary context\n- Start T3346 timer (30 min)\n- Enter limited service state + +note right of UE #FFB6C1 +UE Actions after Rejection: +1. Delete 5G-GUTI (if temporary) +2. Start T3346 timer +3. Disable 5G registration until: + - T3346 expires + - Power cycle + - USIM removed/reinserted + - Manual PLMN selection +4. May attempt EPS fallback +5. Inform user of failure +end note + +== gNodeB Initiated Session Termination == +note over RAN #FFFFE0 +gNB Decision to Terminate Session: +- Authentication failed +- No security context established +- UE rejected by core network +- Resources need to be released +- No valid UE context to maintain +end note + +RAN -> RAN: **Decision: Terminate UE session**\n- Release radio resources\n- Clear UE context\n- Prepare UE Context Release Request + +== UE Context Release Request (gNB → AMF) == +RAN -> AMF: UE CONTEXT RELEASE REQUEST\n(AMF UE NGAP ID, RAN UE NGAP ID,\nCause: "authentication-failure" or\n"unspecified-failure") +activate AMF + +note over RAN, AMF +gNB requests AMF to release +UE-associated logical NG connection +and all related context +end note + +AMF -> AMF: Receive release request\nValidate UE NGAP IDs\nPrepare context release + +note over AMF +AMF verifies: +- UE context exists +- No active PDU sessions (none exist) +- No ongoing procedures +- Safe to release +end note + +== UE Context Release Command (AMF → gNB) == +AMF -> RAN: UE CONTEXT RELEASE COMMAND\n(UE NGAP ID pair,\nCause: "nas-normal-release") +deactivate AMF +activate RAN + +note over AMF, RAN +AMF authorizes the release +All AMF-side UE context will be deleted +upon receiving release complete +end note + +RAN -> RAN: Process release command:\n1. Validate UE context\n2. Prepare RRC release\n3. Stop all UE-related timers\n4. Prepare to release radio resources + +== RRC Connection Release (gNB → UE) == +RAN -> UE: RRC Release\n(Release Cause: "other",\nWait Time: optional,\nRedirection Info: optional) + +note over RAN, UE +RRC Release message: +- Releases all radio bearers (SRBs) +- Releases RRC connection +- UE returns to RRC_IDLE state +- May include redirection to other RAT +- May include wait time before retry +end note + +UE -> UE: **Process RRC Release:**\n1. Stop all RRC timers\n2. Release all radio resources\n3. Release SRB1, SRB2\n4. Clear RRC configuration\n5. Enter RRC_IDLE state\n6. Start cell selection + +note right of UE +UE State Transition: +RRC_CONNECTED → RRC_IDLE + +Actions: +- Release all radio bearers +- Stop T300, T301, T310, T311 +- Clear RRC configuration +- Start cell reselection +- Remain in limited service + (due to T3346 running) +end note + +== Radio Resource Cleanup == +RAN -> RAN: **Release Radio Resources:**\n1. De-allocate physical resources\n2. Release C-RNTI\n3. Clear UE scheduling\n4. Free RRC connection\n5. Clear RRM measurements\n6. Release PDCP/RLC/MAC entities + +note over RAN #FFFFE0 +Radio Resource Cleanup: +- C-RNTI released +- Physical resource blocks freed +- Scheduling contexts deleted +- L2 (PDCP/RLC/MAC) released +- L1 resources freed +- UE monitoring stopped +end note + +== UE Context Release Complete (gNB → AMF) == +RAN -> AMF: UE CONTEXT RELEASE COMPLETE\n(AMF UE NGAP ID, RAN UE NGAP ID,\nUser Location Info: final cell location,\nOptional: Information on Recommended Cells) +activate AMF +deactivate RAN + +note over RAN, AMF +gNB confirms successful release +All NG-RAN resources released +UE-associated NG connection terminated +end note + +== AMF Context Cleanup == +AMF -> AMF: **Complete UE Context Release:**\n1. Delete UE NGAP context\n2. Delete AMF UE NGAP ID\n3. Delete temporary 5G-GUTI (if any)\n4. Clear security context\n5. Clear subscription data cache\n6. Release allocated resources\n7. Update UE reachability status + +note over AMF #FFFFE0 +AMF Cleanup Actions: +- Free AMF UE NGAP ID +- Delete UE-associated logical + NG connection +- Clear all temporary UE data +- No PDU sessions to release +- Update analytics/statistics +- Log complete transaction +end note + +AMF -> AMF: UE context fully deleted\nNG connection terminated +deactivate AMF + +== Final State == +note over UE #FFB6C1 +**UE Final State:** +- RRC_IDLE mode +- No NAS security context +- No RRC connection +- T3346 timer running +- Limited service state +- 5G registration blocked until: + * T3346 expires (30 min) + * Power cycle + * USIM change + * Manual intervention + +**User Actions Required:** +1. Check USIM/SIM card +2. Contact operator +3. Verify subscription status +4. Check for account issues +5. May need SIM replacement +end note + +note over RAN #FFFFE0 +**gNB Final State:** +- All UE resources released +- C-RNTI freed +- No UE context maintained +- Ready for new connections +- Resources available for other UEs +end note + +note over AMF #FFFFE0 +**AMF Final State:** +- No UE context stored +- UE not registered +- NG connection released +- Failure logged for analytics +- Security alert may be active +- Ready for new registration attempt + after T3346 expires +end note + +@enduml diff --git a/UE Registration.plantuml b/UE_Registration.plantuml similarity index 99% rename from UE Registration.plantuml rename to UE_Registration.plantuml index 3353526..0728269 100644 --- a/UE Registration.plantuml +++ b/UE_Registration.plantuml @@ -8,7 +8,7 @@ skinparam maxmessagesize 200 skinparam sequenceParticipant underline actor UE -participant "gNB/ng-eNB (SUT) 242.39" as RAN +participant "gNB/ng-eNB (TA) 242.39" as RAN participant "AMF (IUT) 242.37" as AMF participant AUSF participant UDM diff --git a/ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc b/ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc index bd1a018..3360535 100644 --- a/ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc +++ b/ccsrc/Externals/Lib_NG_NAS_Functions_ext.cc @@ -5,6 +5,9 @@ #include "rijndael.hh" #include "opc.hh" +/** + * @see https://www.ericsson.com/en/blog/2021/9/authentication-and-key-agreements + */ namespace Lib__NG__NAS__Security__Functions { static uint8_t OP[16] = {0}; // FIXME FSCOM To be refined. This is a Q&D implementation diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 9df3481..de67020 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -12,7 +12,7 @@ LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B -Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := true +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O # OP @@ -32,10 +32,10 @@ NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (202 # you want to log into the file or display on console (standard error). LogFile := "../logs/Ats_NG_NAS/%e.%h-%r.%s" -FileMask := LOG_ALL | USER | DEBUG | MATCHING -ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING -#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE -#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#FileMask := LOG_ALL | USER | DEBUG | MATCHING +#ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE LogSourceInfo := Stack LogEntityName:= Yes LogEventTypes:= Yes @@ -73,7 +73,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #AtsImsIot_TestControl.control # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context -NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 +#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure @@ -87,7 +87,7 @@ NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration -#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index ad259e3..4eaa59f 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -83,7 +83,7 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - ?,//'100'B, + ?, //'100'B, -, ?, // Authentication_parameter_RAND ? // Authentication_parameter_AUTN @@ -101,8 +101,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_01 @@ -125,7 +125,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,// Set by AMF - PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); @@ -143,8 +143,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_02 @@ -273,8 +273,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_04 @@ -342,8 +342,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_05 @@ -408,8 +408,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_ABN_01 @@ -458,8 +458,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, e_success); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGNAS_AMF_AUT_SEQ_01 @@ -502,9 +502,9 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_terminate_NasRegistrationRequest_with_reject(); - //TODO: f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + f_send_NasAuthenticationFailure(); + f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_SEC_ACC_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index b8cf9c2..fe5c845 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -854,6 +854,9 @@ module NG_NAS_TestCases { } // End of group TC_AMF_NGAP + /** + * @see https://www.ericsson.com/en/blog/2021/9/authentication-and-key-agreements + */ group fiveG_AKA_Crypto_Functions { /** @@ -2178,31 +2181,34 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B64_Type v_mac_s; - v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK + + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B64_Type v_xres; - var B128_Type v_ck; - var B128_Type v_ik; - var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_s); if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side @@ -2294,32 +2300,34 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B64_Type v_mac_s; - v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_s); + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK + + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - - var B64_Type v_xres; - var B128_Type v_ck; - var B128_Type v_ik; - var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var B64_Type v_mac_s; + v_result := f_f1star(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_s); if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); stop; } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side @@ -2364,24 +2372,26 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2429,24 +2439,26 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2496,24 +2508,26 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2564,24 +2578,26 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2627,24 +2643,26 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; @@ -2721,24 +2739,26 @@ module NG_NAS_TestCases { f_set_op(v_op); - var B64_Type v_mac_a; - var integer v_result := f_f1(oct2bit(v_K), v_rand, v_sqn_ak, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); - setverdict(fail); - stop; - } - var B64_Type v_xres; var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); } + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side v_auth_params.CK := v_ck; diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn index d48da5d..9696c77 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn @@ -423,6 +423,7 @@ module NG_NAS_SecurityFunctions { log(">>> f_NG_Authentication_A4: p_AuthParams=", p_AuthParams); log(">>> f_NG_Authentication_A4: p_KDF=", p_KDF); log(">>> f_NG_Authentication_A4: p_Key=", bit2oct(p_Key)); + log(">>> f_NG_Authentication_A4: p_NID=", p_NID); // Generation of String v_S := const_S6B_FC; diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 226b276..cecb706 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -312,7 +312,7 @@ module LibNGAP_Pixits { * @desc To indicate the reason for RRC Connection Establishment/Resume * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.111 RRC Establishment Cause */ - modulepar RRCEstablishmentCause PX_RRC_ESTABLISHMENT_CAUSE := notAvailable; + modulepar RRCEstablishmentCause PX_RRC_ESTABLISHMENT_CAUSE := mo_Signalling; /** * @desc To indicate the reason for RRC Connection Establishment/Resume diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 5a57028..f6abb5f 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1775,7 +1775,7 @@ module LibNGAP_Templates { template (value) InitiatingMessage m_n2_UEContextReleaseRequest( in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - in template (value) PDUSessionResourceListCxtRelReq p_pDUSessionResourceListCxtRelReq + in template (value) Cause p_cause ) := { procedureCode := id_UEContextReleaseRequest, criticality := reject, @@ -1793,9 +1793,9 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_PDUSessionResourceListCxtRelReq, - criticality := reject, - value_ := { PDUSessionResourceListCxtRelReq := p_pDUSessionResourceListCxtRelReq } + id := id_Cause, + criticality := ignore, + value_ := { Cause := p_cause } } } } @@ -10239,14 +10239,14 @@ module LibNGAP_Templates { } // End of template m_cause_radioNetwork template (value) Cause m_cause_transport( - in template (value) CauseTransport p_transport - ) := { + in template (value) CauseTransport p_transport + ) := { transport := p_transport } // End of template m_cause_transport template (value) Cause m_cause_nas( - in template (value) CauseNas p_nas - ) := { + in template (value) CauseNas p_nas + ) := { nas := p_nas } // End of template m_cause_nas diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 8022c45..baad30f 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -291,7 +291,7 @@ module LibNGAP_Functions { log("v_message: ", v_message); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -332,7 +332,7 @@ module LibNGAP_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - '00?'B, + -, //'00?'B, -, mw_GMM_AuthRAND, mw_GSM_AUTN @@ -344,7 +344,7 @@ module LibNGAP_Functions { log("v_dl_message: ", v_dl_message); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -847,6 +847,28 @@ module LibNGAP_Functions { ))); } + function f_send_ue_context_release_request_await_ue_context_release_response( + in template (value) Cause p_Cause + ) runs on NGAPComponent { + + // Send UEContextReleaseRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextReleaseRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + p_Cause + ))); + // Await UEContextReleaseComplete + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID + ))); + } + + function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGAPComponent { vc_recvNGAP_PDU := p_PDU; diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 2774ceb..da2156a 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -178,7 +178,10 @@ module Lib_NG_NAS_Security_Functions { return true; } // End of function f_Check_5GAKA_NAS_UL_Message_is_encrypted - group fiveg_aka_security_network { // FIXME FSCOM To be re-organize later to create a security library + /** + * @see https://www.ericsson.com/en/blog/2021/9/authentication-and-key-agreements + */ + group fiveg_aka_security_network { /** * @desc Compute RES and XRES values based on rAND & AUTN received in the NG_AUTHENTICATION_REQUEST @@ -197,6 +200,7 @@ module Lib_NG_NAS_Security_Functions { inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type ) return boolean { log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); + log(">>> f_5g_aka_compute_res_xres: p_NID: ", p_NID); p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); @@ -257,7 +261,7 @@ module Lib_NG_NAS_Security_Functions { p_ng_nas_security_params_type.Ks, p_NID); p_ng_nas_security_params_type.AuthParams.XRESLength := lengthof(bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); - log("f_5g_aka_compute_res_xres: XRES=", p_ng_nas_security_params_type.AuthParams.XRES); + log("f_5g_aka_compute_res_xres: XRES=", bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); log("f_5g_aka_compute_res_xres: XRESLength=", p_ng_nas_security_params_type.AuthParams.XRESLength); // Generate KAUSF @@ -266,7 +270,7 @@ module Lib_NG_NAS_Security_Functions { p_ng_nas_security_params_type.Ks, p_PLMN, p_NID); - log("f_5g_aka_compute_res_xres: KAUSF=", p_ng_nas_security_params_type.KAUSF); + log("f_5g_aka_compute_res_xres: KAUSF=", bit2oct(p_ng_nas_security_params_type.KAUSF)); // Generate KSEAF p_ng_nas_security_params_type.KSEAF := f_NG_Authentication_A6(p_PLMN, diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index eadfd5b..4127de1 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -2247,7 +2247,7 @@ module Lib_NG_NAS_Templates { } // End of template mw_NAS_KeySetIdentifier template (omit) NG_UE_SecurityCapability m_ng_ue_security_capability( - in template (value) Type4Length_Type p_iel := '2e'O, + in template (value) Type4Length_Type p_iel := '02'O, in O1_Type p_ngeaCap := 'f0'O, in O1_Type p_ngiaCap := 'f0'O, in template (omit) O1_Type p_eeaCap := omit, @@ -2255,7 +2255,7 @@ module Lib_NG_NAS_Templates { in template (omit) octetstring p_spare := omit ) := { iei := '2e'O, - iel := '02'O,//p_iel, + iel := p_iel, ngeaCap := p_ngeaCap, ngiaCap := p_ngiaCap, eeaCap := p_eeaCap, diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index ca56181..f144039 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -36,26 +36,39 @@ module Lib_NG_NAS_Functions { vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'0'B,'001'B}, '111'B, - '0'B, + '0'B, m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS), - -,-, + -, -, m_ng_ue_security_capability - - // TODO Use PIXIT here? ); vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); f_send_NGAP_PDU( m_ngap_initMsg( m_n2_initialUeMessage( - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI ))))); } + /** + * @desc Function to await NAS RegistrationRequest message + * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg + */ + function f_await_NasRegistrationRequest() runs on NGNASComponent { + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_initialUeMessage( + PX_RAN_UE_NGAP_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + // TODO Extract and check NAS message + //f_Check_NG_RegistrationReqMsg(vc_recvNAS_PDU, ?); + } + /** * @desc Function to await NAS NGSetupResponse message */ @@ -124,7 +137,7 @@ module Lib_NG_NAS_Functions { setverdict(pass); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -148,6 +161,28 @@ module Lib_NG_NAS_Functions { ))))); } + function f_send_NasAuthenticationFailure( + in NAS_CauseValue_Type p_nas_cause_value := tsc_Cause_MAC_Failure + ) runs on NGNASComponent { + vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( + m_GMM_GSM_Cause( + -, + p_nas_cause_value + )); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + } + /******************************************************************************** * * FIXME Use or enhance check functions from 3GPP library such as NG_NASTemplateFunctions.f_Check_NG_SecurityModeCompleteMsg @@ -238,29 +273,6 @@ module Lib_NG_NAS_Functions { ))))); } - function f_terminate_NasRegistrationRequest_with_reject( - in NAS_CauseValue_Type p_nas_cause_value := tsc_EmmCause_IllegalMe - ) runs on NGNASComponent { - // Send error message - vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( - m_GMM_GSM_Cause( - -, - p_nas_cause_value - )); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } - function f_send_NGUERadioCApabilityInfoIndication() runs on NGNASComponent { f_send_NGAP_PDU( m_ngap_initMsg( -- GitLab From 4d53565cb1e598d16413e4a31c73d2745d066635 Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 27 Nov 2025 15:27:04 +0100 Subject: [PATCH 019/151] validate2 --- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 44 +++++++++---------- .../NG_NAS/NG_NAS_SecurityFunctions.ttcn | 3 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 8 ++-- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 1 + .../lib_system/Lib_NG_NAS_Functions.ttcn | 6 +-- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index ad259e3..11d58d5 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -74,7 +74,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - ?,//PX_AMF_UE_NGAP_ID, + ?,//?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -125,7 +125,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); @@ -187,7 +187,7 @@ module NG_NAS_TCFunctions { [] N2_gNBaMF_P.receive( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))) -> value v_PDU { @@ -249,7 +249,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // IdentityRequest ))); @@ -319,7 +319,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? ))); @@ -384,7 +384,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // IdentityRequest ))); @@ -436,7 +436,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // Security mode command ))); @@ -484,7 +484,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_InitialContextSetupRequest_withPDUSessionList( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // Security mode command ))); @@ -595,7 +595,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // PDU SESSION ESTABLISHMENT ACCEPT ))); @@ -708,7 +708,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -825,7 +825,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -949,7 +949,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -1073,7 +1073,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -1193,7 +1193,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthorizationRequest ))); @@ -1319,7 +1319,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1475,7 +1475,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1556,7 +1556,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1621,7 +1621,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1669,7 +1669,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1726,7 +1726,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1758,7 +1758,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) @@ -1814,7 +1814,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ?//template (present) NAS_PDU p_nasPdu := ? )) diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn index d48da5d..1cf3b48 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn @@ -427,6 +427,7 @@ module NG_NAS_SecurityFunctions { // Generation of String v_S := const_S6B_FC; //FC = 0x6B + log("f_NG_Authentication_A4 (0): p_NID=", p_NID); v_P0 := fl_GetServingNetworkName(p_PLMN, p_NID); // @sic R5s220753 sic@ log("f_NG_Authentication_A4 (1): v_P0=", v_P0); v_S := (v_S & v_P0); @@ -447,7 +448,7 @@ module NG_NAS_SecurityFunctions { v_S := ( v_S & int2oct(px_NAS_5GC_XRES_Length, 2) ); // @sic R5w190117 sic@ log("f_NG_Authentication_A4 (7): v_S=", v_S); //L2 = length of RES/XRES (e.g. 0x00 0x10) - + return substr(fx_KeyDerivationFunction(p_KDF, p_Key, v_S), 128, 128); // returns LSB 128 bits[truncated] of the key generated } diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 8022c45..ed15669 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -279,7 +279,7 @@ module LibNGAP_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - '100'B, + ?,//'100'B, -, mw_GMM_AuthRAND, mw_GSM_AUTN @@ -291,7 +291,7 @@ module LibNGAP_Functions { log("v_message: ", v_message); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -332,7 +332,7 @@ module LibNGAP_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - '00?'B, + ?,//'00?'B, -, mw_GMM_AuthRAND, mw_GSM_AUTN @@ -344,7 +344,7 @@ module LibNGAP_Functions { log("v_dl_message: ", v_dl_message); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 2774ceb..b20edc6 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -197,6 +197,7 @@ module Lib_NG_NAS_Security_Functions { inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type ) return boolean { log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); + log(">>> f_5g_aka_compute_res_xres: p_NID = ", p_NID); p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index ca56181..b2eecba 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -102,7 +102,7 @@ module Lib_NG_NAS_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // AuthenticationRequest ))); @@ -111,7 +111,7 @@ module Lib_NG_NAS_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - '100'B, + ?,//'100'B, -, mw_GMM_AuthRAND, mw_GSM_AUTN @@ -124,7 +124,7 @@ module Lib_NG_NAS_Functions { setverdict(pass); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, oct2hex(PX_SUPI_DIGITS), vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } -- GitLab From a9a206eb4309b7b9342a28026e65f0a62d5fa612 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 27 Nov 2025 15:43:47 +0100 Subject: [PATCH 020/151] Bug fixed in security function to compute XRES* --- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 6 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 83 ++++++++++++++++++- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 4 +- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 12 ++- 4 files changed, 95 insertions(+), 10 deletions(-) diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index de67020..9880483 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -24,7 +24,6 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; - NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] @@ -75,7 +74,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI -#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure @@ -87,7 +86,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration -NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 @@ -144,6 +143,7 @@ NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index fe5c845..68f9c26 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2126,7 +2126,7 @@ module NG_NAS_TestCases { var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK log("v_sqn =", bit2oct(v_sqn)); var B64_Type v_mac_a_computed; - v_result := f_f1(oct2bit(v_K), v_rand, /*v_ak*/v_sqn, v_amf, v_mac_a_computed); + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a_computed); if (v_result != 0) { log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); setverdict(fail); @@ -2162,6 +2162,87 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 + /** + * @desc Verify that the RES* and XRES* derivation functions are working correctly with Kontron Wireshark captures + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.4 RES* and XRES* derivation function + * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE + * @see https://cryptii.com/pipes/hmac + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + // From Kontron Wireshark captures: UI=001014444333000 + var O16_Type v_K := '00000000000000000000000000000000'O; // The long-term key: Subscriber key + var O16_Type v_opc := '00000000000000000000000000000000'O; // Operator Variant Algorithm Configuration Field + var B128_Type v_rand := oct2bit('a218b7e415a50b63b4f5afd7db2c9529'O); + var B48_Type v_sqn_ak := oct2bit('e4ca34194b42'O); + var B16_Type v_amf := oct2bit('8000'O); // AMF: Authentication Management Field + var B64_Type v_mac_a := oct2bit('f058119c1778db23'O); + var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 + + f_force_opc(v_opc); + + var B64_Type v_xres; + var B128_Type v_ck; + var B128_Type v_ik; + var B48_Type v_ak; + var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + log("v_xres =", bit2oct(v_xres)); + log("v_ck =", bit2oct(v_ck)); + log("v_ik =", bit2oct(v_ik)); + log("v_ak =", bit2oct(v_ak)); + + var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK + var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); + v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side + v_auth_params.CK := v_ck; + v_auth_params.IK := v_ik; + v_auth_params.XRES := v_xres; + v_auth_params.XRESLength := lengthof(v_xres); + + var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK + log("v_sqn =", bit2oct(v_sqn)); + var B64_Type v_mac_a_computed; + v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a_computed); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + stop; + } + if (not(match(v_mac_a_computed, v_mac_a))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_a_computed' did not return the expected value. ***"); + setverdict(fail); + stop; + } + + var B64_Type v_RESstar := oct2bit('a7c39d021cc80709'O); + var B64_Type v_XRESstar := oct2bit('60775ce133f05be3'O); + var B128_Type v_res := f_NG_Authentication_A4(v_PLMN, v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks); + var B64_Type v_RESstar_computed := substr(v_res, 0, 64); + var B64_Type v_XRESstar_computed := substr(v_res, 64, 64); + log("v_RESstar_computed =", bit2oct(v_RESstar_computed)); + log("v_XRESstar_computed =", bit2oct(v_XRESstar_computed)); + if (not(match(v_RESstar_computed, v_RESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_RESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_RESstar_computed' returned the expected value ***"); + } + if (not(match(v_XRESstar_computed, v_XRESstar))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_XRESstar_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_XRESstar_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 + /** * @desc Verify that the HRES* and HXRES* derivation function is working correctly * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.6 KSEAF derivation function diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index baad30f..ccc1c64 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -362,8 +362,8 @@ module LibNGAP_Functions { mw_NG_AUTHENTICATION_RESPONSE( { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } )) == false) { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE ***"); } setverdict(pass); diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index da2156a..b10697b 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -228,11 +228,15 @@ module Lib_NG_NAS_Security_Functions { var B128_Type v_ck; var B128_Type v_ik; var B48_Type v_ak; - var B64_Type v_res; - if (f_f2345(PX_SUBSCRIPTION_KEY, p_rand, v_res, v_ck, v_ik, v_ak) == -1) { + var B64_Type v_xres; + if (f_f2345(PX_SUBSCRIPTION_KEY, p_rand, v_xres, v_ck, v_ik, v_ak) == -1) { log("f_f2345 failed"); return false; } + log("f_5g_aka_compute_res_xres: v_xres=", bit2oct(v_xres)); + log("f_5g_aka_compute_res_xres: v_xres lenght=", lengthof(bit2oct(v_xres))); + p_ng_nas_security_params_type.AuthParams.XRES := v_xres; + p_ng_nas_security_params_type.AuthParams.XRESLength := lengthof(bit2oct(v_xres)); p_ng_nas_security_params_type.AuthParams.CK := v_ck; log("f_5g_aka_compute_res_xres: CK=", bit2oct(p_ng_nas_security_params_type.AuthParams.CK)); p_ng_nas_security_params_type.AuthParams.IK := v_ik; @@ -261,8 +265,8 @@ module Lib_NG_NAS_Security_Functions { p_ng_nas_security_params_type.Ks, p_NID); p_ng_nas_security_params_type.AuthParams.XRESLength := lengthof(bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); - log("f_5g_aka_compute_res_xres: XRES=", bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); - log("f_5g_aka_compute_res_xres: XRESLength=", p_ng_nas_security_params_type.AuthParams.XRESLength); + log("f_5g_aka_compute_res_xres: XRESstar=", bit2oct(p_ng_nas_security_params_type.AuthParams.XRES)); + log("f_5g_aka_compute_res_xres: XRESstarLength=", p_ng_nas_security_params_type.AuthParams.XRESLength); // Generate KAUSF p_ng_nas_security_params_type.KAUSF := f_NG_Authentication_A2(p_ng_nas_security_params_type.AuthParams, -- GitLab From 0407c3bb2bcfed32b4c8e9323dd775fcfa17c05f Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 27 Nov 2025 15:48:08 +0100 Subject: [PATCH 021/151] Fixed merge issues --- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 4 ---- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 4 ---- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn | 5 ----- 3 files changed, 13 deletions(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index cac168a..63510bb 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -125,11 +125,7 @@ module NG_NAS_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( -<<<<<<< HEAD - ?,//PX_AMF_UE_NGAP_ID, -======= ?,// Set by AMF - PX_AMF_UE_NGAP_ID, ->>>>>>> 193733e96cd3ad358ad0bfedd48d1fd1936893e0 PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 981fda3..d65b1ef 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -332,11 +332,7 @@ module LibNGAP_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( -<<<<<<< HEAD - ?,//'00?'B, -======= -, //'00?'B, ->>>>>>> 193733e96cd3ad358ad0bfedd48d1fd1936893e0 -, mw_GMM_AuthRAND, mw_GSM_AUTN diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index a557de7..c34b632 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -200,11 +200,6 @@ module Lib_NG_NAS_Security_Functions { inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type ) return boolean { log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); -<<<<<<< HEAD - log(">>> f_5g_aka_compute_res_xres: p_NID = ", p_NID); -======= - log(">>> f_5g_aka_compute_res_xres: p_NID: ", p_NID); ->>>>>>> 193733e96cd3ad358ad0bfedd48d1fd1936893e0 p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); -- GitLab From 37dce860c39c6d8048d3e230c5da8ae80d32e079 Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 27 Nov 2025 16:45:26 +0100 Subject: [PATCH 022/151] added preamble condition --- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 1 + 1 file changed, 1 insertion(+) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 63510bb..8347a53 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -1240,6 +1240,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); -- GitLab From 812c98e72dc9cdd9b66bf37ffd9debac2ebc4ea4 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 27 Nov 2025 16:45:57 +0100 Subject: [PATCH 023/151] Extract vc_AMF_UE_ID value from message --- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 40 +++++++++++-------- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 4 +- .../lib_system/Lib_NG_NAS_Functions.ttcn | 6 ++- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index d65b1ef..e2923dd 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -290,6 +290,10 @@ module LibNGAP_Functions { } log("v_message: ", v_message); + // Extract ID-RAN-UE-NGAP-ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Compute RES/XRES if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); @@ -304,7 +308,7 @@ module LibNGAP_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( @@ -343,6 +347,10 @@ module LibNGAP_Functions { } log("v_dl_message: ", v_dl_message); + // Extract ID-RAN-UE-NGAP-ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Compute RES/XRES if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); @@ -353,7 +361,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -392,7 +400,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); @@ -426,7 +434,7 @@ module LibNGAP_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( @@ -445,7 +453,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); @@ -464,7 +472,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( @@ -494,7 +502,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, mw_gUAMI ( @@ -537,7 +545,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, mw_gUAMI ( @@ -649,7 +657,7 @@ module LibNGAP_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( @@ -666,7 +674,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); @@ -728,7 +736,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, ? // SecurityModeCommand ))); @@ -749,7 +757,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_PDUSessionResourceSetupRequest( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, { mw_pDUSessionResourceSetupItemSUReq( @@ -805,7 +813,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_PDUSessionResourceSetupRequest( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, { mw_pDUSessionResourceSetupItemSUReq( @@ -827,7 +835,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_PDUSessionResourceSetupResponse( - -, + vc_AMF_UE_ID, -, { ( @@ -855,7 +863,7 @@ module LibNGAP_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextReleaseRequest( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, p_Cause ))); @@ -863,7 +871,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_UEContextReleaseComplete( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID ))); } diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index 6bc36d0..18ce07b 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -71,8 +71,8 @@ module LibNGAP_Interface { // Init of values at component started // Note: generation of following MME and ENB UE IDs can be done randomly in init - //var AMF_UE_NGAP_ID vc_AMF_UE_ID := 10; - //var GNB_UE_NGAP_ID vc_gNB_UE_ID := 11; + var integer vc_AMF_UE_ID := 10; + var integer vc_gNB_UE_ID := 11; // General timers timer tc_wait := PX_NGAP_TWAIT; diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index 1561daa..e810a0b 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -136,6 +136,10 @@ module Lib_NG_NAS_Functions { } setverdict(pass); + // Extract ID-RAN-UE-NGAP-ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Compute RES/XRES if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { setverdict(fail); @@ -151,7 +155,7 @@ module Lib_NG_NAS_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, PX_RAN_UE_NGAP_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( -- GitLab From b0060164c4f221ef78536f4df314acb09ac31767 Mon Sep 17 00:00:00 2001 From: juvancic Date: Fri, 28 Nov 2025 10:37:32 +0100 Subject: [PATCH 024/151] adapted tcfunctions --- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 91 +++++++++++++------------ 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 8347a53..e1d579b 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -1250,11 +1250,12 @@ module NG_NAS_TCFunctions { {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, '111'B,//in template (value) NAS_KsiValue p_KeySetId, '0'B,//in template (value) B1_Type p_Tsc, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, // 24.501 cl. 9.11.3.4 + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, // 24.501 cl. 9.11.3.4 - /* in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit, - in template (omit) NG_GMM_Cap p_GMM_Cap := omit, - in template (omit) NG_UE_SecurityCapability p_UESecurityCap := omit, + -,/* in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit,*/ + -,/*in template (omit) NG_GMM_Cap p_GMM_Cap := omit,*/ + m_ng_ue_security_capability + /*in template (omit) NG_UE_SecurityCapability p_UESecurityCap := omit, in template (omit) NSSAI p_ReqNSSAI := omit, in template (omit) NG_TrackingAreaId p_TAI := omit, in template (omit) UE_NetworkCap p_UE_NetworkCap := omit, @@ -1294,7 +1295,7 @@ module NG_NAS_TCFunctions { ) vc_sendNAS_PDU := bit2oct(encvalue( vt_NgNasUl_Msg )); - var bitstring s := encvalue( vt_NgNasUl_Msg ); + /*var bitstring s := encvalue( vt_NgNasUl_Msg ); //int i := decvalue(encvalue( vt_NgNasUl_Msg),vt_NgNasUl_Msg); log(vt_NgNasUl_Msg); log(vc_sendNAS_PDU); @@ -1302,7 +1303,7 @@ module NG_NAS_TCFunctions { var integer i; i := decvalue(s,rec); log(i); - log(rec); + log(rec);*/ f_send_NGAP_PDU( m_ngap_initMsg( @@ -1351,42 +1352,42 @@ module NG_NAS_TCFunctions { } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log(vc_recvNGAP_PDU); - f_NASPDU_Get(vc_recvNGAP_PDU); - s := oct2bit(vc_recvNAS_PDU); - log(s); - var NG_NAS_DL_Message_Type recdl; - var integer ir; - ir := decvalue(s,recdl); - log(ir); - log(recdl); - - vt_NgNasDl_Msg := - m_NG_REGISTRATION_REJECT( - cs_GMM_GSM_Cause(omit, - '00001101'B/*;tsc_Cause_Roaming_NotAllowed*/) - /*in template (omit) GPRS_Timer2 p_T3346 := omit, - in template (omit) GPRS_Timer2 p_T3502 := omit, - in template (omit) EAP_Message p_EAP := omit, - in template (omit) RejectedNSSAI p_RejectedNSSAI := omit, - in template (omit) CAGInfoList p_CAGInfoList := omit, - in template (omit) ExtdRejectedNSSAI p_ExtdRejectedNSSAI := omit, - in template (omit) RegistrationWaitRange p_DisasterReturnWaitRange := omit, - in template (omit) ExtdCAGInfoList p_ExtdCAGInfoList := omit, - in template (omit) GPRS_Timer3 p_LowerBoundTimerValue := omit, - in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_Roaming := omit, - in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := omit - */); - vc_sendNAS_PDU := bit2oct(encvalue( vt_NgNasDl_Msg )); - s := encvalue( vt_NgNasDl_Msg ); - //int i := decvalue(encvalue( vt_NgNasUl_Msg),vt_NgNasUl_Msg); - log(vt_NgNasDl_Msg); - log(vc_sendNAS_PDU); - var NG_NAS_DL_Message_Type recdl1; + // log(vc_recvNGAP_PDU); + // f_NASPDU_Get(vc_recvNGAP_PDU); + // s := oct2bit(vc_recvNAS_PDU); + // log(s); + // var NG_NAS_DL_Message_Type recdl; + // var integer ir; + // ir := decvalue(s,recdl); + // log(ir); + // log(recdl); + + // vt_NgNasDl_Msg := + // m_NG_REGISTRATION_REJECT( + // cs_GMM_GSM_Cause(omit, + // '00001101'B/*;tsc_Cause_Roaming_NotAllowed*/) + // /*in template (omit) GPRS_Timer2 p_T3346 := omit, + // in template (omit) GPRS_Timer2 p_T3502 := omit, + // in template (omit) EAP_Message p_EAP := omit, + // in template (omit) RejectedNSSAI p_RejectedNSSAI := omit, + // in template (omit) CAGInfoList p_CAGInfoList := omit, + // in template (omit) ExtdRejectedNSSAI p_ExtdRejectedNSSAI := omit, + // in template (omit) RegistrationWaitRange p_DisasterReturnWaitRange := omit, + // in template (omit) ExtdCAGInfoList p_ExtdCAGInfoList := omit, + // in template (omit) GPRS_Timer3 p_LowerBoundTimerValue := omit, + // in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_Roaming := omit, + // in template (omit) NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := omit + // */); + // vc_sendNAS_PDU := bit2oct(encvalue( vt_NgNasDl_Msg )); + // s := encvalue( vt_NgNasDl_Msg ); + // //int i := decvalue(encvalue( vt_NgNasUl_Msg),vt_NgNasUl_Msg); + // log(vt_NgNasDl_Msg); + // log(vc_sendNAS_PDU); + // var NG_NAS_DL_Message_Type recdl1; - i := decvalue(s,recdl1); - log(i); - log(recdl1); + // i := decvalue(s,recdl1); + // log(i); + // log(recdl1); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -1407,6 +1408,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1420,7 +1422,7 @@ module NG_NAS_TCFunctions { omit, // in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit, omit, // in template (omit) NG_GMM_Cap p_GMM_Cap := omit, - omit //in template (omit) NG_UE_SecurityCapability p_UESecurityCap := omit, + m_ng_ue_security_capability //in template (omit) NG_UE_SecurityCapability p_UESecurityCap := omit, //in template (omit) NSSAI p_ReqNSSAI := omit, /*in template (omit) NG_TrackingAreaId p_TAI := omit, in template (omit) UE_NetworkCap p_UE_NetworkCap := omit, @@ -1528,6 +1530,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1593,6 +1596,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1662,6 +1666,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); //USER REGISTRATION log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1720,6 +1725,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1808,6 +1814,7 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); + f_send_NGSetupRequest_await_NGSetupRespone(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); -- GitLab From 3be1c84f4eddeae4e336a9200ef220082e770b04 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 28 Nov 2025 10:42:39 +0100 Subject: [PATCH 025/151] Validate TC_NGAP_AMF_CMP_01 offline --- NAS_ETSI.code-workspace | 3 ++ ttcn/AtsNGAP/NGAP_Steps.ttcn | 21 +++++++-- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 46 ++++++++++--------- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 3 +- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 8 ++-- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 24 +++++++--- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 18 +++++++- .../lib_system/Lib_NG_NAS_Functions.ttcn | 14 ++++-- 8 files changed, 96 insertions(+), 41 deletions(-) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index bea1ea2..ccdc900 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -20,6 +20,9 @@ }, { "path": "../../frameworks/CryptoMobile/CryptoMobile" + }, + { + "path": "../open5gs" } ], "settings": { diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 076994a..c8972ef 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -12,8 +12,13 @@ module NGAP_Steps { // LibNGAP + import from NGAP_CommonDataTypes language "ASN.1:1997" all; + import from NGAP_PDU_Descriptions language "ASN.1:1997" all; + import from NGAP_IEs language "ASN.1:1997" all; + import from LibNGAP_Steps all; import from LibNGAP_Interface all; + import from LibNGAP_Templates all; import from LibNGAP_Functions all; import from LibNGAP_Pixits all; @@ -133,8 +138,12 @@ module NGAP_Steps { /** * @desc */ - function f_postamble_NGAP_gNB() runs on NGAPComponent { - f_postambleNGAP_gNB(); + function f_postamble_NGAP_gNB( + in template (value) Cause p_Cause := m_cause_nas(authentication_failure) + ) runs on NGAPComponent { + if (not(PICS_OFFLINE_MODE)) { + f_postambleNGAP_gNB(p_Cause); + } //Deactivate defaults deactivate; @@ -143,8 +152,12 @@ module NGAP_Steps { /** * @desc */ - function f_postamble_NGAP_gNB2() runs on NGAPComponent { - f_postambleNGAP_gNB(); + function f_postamble_NGAP_gNB2( + in template (value) Cause p_Cause := m_cause_nas(authentication_failure) + ) runs on NGAPComponent { + if (not(PICS_OFFLINE_MODE)) { + f_postambleNGAP_gNB(p_Cause); + } // Deactivate defaults deactivate; diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index e2923dd..f1f3708 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -14,10 +14,10 @@ module LibNGAP_Functions { import from NGAP_IEs language "ASN.1:2002" all; import from NGAP_Constants language "ASN.1:2002" all; import from NGAP_PDU_Descriptions language "ASN.1:2002" all; - import from LibNGAP_Pixits all; import from LibNGAP_Templates all; import from LibNGAP_Interface all; import from LibNGAP_Steps all; + import from LibNGAP_Pixits all; // Lib_NG_NAS_Templates import from Lib_NG_NAS_Templates all; @@ -181,7 +181,6 @@ module LibNGAP_Functions { log(">>> f_send_registration_request"); // Send request for REGISTRATION_REQUEST - // Compute NAS message var NG_NAS_UL_Message_Type v_nas_message := valueof( m_NG_REGISTRATION_REQUEST( cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), @@ -216,9 +215,13 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_initialUeMessage )); - f_NASPDU_Get(vc_recvNGAP_PDU) + f_NASPDU_Get(vc_recvNGAP_PDU); if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { log("Received NG_REGISTRATION_REQUEST NAS message"); + + // Extract ID-RAN-UE-NGAP-ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); } else { log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); @@ -328,7 +331,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_DownlinkNASTransport( PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, ? // AuthorizationRequest ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -347,7 +350,7 @@ module LibNGAP_Functions { } log("v_dl_message: ", v_dl_message); - // Extract ID-RAN-UE-NGAP-ID + // Extract ID-AMF-UE-NGAP-ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); @@ -362,7 +365,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_UplinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message( @@ -401,7 +404,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_DownlinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -435,7 +438,7 @@ module LibNGAP_Functions { m_ngap_initMsg( m_n2_UplinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( @@ -454,7 +457,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_DownlinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -470,15 +473,15 @@ module LibNGAP_Functions { // Await response for SECURITY_MODE_COMPLETE f_recv_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI + vc_RAN_UE_ID, + ?, + mw_uPTransportLayerInformation_userLocationInformationNR( + mw_userLocationInformationNR( + mw_nR_CGI, + mw_tAI ))))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message( @@ -503,7 +506,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, mw_gUAMI ( PX_PLMN_IDENTITY, @@ -546,7 +549,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, mw_gUAMI ( PX_PLMN_IDENTITY, @@ -658,7 +661,7 @@ module LibNGAP_Functions { m_ngap_initMsg( m_n2_UplinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( @@ -858,13 +861,14 @@ module LibNGAP_Functions { function f_send_ue_context_release_request_await_ue_context_release_response( in template (value) Cause p_Cause ) runs on NGAPComponent { + log(">>> f_send_ue_context_release_request_await_ue_context_release_response"); // Send UEContextReleaseRequest f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextReleaseRequest( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, p_Cause ))); // Await UEContextReleaseComplete diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index 18ce07b..80025b7 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -71,7 +71,8 @@ module LibNGAP_Interface { // Init of values at component started // Note: generation of following MME and ENB UE IDs can be done randomly in init - var integer vc_AMF_UE_ID := 10; + var integer vc_AMF_UE_ID := PX_AMF_UE_NGAP_ID; + var integer vc_RAN_UE_ID := PX_RAN_UE_NGAP_ID; var integer vc_gNB_UE_ID := 11; // General timers diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index 09cca78..ab7b0b6 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -25,6 +25,7 @@ module LibNGAP_Steps { import from LibNGAP_Interface all; import from LibNGAP_Pixits all; import from LibNGAP_Templates all; + import from LibNGAP_Functions all; /** * @desc Common functions description @@ -234,9 +235,10 @@ module LibNGAP_Steps { * @desc * @verdict */ - function f_postambleNGAP_gNB() - runs on NGAPComponent { - // Nothing to do + function f_postambleNGAP_gNB( + in template (value) Cause p_Cause + ) runs on NGAPComponent { + f_send_ue_context_release_request_await_ue_context_release_response(p_Cause); } // End of function f_postambleNGAP_gNB /** diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index c34b632..7216f2b 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -123,17 +123,27 @@ module Lib_NG_NAS_Security_Functions { } log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); if (ischosen(v_message.security_Protected_Nas_Message)) { - // TODO Decyphered message - log("f_Check_5GAKA_NAS_UL_Message: TODO Decyphered message"); - setverdict(inconc); - return false; - } else if (ispresent(v_message.security_Protected_Nas_Message.plainNASMessage)) { + if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) + // NOthing to do, message is not cyphered + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) + // TODO Cyphered message + // Decipher NAS container + // v_NonCleartextString := fx_NG_NasDeciphering(v_NonCleartextString, + // p_NasSecurityByRef.Ciphering.Algorithm, + // p_NasSecurityByRef.Ciphering.K_NAS, + // p_NasCount, + // p_NasSecurityByRef.BearerId); + //v_message.security_Protected_Nas_Message.plainNASMessage := v_NonCleartextString; + log("f_Check_5GAKA_NAS_UL_Message: TODO Cyphered message"); + setverdict(pass); + return true; + } + // Message was decrypted properly v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); + log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); return false; } - log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); } if (not(match(v_message, p_NG_NAS_UL_Message_Type))) { log(match(v_message, p_NG_NAS_UL_Message_Type)); diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 4127de1..c11f982 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -1409,8 +1409,22 @@ module Lib_NG_NAS_Templates { in template (omit) NASMessageContainer p_Msg := omit, in template (omit) UE_RequestType p_UeRequestType := omit, in template (omit) NG_PagingRestriction p_PagingRestrict - ) modifies cr_NG_SERVICE_REQUEST := { - service_Request := {} + ) := { + service_Request := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_ServiceRequest, /* cl. 9.7 M V 1 */ + serviceType := p_ServiceType, /* cl. 9.11.3.50 M V 1/2 */ + ngKSI := p_KSI, /* cl. 9.11.3.32 M V 1/2 */ + s_TMSI := p_S_TMSI, /* cl. 9.11.3.4 M LV 6 */ + ulDataStatus := p_ULDataStatus, /* cl. 9.11.2.57 O TLV 4-34 IEI=40 */ + pduSessionStatus := p_PDU_SessionStatus, /* cl. 9.11.2.44 O TLV 4-34 IEI=50 */ + allowedPDUSessionStatus := p_AllowedPDU_SessionStatus, /* cl. 9.11.3.13 O TLV 4-34 IEI=25 */ + nasMsg := p_Msg, /* cl. 9.11.3.33 O TLV-E 4-n IEI=71 Dec18 */ + ueRequestType := p_UeRequestType, /* cl. 9.11.3.76 O TLV 3 IEI=29 Sep22 @sic R5s221179 Baseline Moving sic@ */ + pagingRestrict := p_PagingRestrict /* cl. 9.11.3.77 O TLV 3-35 IEI=28 Sep22 @sic R5s221179 Baseline Moving sic@ */ + } } // End of template m_NG_SERVICE_REQUEST template (present) NG_NAS_UL_Message_Type mw_NG_SERVICE_REQUEST( diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index e810a0b..fa712e0 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -58,15 +58,23 @@ module Lib_NG_NAS_Functions { * @desc Function to await NAS RegistrationRequest message * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg */ - function f_await_NasRegistrationRequest() runs on NGNASComponent { + function f_await_registration_request() runs on NGNASComponent { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_initialUeMessage( PX_RAN_UE_NGAP_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); - // TODO Extract and check NAS message - //f_Check_NG_RegistrationReqMsg(vc_recvNAS_PDU, ?); + if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { + log("Received NG_REGISTRATION_REQUEST NAS message"); + + // Extract ID-RAN-UE-NGAP-ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + } else { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + } } /** -- GitLab From 88c03bc5a32a0cefba0d528ad4e76fb9e3241628 Mon Sep 17 00:00:00 2001 From: pintar Date: Mon, 1 Dec 2025 22:50:22 +0100 Subject: [PATCH 026/151] Remove file --- .../ngnas/TP_AMF_NGNAS2_clean.tplan2 | 1198 ----------------- 1 file changed, 1198 deletions(-) delete mode 100644 test_purposes/ngnas/TP_AMF_NGNAS2_clean.tplan2 diff --git a/test_purposes/ngnas/TP_AMF_NGNAS2_clean.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS2_clean.tplan2 deleted file mode 100644 index b554807..0000000 --- a/test_purposes/ngnas/TP_AMF_NGNAS2_clean.tplan2 +++ /dev/null @@ -1,1198 +0,0 @@ -/* -Copyright (c) ETSI 2025. - -This software is subject to copyrights owned by ETSI. Non-exclusive permission -is hereby granted, free of charge, to copy, reproduce and amend this file -under the following conditions: It is provided "as is", without warranty of any -kind, expressed or implied. - -ETSI shall never be liable for any claim, damages, or other liability arising -from its use or inability of use.This permission does not apply to any documentation -associated with this file for which ETSI keeps all rights reserved. The present -copyright notice shall be included in all copies of whole or part of this -file and shall not imply any sub-license right. -*/ - -/* interface at AMF */ -Package TP_AMF { - - - Group "5.4 5GMM Common Procedures" - { - Group "5.4.1 Primary authentication and key agreement procedure" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_01 - - Test objective "Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type, - 5GS_mobile_identity;; - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_02 - - Test objective "Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - event AUTHENTICATION_REQUEST occurs - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - authentication_response_message_identity set to AUTHENTICATION_RESPONSE, - authentication_response_parameter containing - Authentication_response_parameter_IEI indicating value PX_WRONG_ARP_IEI;;; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - authentication_reject_message_identity set to AUTHENTICATION_REJECT;; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_02 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_03 - - Test objective "Verify that the IUT stops re-sending an AUTHENTICATION REQUEST message if no AUTHENTICATION RESPONSE message is received on the fifth expiry of timer T3560." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - and (.) at time point start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 6s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 12s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 18s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - } - Expected behaviour - ensure that { - when { - (.) at time point start_trigger_T3560 : event AUTHENTICATION_REQUEST occurs - } - then { - (!) 6s after start_trigger_T3560 : the IUT entity aborts AUTHENTICATION_REQUEST procedure - (Note 1: "It is not expected to receive another AUTHENTICATION message on the N2N1 interface.") - } - } - } // end TP_5GNAS_AMF_AUT_REQ_03 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_04 - - Test objective "Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c) and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - security_header_type set to INTEGRITY_PROTECTED, - authentication_parameter_AUTN containing - AUTN indicating value PX_WRONG_MAC_CODE;;; - to the UE entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, - 5GMM_cause set to MAC_failure;; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - identity_request_message_identity set to IDENTITY_REQUEST, - identity_type set to SUCI;; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_04 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_05 - - Test objective "Verify that the IUT sends a new AUTHENTICATION REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, //value for nas_key_set_identifier was already used before - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; - to the UE entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, - 5GMM_cause set to ngKSI_already_in_use;; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI;, - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; - to the UE entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_05 - - - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_ABN_01 - - Test objective "Verify that the IUT sends a new IDENTITY REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7, 8.2.4, 5.4.3.2 and 8.2.21.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; //the "separation bit" in the AMF field of AUTN is set to 0 - to the UE entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, - 5GMM_cause set to "Non-5G authentication unacceptable (26)";; - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - identity_request_message_identity set to IDENTITY_REQUEST, - 5GS_identity_type_IEI set to "SUCI";; - to the UE entity - } - } - - } // end TP_5GNAS_AMF_AUT_ABN_01 - - } // end Group Primary authentication and key agreement procedure - - Group "5.4.2 Security mode control procedure" - { - - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_NGNAS_AMF_AUT_SEQ_01 - - Test objective "Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.1.2" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - event AUTHENTICATION_REQUEST occurs with { - argument replaced by the AUTHENTICATION_REQUEST containing - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT; - } - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing // AUTHENTICATION_RESPONSE - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - authentication_response_message_identity set to AUTHENTICATION_RESPONSE;; //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - from the UE entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // Security mode command - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_command_message_identity set to SECURITY_MODE_COMMAND, - selected_NAS_security_algorithms, - ngKSI containing - nas_key_set_identifier set to "111";, - replayed_UE_security_capabilities;; // UE security capability 9.11.3.54 - to the UE entity - } - } - } // end TP_NGNAS_AMF_AUT_SEQ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_SEC_ACC_01 - - Test objective "Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_complete_message_identity set to SECURITY_MODE_COMPLETE;; - from the UE entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 55GS_registration_result_value set to 3GPP_ACCESS;, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - - } - - } // end TP_5GNAS_AMF_SEC_ACC_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_SEC_REJ_01 - - Test objective "Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_reject_message_identity set to SECURITY_MODE_REJECT, - 5GMM_cause set to "UE security capabilities mismatch (23)";; - from the UE entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_reject_message_identity set to REGISTRATION_REJECT, - 5GMM_cause set to "UE security capabilities mismatch (23)", - T3346_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - - } - - } // end TP_5GNAS_AMF_SEC_REJ_01 - - - - } // end Group Security mode control procedure - - Group "5.4.5 NAS transport procedure" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_DLN_ACC_01 - - Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU SESSION ESTABLISHMENT REQUEST from the UE and responds with a DL NAS transport message containing a PDU SESSION ESTABLISHMENT ACCEPT." - - Reference - "ETSI TS 124 501 [1], Clause 5.4.5 and 8.2.10, 8.2.11" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A5/6 - - Initial conditions with { - the UE entity isRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - uL_NAS_TRANSPORT_message_identity set to UL_NAS_TRANSPORT, - payload_container containing - payload_container_type set to "N1 SM information", - number_of_optional_IEs set to 1, - optional_IE_1 set to "PDU SESSION ESTABLISHMENT REQUEST";, - old_PDU_session_ID;; - from the UE entity - } - then { - the IUT entity sends an PDU_SESSION_RESOURCE_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - dL_NAS_TRANSPORT_message_identity set to DL_NAS_TRANSPORT, - payload_container containing - payload_container_type set to "N1 SM information", - number_of_optional_IEs set to 1, - optional_IE_1 set to "PDU SESSION ESTABLISHMENT ACCEPT";, - pDU_session_ID;; - to the UE entity - } - - } - }// end TP_5GNAS_AMF_DLN_ACC_01 - - } // end Group 5.4.5 NAS transport procedure - - } // end Group 5.4 5GMM Common Procedures - - Group "5.5.1.2 Registration Procedure for initial registration" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_01 - - Test objective "Verify that the IUT sends a REGISTRATION ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 when initial registration is accepted by the network." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 55GS_registration_result_value set to 3GPP_ACCESS;, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_01 - - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_02 - - Test objective "Verify that the IUT sends a REGISTRATION ACCEPT message indicating SMS over NAS allowed when initial registration with SMS over NAS is requested and network allows SMS service." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1_3 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, - 5GS_update_type containing - SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 1;, //SMS over NAS allowed - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_02 - - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_03 - - Test objective "Verify that the IUT sends a REGISTRATION ACCEPT message indicating SMS over NAS not allowed when initial registration with SMS over NAS is requested and network does not support SMS service." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection not PICS_A4/8_1_3 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, - 5GS_update_type containing - SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 0;, //SMS over NAS not allowed - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_03 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_04 - - Test objective "Verify that the IUT includes the allowed NSSAI in the REGISTRATION ACCEPT message when the UE includes a requested NSSAI in the REGISTRATION REQUEST message and the network allows one or more S-NSSAIs from the requested NSSAI." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - Allowed_NSSAI containing - S_NSSAI_1 containing - SST set to PX_SST_1, - SD set to PX_SD_1, - Mapped_HPLMN_SST set to PX_MAPPED_HPLMN_SST_1, - Mapped_HPLMN_SD set to PX_MAPPED_HPLMN_SD_1;;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_04 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_05 - - Test objective "Verify that the IUT optionally includes rejected NSSAI in the REGISTRATION ACCEPT message when the network rejects one or more S-NSSAIs from the requested NSSAI." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1_2_3 - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - Rejected_NSSAI containing - Rejected_S_NSSAI_1 containing - Cause_value, - SST set to PX_SST_Rejected, - SD set to PX_SD_Rejected;;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_05 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_REJ_01 - - Test objective "Verify that the IUT rejects initial registration request due to general NAS level mobility management congestion control with 5GMM cause value #22 - congestion and assign a value for back-off timer T3346." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF and - the AMF entity isInOverloadedState - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_reject_message_identity set to REGISTRATION_REJECT, - 5GMM_cause set to "Congestion (22)", - T3346_value containing - Timer_value indicating value nonZeroValue;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_REJ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_REJ_02 - - Test objective "Verify that the IUT rejects initial registration request because all the S-NSSAI(s) included in the requested NSSAI are either rejected for current PLMN, rejected for the current registration area or rejected due to failed or revoked NSSAIs." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - Registration_request_message_identity set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending - Requested_NSSAI indicating value PX_NSSAI_REVOKED;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - Registration_reject_message_identity set to REGISTRATION_REJECT, - 5GMM_cause set to "No network slice available (62)";; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_REJ_02 - - } //end Group "5.5.1.2 Registration Procedure for initial registration" - - Group "5.5.2.2.3 UE-initiated de-registration procedure completion" - { - import all from Ngnas_Common; - - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_ACC_01 - - Test objective "Verify that the IUT, upon receiving a DEREGISTRATION REQUEST message containing the De-registration type IE with Normal de-registration from the UE, sends a DEREGISTRATION ACCEPT message." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_1 - - Initial conditions with { - the UE entity isRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_ACC_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_ACC_02 - - Test objective "Verify that the IUT, upon receiving a DEREGISTRATION REQUEST message containing the De-registration type IE with Switch-off from the UE, does not send a DEREGISTRATION ACCEPT message and IUT completes de-registration procedure." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_1 - - Initial conditions with { - the UE entity isRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to SWITCH_OFF, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; - from the GNB entity - } - then { - the IUT entity not sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_ACC_02 - - } //end Group "5.5.2.2.3 UE-initiated de-registration procedure completion" - - Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" - { - import all from Ngnas_Common; - - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_REQ_01 - - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION REQUEST message containing De-registration type IE with re-registration not required and the access type based on the UE’s registration status (3GPP access only). **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_2 - - Initial conditions with { - the UE entity isRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity indicate a UE deactivation - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_REQ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_REQ_02 - - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION REQUEST message and if UE does not send DEREGISTRATION ACCEPT then IUT retransmits DEREGISTRATION REQUEST message after timer T3522 expiration. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_2 - - Initial conditions with { - the UE entity isRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity indicate a UE deregistration and - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST;; - to the GNB entity and - the IUT entity does not receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_REQ_02 - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_REQ_03 - - Test objective "Verify that the IUT initiates network de-registration by sending DEREGISTRATION REQUEST message containing De-registration type IE with re-registration required and the access type based on the UE’s registration status (3GPP access only). **NOTE 1:** UE sends DEREGISTRATION ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.3.1, 5.5.2.3.2 and 8.2.14" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_2 - - Initial conditions with { - the UE entity isRegisteredTo the AMF - } - - Expected behaviour - ensure that { - when { - the IUT entity indicate a UE deregistration - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_REQ_03 - - } //end Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" - - -} // End of Package TP_AMF - -- GitLab From 9960fc77551702ca7682ea4cbaa65e529ec6a0ab Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 12 Dec 2025 12:41:59 +0100 Subject: [PATCH 027/151] validate cyphering with SNOW 3G & AES; Note: classes to be renamed later --- NAS_ETSI.code-workspace | 4 +- ccsrc/Externals/NG_security_ext.cc | 246 +++-- ccsrc/Externals/common_ext.cc | 1 + ccsrc/Externals/ia1_128.cc | 164 +++ ccsrc/Externals/ia1_128.hh | 966 ++++++++++++++++++ ccsrc/Externals/ia2_128.cc | 220 ++++ ccsrc/Externals/ia2_128.hh | 135 +++ ccsrc/Externals/ia3_128.cc | 207 ++++ ccsrc/Externals/ia3_128.hh | 397 +++++++ ccsrc/Externals/module.mk | 11 +- config.mk | 2 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 17 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 171 ++-- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 10 +- 14 files changed, 2404 insertions(+), 147 deletions(-) create mode 100644 ccsrc/Externals/ia1_128.cc create mode 100644 ccsrc/Externals/ia1_128.hh create mode 100644 ccsrc/Externals/ia2_128.cc create mode 100644 ccsrc/Externals/ia2_128.hh create mode 100644 ccsrc/Externals/ia3_128.cc create mode 100644 ccsrc/Externals/ia3_128.hh diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index ccdc900..47146f7 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -19,10 +19,10 @@ "path": "../5G_ciphered_NAS_decipher_tool" }, { - "path": "../../frameworks/CryptoMobile/CryptoMobile" + "path": "../open5gs" }, { - "path": "../open5gs" + "path": "../UERANSIM" } ], "settings": { diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index a577eb1..791cf4c 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -12,9 +12,12 @@ #include "CommonDefs.hh" #include "base_time.hh" -//#include "converter.hh" +#include "converter.hh" #include "loggers.hh" +#include "ia1_128.hh" +#include "ia2_128.hh" +#include "ia3_128.hh" namespace NG__SecurityDefinitionsAndExternalFunctions { @@ -28,7 +31,30 @@ namespace NG__SecurityDefinitionsAndExternalFunctions { //return int2bit(0, 0); //} OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_EncodedNasPdu, const BITSTRING& p_IntegrityAlgorithm, const BITSTRING& p_KNASint, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ -return int2oct(0, 0); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_EncodedNasPdu: ", p_EncodedNasPdu); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_IntegrityAlgorithm: ", bit2oct(p_IntegrityAlgorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_KNASint: ", bit2oct(p_KNASint)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_NasCount: ", p_NasCount); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_BearerId: ", bit2oct(p_BearerId)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_Direction: ", p_Direction); + + // Sanity checks + if (p_IntegrityAlgorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasCiphering: p_IntegrityAlgorithm: Wrong length"); + return int2oct(0, 0); + } else if (p_KNASint.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasCiphering: p_KNASint: Wrong length"); + return int2oct(0, 0); + } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasCiphering: p_NasCount/p_BearerId: Wrong length"); + return int2oct(0, 0); + } + + + + + + return int2oct(0, 0); } OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ @@ -39,9 +65,8 @@ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITST loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_BearerId: ", bit2oct(p_BearerId)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_Direction: ", p_Direction); - // sanity checks - if (p_CipheringAlgorithm.lengthof() != 4)/* || (p_CipheringAlgorithm.get_value() != 0b0001)*/ { - /// 0b0001 = EEA2 (AES-128) + // Sanity checks + if (p_CipheringAlgorithm.lengthof() != 4) { loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Wrong length"); return int2oct(0, 0); } else if (p_KNASenc.lengthof() != 128) { @@ -52,73 +77,166 @@ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITST return int2oct(0, 0); } - // Cypher key - const unsigned char* key = (const unsigned char*)bit2oct(p_KNASenc); - - // Construct IV (counter block) as per 3GPP TS 33.501 Annex C.3 - const unsigned char iv_length = 16; - unsigned char iv[iv_length] = {0}; - const unsigned char* nas_count = (const unsigned char*)p_NasCount; - iv[0] = nas_count[0]; - iv[1] = nas_count[1]; - iv[2] = nas_count[2]; - iv[3] = nas_count[3]; - // BearerId: 5 bits, Direction: 1 bit (LSB) - unsigned char bearer_dir = ((*((const unsigned char*)bit2oct(p_BearerId)) & 0x1F) << 3) | (((unsigned char)p_Direction.get_long_long_val() & 0x01) << 2); - loggers::get_instance().log("fx__NG__NasCiphering: bearer_dir=0x%02x", bearer_dir); - iv[4] = bearer_dir; - unsigned int u = p_EncodedNasPdu.lengthof(); - loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: p_EncodedNasPdu.lengthof()=", (unsigned char*)&u, 4); - loggers::get_instance().log("fx__NG__NasCiphering: >> 8 %02x=", u >> 8); - loggers::get_instance().log("fx__NG__NasCiphering: >> 16 %02x=", u >> 16); - loggers::get_instance().log("fx__NG__NasCiphering: >> 24 %02x=", u >> 24); - loggers::get_instance().log("fx__NG__NasCiphering: << 8 %02x=", u << 8); - OCTETSTRING data_len = int2oct(p_EncodedNasPdu.lengthof(), 4); - const unsigned char* data_len_ = (const unsigned char*)data_len; - iv[5] = data_len_[0]; - iv[6] = data_len_[1]; - iv[7] = data_len_[2]; - iv[8] = data_len_[3]; - // Remaining bytes are zero (already set) - loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: iv=", iv, iv_length); - - // Prepare input/output - const unsigned char* plaintext = (const unsigned char*)p_EncodedNasPdu; - int plaintext_len = p_EncodedNasPdu.lengthof(); - std::vector ciphertext(plaintext_len); - loggers::get_instance().log_to_hexa("fx__NG__NasCiphering: plaintext=", plaintext, plaintext_len); - - // OpenSSL AES-CTR encryption - EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); - int outlen1 = 0, outlen2 = 0; - if (!ctx) { - loggers::get_instance().error("fx__NG__NasCiphering: EVP_CIPHER_CTX_new failed"); - return int2oct(0, 0); + unsigned char *cyphered; + uint32_t cyphered_length; + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_NasCount), static_cast(p_NasCount) + p_NasCount.lengthof())); + int result = -1; + if (bit2int(p_CipheringAlgorithm) == 0) { // IA0/NEA0: No cyphering + loggers::get_instance().log("fx__NG__NasCiphering: No cyphering"); + return p_EncodedNasPdu; // no cyphering + } else if (bit2int(p_CipheringAlgorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + loggers::get_instance().log("fx__NG__NasCiphering: ia1_128 selected"); + ia1_128 enc; + result = enc.encrypt( + bit2int(p_CipheringAlgorithm), + static_cast(bit2oct(p_KNASenc)), + nas_count, + bit2int(p_BearerId), + p_Direction, + static_cast(p_EncodedNasPdu), + p_EncodedNasPdu.lengthof(), + &cyphered, + &cyphered_length + ); + } else if (bit2int(p_CipheringAlgorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + loggers::get_instance().log("fx__NG__NasCiphering: ia2_128 selected"); + ia2_128 enc; + result = enc.encrypt( + bit2int(p_CipheringAlgorithm), + static_cast(bit2oct(p_KNASenc)), + nas_count, + bit2int(p_BearerId), + p_Direction, + static_cast(p_EncodedNasPdu), + p_EncodedNasPdu.lengthof(), + &cyphered, + &cyphered_length + ); + } else if (bit2int(p_CipheringAlgorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + loggers::get_instance().log("fx__NG__NasCiphering: ia3_128 selected"); + ia3_128 enc; + result = enc.encrypt( + bit2int(p_CipheringAlgorithm), + static_cast(bit2oct(p_KNASenc)), + nas_count, + bit2int(p_BearerId), + p_Direction, + static_cast(p_EncodedNasPdu), + p_EncodedNasPdu.lengthof(), + &cyphered, + &cyphered_length + ); + } else if (bit2int(p_CipheringAlgorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_CipheringAlgorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_CipheringAlgorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_CipheringAlgorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else { + loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unknown algorithm"); } - if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), NULL, key, iv) != 1) { - loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptInit_ex failed"); - EVP_CIPHER_CTX_free(ctx); + if (result != 0) { + loggers::get_instance().error("fx__NG__NasCiphering: ia2_128.encrypt() failed"); return int2oct(0, 0); } - if (EVP_EncryptUpdate(ctx, ciphertext.data(), &outlen1, plaintext, plaintext_len) != 1) { - loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptUpdate failed"); - EVP_CIPHER_CTX_free(ctx); + OCTETSTRING os(cyphered_length, (const unsigned char*)cyphered); + free(cyphered); + + loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: ", os); + return os; +} + +OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_CipheredNasMsg: ", p_CipheredNasMsg); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_CipheringAlgorithm: ", bit2oct(p_CipheringAlgorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_KNASenc: ", bit2oct(p_KNASenc)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_NasCount: ", p_NasCount); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_BearerId: ", bit2oct(p_BearerId)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_Direction: ", p_Direction); + + // Sanity checks + if (p_CipheringAlgorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Wrong length"); return int2oct(0, 0); - } - if (EVP_EncryptFinal_ex(ctx, ciphertext.data() + outlen1, &outlen2) != 1) { - loggers::get_instance().error("fx__NG__NasCiphering: EVP_EncryptFinal_ex failed"); - EVP_CIPHER_CTX_free(ctx); + } else if (p_KNASenc.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_KNASenc: Wrong length"); + return int2oct(0, 0); + } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_NasCount/p_BearerId: Wrong length"); return int2oct(0, 0); } - EVP_CIPHER_CTX_free(ctx); - OCTETSTRING result = OCTETSTRING(outlen1 + outlen2, (const unsigned char*)ciphertext.data()); - loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: result: ", result); - return result; -} + unsigned char *payload; + uint32_t payload_length; + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_NasCount), static_cast(p_NasCount) + p_NasCount.lengthof())); + int result = -1; + if (bit2int(p_CipheringAlgorithm) == 0) { // IA0/NEA0: No cyphering + loggers::get_instance().log("fx__NG__NasDeciphering: No cyphering"); + return p_CipheredNasMsg; // no cyphering + } else if (bit2int(p_CipheringAlgorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); + ia1_128 enc; + result = enc.decrypt( + bit2int(p_CipheringAlgorithm), + static_cast(bit2oct(p_KNASenc)), + nas_count, + bit2int(p_BearerId), + p_Direction, + static_cast(p_CipheredNasMsg), + p_CipheredNasMsg.lengthof(), + &payload, + &payload_length + ); + } else if (bit2int(p_CipheringAlgorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + loggers::get_instance().log("fx__NG__NasDeciphering: ia2_128 selected"); + ia2_128 enc; + result = enc.decrypt( + bit2int(p_CipheringAlgorithm), + static_cast(bit2oct(p_KNASenc)), + nas_count, + bit2int(p_BearerId), + p_Direction, + static_cast(p_CipheredNasMsg), + p_CipheredNasMsg.lengthof(), + &payload, + &payload_length + ); + } else if (bit2int(p_CipheringAlgorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); + ia3_128 enc; + result = enc.decrypt( + bit2int(p_CipheringAlgorithm), + static_cast(bit2oct(p_KNASenc)), + nas_count, + bit2int(p_BearerId), + p_Direction, + static_cast(p_CipheredNasMsg), + p_CipheredNasMsg.lengthof(), + &payload, + &payload_length + ); + } else if (bit2int(p_CipheringAlgorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_CipheringAlgorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_CipheringAlgorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_CipheringAlgorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else { + loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unknown algorithm"); + } + if (result != 0) { + loggers::get_instance().error("fx__NG__NasDeciphering: decrypt() failed"); + return int2oct(0, 0); + } + OCTETSTRING os(payload_length, (const unsigned char*)payload); + free(payload); -OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ -return int2oct(0, 0); + loggers::get_instance().log_msg("<<< fx__NG__NasDeciphering: ", os); + return os; } diff --git a/ccsrc/Externals/common_ext.cc b/ccsrc/Externals/common_ext.cc index dfd722e..33fbbc1 100644 --- a/ccsrc/Externals/common_ext.cc +++ b/ccsrc/Externals/common_ext.cc @@ -82,6 +82,7 @@ namespace CommonDefs { return; } + //void fx__CalculateFCS32(BITSTRING const&) { BITSTRING fx__CalculateFCS32(const BITSTRING& p__TMSI){ loggers::get_instance().log_msg(">>> fx__CalculateFCS32: p__TMSI: ", p__TMSI); diff --git a/ccsrc/Externals/ia1_128.cc b/ccsrc/Externals/ia1_128.cc new file mode 100644 index 0000000..cb20ae1 --- /dev/null +++ b/ccsrc/Externals/ia1_128.cc @@ -0,0 +1,164 @@ +/** + * @file ia1_128.cpp + * @brief 3GPP SNOW 3G-based Encryption class implementation + * @author Generated for 3GPP NAS encryption + * @date 2024 + * + * This implementation uses the SNOW 3G algorithm as specified in + * 3GPP TS 33.401. For the actual SNOW 3G cipher implementation, + * this code can be linked with libraries such as libmilenage or + * open5gs crypto library. + */ + +#include "ia1_128.hh" + +//#include "snow3g.hh" + +#include "loggers.hh" + +namespace { + constexpr size_t KEY_SIZE = 16; // 128 bits = 16 bytes + constexpr size_t IV_SIZE = 16; // Initialization vector size +} + +int ia1_128::encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length) { + loggers::get_instance().log_to_hexa(">>> ia1_128::encrypt: knas_enc", knas_enc, KEY_SIZE); + loggers::get_instance().log_to_hexa(">>> ia1_128::encrypt: payload", payload, payload_length); + loggers::get_instance().log(">>> ia1_128::encrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia1_128::encrypt: count: %u", count); + loggers::get_instance().log(">>> ia1_128::encrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia1_128::encrypt: direction: %d", direction); + + // Input validation + if (!knas_enc || !payload || !cyphered || !cyphered_length) { + loggers::get_instance().error("ia1_128::encrypt: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia1_128::encrypt: Wrong payload length"); + *cyphered = nullptr; + *cyphered_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *cyphered = static_cast(std::malloc(payload_length)); + if (!*cyphered) { + loggers::get_instance().error("ia1_128::encrypt: Failed to allocate memory"); + return -1; + } + snow3g_context_t ctx; + snow3g_initialize(count, bearer, direction, (const char *)knas_enc, &ctx); + snow3g_generate(payload_length, payload, *cyphered, &ctx); + *cyphered_length = payload_length; + loggers::get_instance().log("ia1_128::encrypt: cyphered_length: %d", *cyphered_length); + loggers::get_instance().log_to_hexa("ia1_128::encrypt: cyphered: ", *cyphered, *cyphered_length); + + loggers::get_instance().log("<<< ia1_128::encrypt: ret: 0"); + return 0; +} + +int ia1_128::decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length) { + loggers::get_instance().log(">>> ia1_128::decrypt: Starting decryption"); + loggers::get_instance().log_to_hexa(">>> ia1_128::decrypt: knas_enc", knas_enc, KEY_SIZE); + loggers::get_instance().log_to_hexa(">>> ia1_128::decrypt: cyphered", cyphered, cyphered_length); + loggers::get_instance().log(">>> ia1_128::decrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia1_128::decrypt: count: %u", count); + loggers::get_instance().log(">>> ia1_128::decrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia1_128::decrypt: direction: %d", direction); + + return encrypt(algo_id, knas_enc, count, bearer, direction, + cyphered, cyphered_length, payload, payload_length); +} + +int ia1_128::snow3g_initialize(uint32_t count, uint8_t bearer, uint8_t direction, const char *knas_enc, snow3g_context_t *ctx) { + loggers::get_instance().log_to_hexa(">>> ia1_128::snow3g_initialize: knas_enc", (const unsigned char*)knas_enc, 16); + loggers::get_instance().log(">>> ia1_128::snow3g_initialize: count: %u", count); + loggers::get_instance().log(">>> ia1_128::snow3g_initialize: bearer: %d", bearer); + loggers::get_instance().log(">>> ia1_128::snow3g_initialize: direction: %d", direction); + + // Sanity checks + if (ctx == NULL) { + loggers::get_instance().error("ia1_128::snow3g_initialize: Wrong parameters"); + return -1; + } + + struct snow_key_st snow_key; + memset(&snow_key, 0, sizeof(snow_key)); + snow_key.key[3] = WORD_128(knas_enc, 0); + snow_key.key[2] = WORD_128(knas_enc, 1); + snow_key.key[1] = WORD_128(knas_enc, 2); + snow_key.key[0] = WORD_128(knas_enc, 3); + + snow_key.iv[3] = count; + snow_key.iv[2] = ((bearer & 0x1F) << 27) | ((direction & 0x01) << 26); + snow_key.iv[1] = snow_key.iv[3]; + snow_key.iv[0] = snow_key.iv[2]; + + loggers::get_instance().log_to_hexa("ia1_128::snow3g_initialize: snow_key.key", (const unsigned char*)snow_key.key, 4 * sizeof(uint32_t)); + loggers::get_instance().log_to_hexa("ia1_128::snow3g_initialize: snow_key.iv", (const unsigned char*)snow_key.iv, 4 * sizeof(uint32_t)); + + snow_set_key(snow_key, ctx); + + return 0; +} + +int ia1_128::snow3g_generate(size_t nb_byte, const unsigned char *in, unsigned char *out, snow3g_context_t *ctx) { + loggers::get_instance().log(">>> SNOW: nb_byte: %u", nb_byte); + loggers::get_instance().log_to_hexa(">>> SNOW: in", (const unsigned char*)in, nb_byte); + + // Sanity checks + if (ctx == NULL) { + loggers::get_instance().error("SNOW: Wrong parameters"); + return -1; + } + + size_t i = 0; + size_t nb_word = nb_byte/4; + size_t r = nb_byte % 4; + uint32_t *in_word = (uint32_t*) in; + uint32_t *out_word = (uint32_t*) out; + + /* init */ + clock_fsm(ctx); + lfsr_keystream(ctx); + + for (i = 0; i < nb_word; i++) { + uint32_t f; + f = clock_fsm(ctx) ^ ctx->lfsr[0]; + out_word[i] = in_word[i] ^ be32toh(f); + lfsr_keystream(ctx); + } + + if (r) { + uint32_t f; + uint32_t last_out = 0; + uint32_t last_in = 0; + + f = clock_fsm(ctx) ^ ctx->lfsr[0]; + memcpy(&last_in, in + nb_word*4, r); + last_out = last_in ^ be32toh(f); + memcpy(out + nb_word*4, &last_out, r); + lfsr_keystream(ctx); + } + + loggers::get_instance().log_to_hexa("<<< SNOW: out", (const unsigned char*)out, nb_byte); + return 0; +} diff --git a/ccsrc/Externals/ia1_128.hh b/ccsrc/Externals/ia1_128.hh new file mode 100644 index 0000000..b8cbdf7 --- /dev/null +++ b/ccsrc/Externals/ia1_128.hh @@ -0,0 +1,966 @@ +/** + * @file ia1_128.h + * @brief 3GPP SNOW 3G-based Encryption class header + * @author Generated for 3GPP NAS encryption + * @date 2024 + * + * This class implements the 3GPP SNOW 3G-based encryption algorithm (IA1-128) + * as specified in 3GPP TS 33.401 for NAS encryption/decryption. + */ + +#pragma once + +#include +#include +#include +#include + +namespace { + constexpr uint8_t SNOW_ENCRYPT = 1; + constexpr uint8_t SNOW_DECRYPT = 0; + constexpr size_t SNOW_WORD_SIZE = 4; + constexpr size_t SNOW_KEY_SIZE = 16; + constexpr uint32_t ONE = 0xffffffff; +} + +/** + * @brief reinterpret a char array as big-endian 32 bit unsigned integer array and select the element at index i + */ +#define WORD_128(array, i) be32toh(((uint32_t *)array)[i]); + +/** + * @brief Get the i most significant byte out of a 32 bit word + */ +#define BYTE32(word, i) (uint8_t) ((word >> 8*(3-i)) & 0xff) + +/** + * @class ia1_128 + * @brief Implements 3GPP SNOW 3G-based encryption and decryption (IA1-128) + * + * This class provides encryption and decryption functionality using the + * SNOW 3G stream cipher algorithm as specified in 3GPP TS 33.401. + * The algorithm is used for NAS (Non-Access Stratum) encryption in 3GPP networks. + */ +class ia1_128 { + struct snow_key_st { + uint32_t key[4]; + uint32_t iv[4]; + }; + + struct fsm_st { + uint32_t r1; + uint32_t r2; + uint32_t r3; + }; + + /** + * @brief SNOW 3G context structure + */ + typedef struct snow_ctx_st { + uint32_t lfsr[SNOW_KEY_SIZE]; + struct fsm_st fsm; + } snow3g_context_t; + +public: + /** + * @brief Default constructor + */ + ia1_128() = default; + + /** + * @brief Destructor + */ + ~ia1_128() = default; + + /** + * @brief Copy constructor (deleted) + */ + ia1_128(const ia1_128&) = delete; + + /** + * @brief Copy assignment operator (deleted) + */ + ia1_128& operator=(const ia1_128&) = delete; + + /** + * @brief Move constructor (deleted) + */ + ia1_128(ia1_128&&) = delete; + + /** + * @brief Move assignment operator (deleted) + */ + ia1_128& operator=(ia1_128&&) = delete; + + /** + * @brief Encrypts plaintext using SNOW 3G algorithm + * + * This method encrypts the given payload using the SNOW 3G stream cipher. + * The keystream is generated based on the NAS encryption key (knas_enc), + * count, bearer, and direction parameters according to 3GPP TS 33.401. + * + * @param algo_id Algorithm identifier (should be 1 for SNOW 3G) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to the plaintext data to encrypt + * @param payload_length Length of the plaintext data in bytes + * @param cyphered Pointer to pointer that will receive the encrypted data (caller must free) + * @param cyphered_length Pointer to variable that will receive the encrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for cyphered + * @note cyphered_length will be equal to payload_length for stream ciphers + */ + int encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length); + + /** + * @brief Decrypts ciphertext using SNOW 3G algorithm + * + * This method decrypts the given ciphertext using the SNOW 3G stream cipher. + * Decryption is identical to encryption for stream ciphers (XOR operation). + * + * @param algo_id Algorithm identifier (should be 1 for SNOW 3G) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param cyphered Pointer to the ciphertext data to decrypt + * @param cyphered_length Length of the ciphertext data in bytes + * @param payload Pointer to pointer that will receive the decrypted data (caller must free) + * @param payload_length Pointer to variable that will receive the decrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for payload + * @note payload_length will be equal to cyphered_length for stream ciphers + */ + int decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length); + +private: + const uint32_t S1_T0[256] = { + 0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U, + 0x0df2f2ffU, 0xbd6b6bd6U, 0xb16f6fdeU, 0x54c5c591U, + 0x50303060U, 0x03010102U, 0xa96767ceU, 0x7d2b2b56U, + 0x19fefee7U, 0x62d7d7b5U, 0xe6abab4dU, 0x9a7676ecU, + 0x45caca8fU, 0x9d82821fU, 0x40c9c989U, 0x877d7dfaU, + 0x15fafaefU, 0xeb5959b2U, 0xc947478eU, 0x0bf0f0fbU, + 0xecadad41U, 0x67d4d4b3U, 0xfda2a25fU, 0xeaafaf45U, + 0xbf9c9c23U, 0xf7a4a453U, 0x967272e4U, 0x5bc0c09bU, + 0xc2b7b775U, 0x1cfdfde1U, 0xae93933dU, 0x6a26264cU, + 0x5a36366cU, 0x413f3f7eU, 0x02f7f7f5U, 0x4fcccc83U, + 0x5c343468U, 0xf4a5a551U, 0x34e5e5d1U, 0x08f1f1f9U, + 0x937171e2U, 0x73d8d8abU, 0x53313162U, 0x3f15152aU, + 0x0c040408U, 0x52c7c795U, 0x65232346U, 0x5ec3c39dU, + 0x28181830U, 0xa1969637U, 0x0f05050aU, 0xb59a9a2fU, + 0x0907070eU, 0x36121224U, 0x9b80801bU, 0x3de2e2dfU, + 0x26ebebcdU, 0x6927274eU, 0xcdb2b27fU, 0x9f7575eaU, + 0x1b090912U, 0x9e83831dU, 0x742c2c58U, 0x2e1a1a34U, + 0x2d1b1b36U, 0xb26e6edcU, 0xee5a5ab4U, 0xfba0a05bU, + 0xf65252a4U, 0x4d3b3b76U, 0x61d6d6b7U, 0xceb3b37dU, + 0x7b292952U, 0x3ee3e3ddU, 0x712f2f5eU, 0x97848413U, + 0xf55353a6U, 0x68d1d1b9U, 0x00000000U, 0x2cededc1U, + 0x60202040U, 0x1ffcfce3U, 0xc8b1b179U, 0xed5b5bb6U, + 0xbe6a6ad4U, 0x46cbcb8dU, 0xd9bebe67U, 0x4b393972U, + 0xde4a4a94U, 0xd44c4c98U, 0xe85858b0U, 0x4acfcf85U, + 0x6bd0d0bbU, 0x2aefefc5U, 0xe5aaaa4fU, 0x16fbfbedU, + 0xc5434386U, 0xd74d4d9aU, 0x55333366U, 0x94858511U, + 0xcf45458aU, 0x10f9f9e9U, 0x06020204U, 0x817f7ffeU, + 0xf05050a0U, 0x443c3c78U, 0xba9f9f25U, 0xe3a8a84bU, + 0xf35151a2U, 0xfea3a35dU, 0xc0404080U, 0x8a8f8f05U, + 0xad92923fU, 0xbc9d9d21U, 0x48383870U, 0x04f5f5f1U, + 0xdfbcbc63U, 0xc1b6b677U, 0x75dadaafU, 0x63212142U, + 0x30101020U, 0x1affffe5U, 0x0ef3f3fdU, 0x6dd2d2bfU, + 0x4ccdcd81U, 0x140c0c18U, 0x35131326U, 0x2fececc3U, + 0xe15f5fbeU, 0xa2979735U, 0xcc444488U, 0x3917172eU, + 0x57c4c493U, 0xf2a7a755U, 0x827e7efcU, 0x473d3d7aU, + 0xac6464c8U, 0xe75d5dbaU, 0x2b191932U, 0x957373e6U, + 0xa06060c0U, 0x98818119U, 0xd14f4f9eU, 0x7fdcdca3U, + 0x66222244U, 0x7e2a2a54U, 0xab90903bU, 0x8388880bU, + 0xca46468cU, 0x29eeeec7U, 0xd3b8b86bU, 0x3c141428U, + 0x79dedea7U, 0xe25e5ebcU, 0x1d0b0b16U, 0x76dbdbadU, + 0x3be0e0dbU, 0x56323264U, 0x4e3a3a74U, 0x1e0a0a14U, + 0xdb494992U, 0x0a06060cU, 0x6c242448U, 0xe45c5cb8U, + 0x5dc2c29fU, 0x6ed3d3bdU, 0xefacac43U, 0xa66262c4U, + 0xa8919139U, 0xa4959531U, 0x37e4e4d3U, 0x8b7979f2U, + 0x32e7e7d5U, 0x43c8c88bU, 0x5937376eU, 0xb76d6ddaU, + 0x8c8d8d01U, 0x64d5d5b1U, 0xd24e4e9cU, 0xe0a9a949U, + 0xb46c6cd8U, 0xfa5656acU, 0x07f4f4f3U, 0x25eaeacfU, + 0xaf6565caU, 0x8e7a7af4U, 0xe9aeae47U, 0x18080810U, + 0xd5baba6fU, 0x887878f0U, 0x6f25254aU, 0x722e2e5cU, + 0x241c1c38U, 0xf1a6a657U, 0xc7b4b473U, 0x51c6c697U, + 0x23e8e8cbU, 0x7cdddda1U, 0x9c7474e8U, 0x211f1f3eU, + 0xdd4b4b96U, 0xdcbdbd61U, 0x868b8b0dU, 0x858a8a0fU, + 0x907070e0U, 0x423e3e7cU, 0xc4b5b571U, 0xaa6666ccU, + 0xd8484890U, 0x05030306U, 0x01f6f6f7U, 0x120e0e1cU, + 0xa36161c2U, 0x5f35356aU, 0xf95757aeU, 0xd0b9b969U, + 0x91868617U, 0x58c1c199U, 0x271d1d3aU, 0xb99e9e27U, + 0x38e1e1d9U, 0x13f8f8ebU, 0xb398982bU, 0x33111122U, + 0xbb6969d2U, 0x70d9d9a9U, 0x898e8e07U, 0xa7949433U, + 0xb69b9b2dU, 0x221e1e3cU, 0x92878715U, 0x20e9e9c9U, + 0x49cece87U, 0xff5555aaU, 0x78282850U, 0x7adfdfa5U, + 0x8f8c8c03U, 0xf8a1a159U, 0x80898909U, 0x170d0d1aU, + 0xdabfbf65U, 0x31e6e6d7U, 0xc6424284U, 0xb86868d0U, + 0xc3414182U, 0xb0999929U, 0x772d2d5aU, 0x110f0f1eU, + 0xcbb0b07bU, 0xfc5454a8U, 0xd6bbbb6dU, 0x3a16162cU, + }; + + const uint32_t S1_T1[256] = { + 0x6363c6a5U, 0x7c7cf884U, 0x7777ee99U, 0x7b7bf68dU, + 0xf2f2ff0dU, 0x6b6bd6bdU, 0x6f6fdeb1U, 0xc5c59154U, + 0x30306050U, 0x01010203U, 0x6767cea9U, 0x2b2b567dU, + 0xfefee719U, 0xd7d7b562U, 0xabab4de6U, 0x7676ec9aU, + 0xcaca8f45U, 0x82821f9dU, 0xc9c98940U, 0x7d7dfa87U, + 0xfafaef15U, 0x5959b2ebU, 0x47478ec9U, 0xf0f0fb0bU, + 0xadad41ecU, 0xd4d4b367U, 0xa2a25ffdU, 0xafaf45eaU, + 0x9c9c23bfU, 0xa4a453f7U, 0x7272e496U, 0xc0c09b5bU, + 0xb7b775c2U, 0xfdfde11cU, 0x93933daeU, 0x26264c6aU, + 0x36366c5aU, 0x3f3f7e41U, 0xf7f7f502U, 0xcccc834fU, + 0x3434685cU, 0xa5a551f4U, 0xe5e5d134U, 0xf1f1f908U, + 0x7171e293U, 0xd8d8ab73U, 0x31316253U, 0x15152a3fU, + 0x0404080cU, 0xc7c79552U, 0x23234665U, 0xc3c39d5eU, + 0x18183028U, 0x969637a1U, 0x05050a0fU, 0x9a9a2fb5U, + 0x07070e09U, 0x12122436U, 0x80801b9bU, 0xe2e2df3dU, + 0xebebcd26U, 0x27274e69U, 0xb2b27fcdU, 0x7575ea9fU, + 0x0909121bU, 0x83831d9eU, 0x2c2c5874U, 0x1a1a342eU, + 0x1b1b362dU, 0x6e6edcb2U, 0x5a5ab4eeU, 0xa0a05bfbU, + 0x5252a4f6U, 0x3b3b764dU, 0xd6d6b761U, 0xb3b37dceU, + 0x2929527bU, 0xe3e3dd3eU, 0x2f2f5e71U, 0x84841397U, + 0x5353a6f5U, 0xd1d1b968U, 0x00000000U, 0xededc12cU, + 0x20204060U, 0xfcfce31fU, 0xb1b179c8U, 0x5b5bb6edU, + 0x6a6ad4beU, 0xcbcb8d46U, 0xbebe67d9U, 0x3939724bU, + 0x4a4a94deU, 0x4c4c98d4U, 0x5858b0e8U, 0xcfcf854aU, + 0xd0d0bb6bU, 0xefefc52aU, 0xaaaa4fe5U, 0xfbfbed16U, + 0x434386c5U, 0x4d4d9ad7U, 0x33336655U, 0x85851194U, + 0x45458acfU, 0xf9f9e910U, 0x02020406U, 0x7f7ffe81U, + 0x5050a0f0U, 0x3c3c7844U, 0x9f9f25baU, 0xa8a84be3U, + 0x5151a2f3U, 0xa3a35dfeU, 0x404080c0U, 0x8f8f058aU, + 0x92923fadU, 0x9d9d21bcU, 0x38387048U, 0xf5f5f104U, + 0xbcbc63dfU, 0xb6b677c1U, 0xdadaaf75U, 0x21214263U, + 0x10102030U, 0xffffe51aU, 0xf3f3fd0eU, 0xd2d2bf6dU, + 0xcdcd814cU, 0x0c0c1814U, 0x13132635U, 0xececc32fU, + 0x5f5fbee1U, 0x979735a2U, 0x444488ccU, 0x17172e39U, + 0xc4c49357U, 0xa7a755f2U, 0x7e7efc82U, 0x3d3d7a47U, + 0x6464c8acU, 0x5d5dbae7U, 0x1919322bU, 0x7373e695U, + 0x6060c0a0U, 0x81811998U, 0x4f4f9ed1U, 0xdcdca37fU, + 0x22224466U, 0x2a2a547eU, 0x90903babU, 0x88880b83U, + 0x46468ccaU, 0xeeeec729U, 0xb8b86bd3U, 0x1414283cU, + 0xdedea779U, 0x5e5ebce2U, 0x0b0b161dU, 0xdbdbad76U, + 0xe0e0db3bU, 0x32326456U, 0x3a3a744eU, 0x0a0a141eU, + 0x494992dbU, 0x06060c0aU, 0x2424486cU, 0x5c5cb8e4U, + 0xc2c29f5dU, 0xd3d3bd6eU, 0xacac43efU, 0x6262c4a6U, + 0x919139a8U, 0x959531a4U, 0xe4e4d337U, 0x7979f28bU, + 0xe7e7d532U, 0xc8c88b43U, 0x37376e59U, 0x6d6ddab7U, + 0x8d8d018cU, 0xd5d5b164U, 0x4e4e9cd2U, 0xa9a949e0U, + 0x6c6cd8b4U, 0x5656acfaU, 0xf4f4f307U, 0xeaeacf25U, + 0x6565caafU, 0x7a7af48eU, 0xaeae47e9U, 0x08081018U, + 0xbaba6fd5U, 0x7878f088U, 0x25254a6fU, 0x2e2e5c72U, + 0x1c1c3824U, 0xa6a657f1U, 0xb4b473c7U, 0xc6c69751U, + 0xe8e8cb23U, 0xdddda17cU, 0x7474e89cU, 0x1f1f3e21U, + 0x4b4b96ddU, 0xbdbd61dcU, 0x8b8b0d86U, 0x8a8a0f85U, + 0x7070e090U, 0x3e3e7c42U, 0xb5b571c4U, 0x6666ccaaU, + 0x484890d8U, 0x03030605U, 0xf6f6f701U, 0x0e0e1c12U, + 0x6161c2a3U, 0x35356a5fU, 0x5757aef9U, 0xb9b969d0U, + 0x86861791U, 0xc1c19958U, 0x1d1d3a27U, 0x9e9e27b9U, + 0xe1e1d938U, 0xf8f8eb13U, 0x98982bb3U, 0x11112233U, + 0x6969d2bbU, 0xd9d9a970U, 0x8e8e0789U, 0x949433a7U, + 0x9b9b2db6U, 0x1e1e3c22U, 0x87871592U, 0xe9e9c920U, + 0xcece8749U, 0x5555aaffU, 0x28285078U, 0xdfdfa57aU, + 0x8c8c038fU, 0xa1a159f8U, 0x89890980U, 0x0d0d1a17U, + 0xbfbf65daU, 0xe6e6d731U, 0x424284c6U, 0x6868d0b8U, + 0x414182c3U, 0x999929b0U, 0x2d2d5a77U, 0x0f0f1e11U, + 0xb0b07bcbU, 0x5454a8fcU, 0xbbbb6dd6U, 0x16162c3aU, + }; + + const uint32_t S1_T2[256] = { + 0x63c6a563U, 0x7cf8847cU, 0x77ee9977U, 0x7bf68d7bU, + 0xf2ff0df2U, 0x6bd6bd6bU, 0x6fdeb16fU, 0xc59154c5U, + 0x30605030U, 0x01020301U, 0x67cea967U, 0x2b567d2bU, + 0xfee719feU, 0xd7b562d7U, 0xab4de6abU, 0x76ec9a76U, + 0xca8f45caU, 0x821f9d82U, 0xc98940c9U, 0x7dfa877dU, + 0xfaef15faU, 0x59b2eb59U, 0x478ec947U, 0xf0fb0bf0U, + 0xad41ecadU, 0xd4b367d4U, 0xa25ffda2U, 0xaf45eaafU, + 0x9c23bf9cU, 0xa453f7a4U, 0x72e49672U, 0xc09b5bc0U, + 0xb775c2b7U, 0xfde11cfdU, 0x933dae93U, 0x264c6a26U, + 0x366c5a36U, 0x3f7e413fU, 0xf7f502f7U, 0xcc834fccU, + 0x34685c34U, 0xa551f4a5U, 0xe5d134e5U, 0xf1f908f1U, + 0x71e29371U, 0xd8ab73d8U, 0x31625331U, 0x152a3f15U, + 0x04080c04U, 0xc79552c7U, 0x23466523U, 0xc39d5ec3U, + 0x18302818U, 0x9637a196U, 0x050a0f05U, 0x9a2fb59aU, + 0x070e0907U, 0x12243612U, 0x801b9b80U, 0xe2df3de2U, + 0xebcd26ebU, 0x274e6927U, 0xb27fcdb2U, 0x75ea9f75U, + 0x09121b09U, 0x831d9e83U, 0x2c58742cU, 0x1a342e1aU, + 0x1b362d1bU, 0x6edcb26eU, 0x5ab4ee5aU, 0xa05bfba0U, + 0x52a4f652U, 0x3b764d3bU, 0xd6b761d6U, 0xb37dceb3U, + 0x29527b29U, 0xe3dd3ee3U, 0x2f5e712fU, 0x84139784U, + 0x53a6f553U, 0xd1b968d1U, 0x00000000U, 0xedc12cedU, + 0x20406020U, 0xfce31ffcU, 0xb179c8b1U, 0x5bb6ed5bU, + 0x6ad4be6aU, 0xcb8d46cbU, 0xbe67d9beU, 0x39724b39U, + 0x4a94de4aU, 0x4c98d44cU, 0x58b0e858U, 0xcf854acfU, + 0xd0bb6bd0U, 0xefc52aefU, 0xaa4fe5aaU, 0xfbed16fbU, + 0x4386c543U, 0x4d9ad74dU, 0x33665533U, 0x85119485U, + 0x458acf45U, 0xf9e910f9U, 0x02040602U, 0x7ffe817fU, + 0x50a0f050U, 0x3c78443cU, 0x9f25ba9fU, 0xa84be3a8U, + 0x51a2f351U, 0xa35dfea3U, 0x4080c040U, 0x8f058a8fU, + 0x923fad92U, 0x9d21bc9dU, 0x38704838U, 0xf5f104f5U, + 0xbc63dfbcU, 0xb677c1b6U, 0xdaaf75daU, 0x21426321U, + 0x10203010U, 0xffe51affU, 0xf3fd0ef3U, 0xd2bf6dd2U, + 0xcd814ccdU, 0x0c18140cU, 0x13263513U, 0xecc32fecU, + 0x5fbee15fU, 0x9735a297U, 0x4488cc44U, 0x172e3917U, + 0xc49357c4U, 0xa755f2a7U, 0x7efc827eU, 0x3d7a473dU, + 0x64c8ac64U, 0x5dbae75dU, 0x19322b19U, 0x73e69573U, + 0x60c0a060U, 0x81199881U, 0x4f9ed14fU, 0xdca37fdcU, + 0x22446622U, 0x2a547e2aU, 0x903bab90U, 0x880b8388U, + 0x468cca46U, 0xeec729eeU, 0xb86bd3b8U, 0x14283c14U, + 0xdea779deU, 0x5ebce25eU, 0x0b161d0bU, 0xdbad76dbU, + 0xe0db3be0U, 0x32645632U, 0x3a744e3aU, 0x0a141e0aU, + 0x4992db49U, 0x060c0a06U, 0x24486c24U, 0x5cb8e45cU, + 0xc29f5dc2U, 0xd3bd6ed3U, 0xac43efacU, 0x62c4a662U, + 0x9139a891U, 0x9531a495U, 0xe4d337e4U, 0x79f28b79U, + 0xe7d532e7U, 0xc88b43c8U, 0x376e5937U, 0x6ddab76dU, + 0x8d018c8dU, 0xd5b164d5U, 0x4e9cd24eU, 0xa949e0a9U, + 0x6cd8b46cU, 0x56acfa56U, 0xf4f307f4U, 0xeacf25eaU, + 0x65caaf65U, 0x7af48e7aU, 0xae47e9aeU, 0x08101808U, + 0xba6fd5baU, 0x78f08878U, 0x254a6f25U, 0x2e5c722eU, + 0x1c38241cU, 0xa657f1a6U, 0xb473c7b4U, 0xc69751c6U, + 0xe8cb23e8U, 0xdda17cddU, 0x74e89c74U, 0x1f3e211fU, + 0x4b96dd4bU, 0xbd61dcbdU, 0x8b0d868bU, 0x8a0f858aU, + 0x70e09070U, 0x3e7c423eU, 0xb571c4b5U, 0x66ccaa66U, + 0x4890d848U, 0x03060503U, 0xf6f701f6U, 0x0e1c120eU, + 0x61c2a361U, 0x356a5f35U, 0x57aef957U, 0xb969d0b9U, + 0x86179186U, 0xc19958c1U, 0x1d3a271dU, 0x9e27b99eU, + 0xe1d938e1U, 0xf8eb13f8U, 0x982bb398U, 0x11223311U, + 0x69d2bb69U, 0xd9a970d9U, 0x8e07898eU, 0x9433a794U, + 0x9b2db69bU, 0x1e3c221eU, 0x87159287U, 0xe9c920e9U, + 0xce8749ceU, 0x55aaff55U, 0x28507828U, 0xdfa57adfU, + 0x8c038f8cU, 0xa159f8a1U, 0x89098089U, 0x0d1a170dU, + 0xbf65dabfU, 0xe6d731e6U, 0x4284c642U, 0x68d0b868U, + 0x4182c341U, 0x9929b099U, 0x2d5a772dU, 0x0f1e110fU, + 0xb07bcbb0U, 0x54a8fc54U, 0xbb6dd6bbU, 0x162c3a16U, + }; + + const uint32_t S1_T3[256] = { + 0xc6a56363U, 0xf8847c7cU, 0xee997777U, 0xf68d7b7bU, + 0xff0df2f2U, 0xd6bd6b6bU, 0xdeb16f6fU, 0x9154c5c5U, + 0x60503030U, 0x02030101U, 0xcea96767U, 0x567d2b2bU, + 0xe719fefeU, 0xb562d7d7U, 0x4de6ababU, 0xec9a7676U, + 0x8f45cacaU, 0x1f9d8282U, 0x8940c9c9U, 0xfa877d7dU, + 0xef15fafaU, 0xb2eb5959U, 0x8ec94747U, 0xfb0bf0f0U, + 0x41ecadadU, 0xb367d4d4U, 0x5ffda2a2U, 0x45eaafafU, + 0x23bf9c9cU, 0x53f7a4a4U, 0xe4967272U, 0x9b5bc0c0U, + 0x75c2b7b7U, 0xe11cfdfdU, 0x3dae9393U, 0x4c6a2626U, + 0x6c5a3636U, 0x7e413f3fU, 0xf502f7f7U, 0x834fccccU, + 0x685c3434U, 0x51f4a5a5U, 0xd134e5e5U, 0xf908f1f1U, + 0xe2937171U, 0xab73d8d8U, 0x62533131U, 0x2a3f1515U, + 0x080c0404U, 0x9552c7c7U, 0x46652323U, 0x9d5ec3c3U, + 0x30281818U, 0x37a19696U, 0x0a0f0505U, 0x2fb59a9aU, + 0x0e090707U, 0x24361212U, 0x1b9b8080U, 0xdf3de2e2U, + 0xcd26ebebU, 0x4e692727U, 0x7fcdb2b2U, 0xea9f7575U, + 0x121b0909U, 0x1d9e8383U, 0x58742c2cU, 0x342e1a1aU, + 0x362d1b1bU, 0xdcb26e6eU, 0xb4ee5a5aU, 0x5bfba0a0U, + 0xa4f65252U, 0x764d3b3bU, 0xb761d6d6U, 0x7dceb3b3U, + 0x527b2929U, 0xdd3ee3e3U, 0x5e712f2fU, 0x13978484U, + 0xa6f55353U, 0xb968d1d1U, 0x00000000U, 0xc12cededU, + 0x40602020U, 0xe31ffcfcU, 0x79c8b1b1U, 0xb6ed5b5bU, + 0xd4be6a6aU, 0x8d46cbcbU, 0x67d9bebeU, 0x724b3939U, + 0x94de4a4aU, 0x98d44c4cU, 0xb0e85858U, 0x854acfcfU, + 0xbb6bd0d0U, 0xc52aefefU, 0x4fe5aaaaU, 0xed16fbfbU, + 0x86c54343U, 0x9ad74d4dU, 0x66553333U, 0x11948585U, + 0x8acf4545U, 0xe910f9f9U, 0x04060202U, 0xfe817f7fU, + 0xa0f05050U, 0x78443c3cU, 0x25ba9f9fU, 0x4be3a8a8U, + 0xa2f35151U, 0x5dfea3a3U, 0x80c04040U, 0x058a8f8fU, + 0x3fad9292U, 0x21bc9d9dU, 0x70483838U, 0xf104f5f5U, + 0x63dfbcbcU, 0x77c1b6b6U, 0xaf75dadaU, 0x42632121U, + 0x20301010U, 0xe51affffU, 0xfd0ef3f3U, 0xbf6dd2d2U, + 0x814ccdcdU, 0x18140c0cU, 0x26351313U, 0xc32fececU, + 0xbee15f5fU, 0x35a29797U, 0x88cc4444U, 0x2e391717U, + 0x9357c4c4U, 0x55f2a7a7U, 0xfc827e7eU, 0x7a473d3dU, + 0xc8ac6464U, 0xbae75d5dU, 0x322b1919U, 0xe6957373U, + 0xc0a06060U, 0x19988181U, 0x9ed14f4fU, 0xa37fdcdcU, + 0x44662222U, 0x547e2a2aU, 0x3bab9090U, 0x0b838888U, + 0x8cca4646U, 0xc729eeeeU, 0x6bd3b8b8U, 0x283c1414U, + 0xa779dedeU, 0xbce25e5eU, 0x161d0b0bU, 0xad76dbdbU, + 0xdb3be0e0U, 0x64563232U, 0x744e3a3aU, 0x141e0a0aU, + 0x92db4949U, 0x0c0a0606U, 0x486c2424U, 0xb8e45c5cU, + 0x9f5dc2c2U, 0xbd6ed3d3U, 0x43efacacU, 0xc4a66262U, + 0x39a89191U, 0x31a49595U, 0xd337e4e4U, 0xf28b7979U, + 0xd532e7e7U, 0x8b43c8c8U, 0x6e593737U, 0xdab76d6dU, + 0x018c8d8dU, 0xb164d5d5U, 0x9cd24e4eU, 0x49e0a9a9U, + 0xd8b46c6cU, 0xacfa5656U, 0xf307f4f4U, 0xcf25eaeaU, + 0xcaaf6565U, 0xf48e7a7aU, 0x47e9aeaeU, 0x10180808U, + 0x6fd5babaU, 0xf0887878U, 0x4a6f2525U, 0x5c722e2eU, + 0x38241c1cU, 0x57f1a6a6U, 0x73c7b4b4U, 0x9751c6c6U, + 0xcb23e8e8U, 0xa17cddddU, 0xe89c7474U, 0x3e211f1fU, + 0x96dd4b4bU, 0x61dcbdbdU, 0x0d868b8bU, 0x0f858a8aU, + 0xe0907070U, 0x7c423e3eU, 0x71c4b5b5U, 0xccaa6666U, + 0x90d84848U, 0x06050303U, 0xf701f6f6U, 0x1c120e0eU, + 0xc2a36161U, 0x6a5f3535U, 0xaef95757U, 0x69d0b9b9U, + 0x17918686U, 0x9958c1c1U, 0x3a271d1dU, 0x27b99e9eU, + 0xd938e1e1U, 0xeb13f8f8U, 0x2bb39898U, 0x22331111U, + 0xd2bb6969U, 0xa970d9d9U, 0x07898e8eU, 0x33a79494U, + 0x2db69b9bU, 0x3c221e1eU, 0x15928787U, 0xc920e9e9U, + 0x8749ceceU, 0xaaff5555U, 0x50782828U, 0xa57adfdfU, + 0x038f8c8cU, 0x59f8a1a1U, 0x09808989U, 0x1a170d0dU, + 0x65dabfbfU, 0xd731e6e6U, 0x84c64242U, 0xd0b86868U, + 0x82c34141U, 0x29b09999U, 0x5a772d2dU, 0x1e110f0fU, + 0x7bcbb0b0U, 0xa8fc5454U, 0x6dd6bbbbU, 0x2c3a1616U, + }; + + const uint32_t S2_T0[256] = { + 0x6f25254aU, 0x6c242448U, 0x957373e6U, 0xa96767ceU, + 0x10d7d7c7U, 0x9baeae35U, 0xe45c5cb8U, 0x50303060U, + 0x85a4a421U, 0x5beeeeb5U, 0xb26e6edcU, 0x34cbcbffU, + 0x877d7dfaU, 0xb6b5b503U, 0xef82826dU, 0x04dbdbdfU, + 0x45e4e4a1U, 0xfb8e8e75U, 0xd8484890U, 0xdb494992U, + 0xd14f4f9eU, 0xe75d5dbaU, 0xbe6a6ad4U, 0x887878f0U, + 0x907070e0U, 0xf1888879U, 0x51e8e8b9U, 0xe15f5fbeU, + 0xe25e5ebcU, 0xe5848461U, 0xaf6565caU, 0x4fe2e2adU, + 0x01d8d8d9U, 0x52e9e9bbU, 0x3dccccf1U, 0x5eededb3U, + 0xc0404080U, 0x712f2f5eU, 0x33111122U, 0x78282850U, + 0xf95757aeU, 0x1fd2d2cdU, 0x9dacac31U, 0x4ce3e3afU, + 0xde4a4a94U, 0x3f15152aU, 0x2d1b1b36U, 0xa2b9b91bU, + 0xbfb2b20dU, 0xe9808069U, 0xe6858563U, 0x83a6a625U, + 0x722e2e5cU, 0x06020204U, 0xc947478eU, 0x7b292952U, + 0x0907070eU, 0xdd4b4b96U, 0x120e0e1cU, 0x2ac1c1ebU, + 0xf35151a2U, 0x97aaaa3dU, 0xf289897bU, 0x15d4d4c1U, + 0x37cacafdU, 0x03010102U, 0xca46468cU, 0xbcb3b30fU, + 0x58efefb7U, 0x0eddddd3U, 0xcc444488U, 0x8d7b7bf6U, + 0x2fc2c2edU, 0x817f7ffeU, 0xabbebe15U, 0x2cc3c3efU, + 0xc89f9f57U, 0x60202040U, 0xd44c4c98U, 0xac6464c8U, + 0xec83836fU, 0x8fa2a22dU, 0xb86868d0U, 0xc6424284U, + 0x35131326U, 0xb5b4b401U, 0xc3414182U, 0x3ecdcdf3U, + 0xa7baba1dU, 0x23c6c6e5U, 0xa4bbbb1fU, 0xb76d6ddaU, + 0xd74d4d9aU, 0x937171e2U, 0x63212142U, 0x75f4f481U, + 0xfe8d8d73U, 0xb9b0b009U, 0x46e5e5a3U, 0xdc93934fU, + 0x6bfefe95U, 0xf88f8f77U, 0x43e6e6a5U, 0x38cfcff7U, + 0xc5434386U, 0xcf45458aU, 0x53313162U, 0x66222244U, + 0x5937376eU, 0x5a36366cU, 0xd3969645U, 0x67fafa9dU, + 0xadbcbc11U, 0x110f0f1eU, 0x18080810U, 0xf65252a4U, + 0x271d1d3aU, 0xff5555aaU, 0x2e1a1a34U, 0x26c5c5e3U, + 0xd24e4e9cU, 0x65232346U, 0xbb6969d2U, 0x8e7a7af4U, + 0xdf92924dU, 0x68ffff97U, 0xed5b5bb6U, 0xee5a5ab4U, + 0x54ebebbfU, 0xc79a9a5dU, 0x241c1c38U, 0x92a9a93bU, + 0x1ad1d1cbU, 0x827e7efcU, 0x170d0d1aU, 0x6dfcfc91U, + 0xf05050a0U, 0xf78a8a7dU, 0xb3b6b605U, 0xa66262c4U, + 0x76f5f583U, 0x1e0a0a14U, 0x61f8f899U, 0x0ddcdcd1U, + 0x05030306U, 0x443c3c78U, 0x140c0c18U, 0x4b393972U, + 0x7af1f18bU, 0xa1b8b819U, 0x7cf3f38fU, 0x473d3d7aU, + 0x7ff2f28dU, 0x16d5d5c3U, 0xd0979747U, 0xaa6666ccU, + 0xea81816bU, 0x56323264U, 0x89a0a029U, 0x00000000U, + 0x0a06060cU, 0x3bcecef5U, 0x73f6f685U, 0x57eaeabdU, + 0xb0b7b707U, 0x3917172eU, 0x70f7f787U, 0xfd8c8c71U, + 0x8b7979f2U, 0x13d6d6c5U, 0x80a7a727U, 0xa8bfbf17U, + 0xf48b8b7fU, 0x413f3f7eU, 0x211f1f3eU, 0xf55353a6U, + 0xa56363c6U, 0x9f7575eaU, 0x5f35356aU, 0x742c2c58U, + 0xa06060c0U, 0x6efdfd93U, 0x6927274eU, 0x1cd3d3cfU, + 0xd5949441U, 0x86a5a523U, 0x847c7cf8U, 0x8aa1a12bU, + 0x0f05050aU, 0xe85858b0U, 0x772d2d5aU, 0xaebdbd13U, + 0x02d9d9dbU, 0x20c7c7e7U, 0x98afaf37U, 0xbd6b6bd6U, + 0xfc5454a8U, 0x1d0b0b16U, 0x49e0e0a9U, 0x48383870U, + 0x0c040408U, 0x31c8c8f9U, 0xce9d9d53U, 0x40e7e7a7U, + 0x3c141428U, 0xbab1b10bU, 0xe0878767U, 0xcd9c9c51U, + 0x08dfdfd7U, 0xb16f6fdeU, 0x62f9f99bU, 0x07dadaddU, + 0x7e2a2a54U, 0x25c4c4e1U, 0xeb5959b2U, 0x3a16162cU, + 0x9c7474e8U, 0xda91914bU, 0x94abab3fU, 0x6a26264cU, + 0xa36161c2U, 0x9a7676ecU, 0x5c343468U, 0x7d2b2b56U, + 0x9eadad33U, 0xc299995bU, 0x64fbfb9fU, 0x967272e4U, + 0x5dececb1U, 0x55333366U, 0x36121224U, 0x0bdeded5U, + 0xc1989859U, 0x4d3b3b76U, 0x29c0c0e9U, 0xc49b9b5fU, + 0x423e3e7cU, 0x28181830U, 0x30101020U, 0x4e3a3a74U, + 0xfa5656acU, 0x4ae1e1abU, 0x997777eeU, 0x32c9c9fbU, + 0x221e1e3cU, 0xcb9e9e55U, 0xd6959543U, 0x8ca3a32fU, + 0xd9909049U, 0x2b191932U, 0x91a8a839U, 0xb46c6cd8U, + 0x1b090912U, 0x19d0d0c9U, 0x79f0f089U, 0xe3868665U, + }; + + const uint32_t S2_T1[256] = { + 0x25254a6fU, 0x2424486cU, 0x7373e695U, 0x6767cea9U, + 0xd7d7c710U, 0xaeae359bU, 0x5c5cb8e4U, 0x30306050U, + 0xa4a42185U, 0xeeeeb55bU, 0x6e6edcb2U, 0xcbcbff34U, + 0x7d7dfa87U, 0xb5b503b6U, 0x82826defU, 0xdbdbdf04U, + 0xe4e4a145U, 0x8e8e75fbU, 0x484890d8U, 0x494992dbU, + 0x4f4f9ed1U, 0x5d5dbae7U, 0x6a6ad4beU, 0x7878f088U, + 0x7070e090U, 0x888879f1U, 0xe8e8b951U, 0x5f5fbee1U, + 0x5e5ebce2U, 0x848461e5U, 0x6565caafU, 0xe2e2ad4fU, + 0xd8d8d901U, 0xe9e9bb52U, 0xccccf13dU, 0xededb35eU, + 0x404080c0U, 0x2f2f5e71U, 0x11112233U, 0x28285078U, + 0x5757aef9U, 0xd2d2cd1fU, 0xacac319dU, 0xe3e3af4cU, + 0x4a4a94deU, 0x15152a3fU, 0x1b1b362dU, 0xb9b91ba2U, + 0xb2b20dbfU, 0x808069e9U, 0x858563e6U, 0xa6a62583U, + 0x2e2e5c72U, 0x02020406U, 0x47478ec9U, 0x2929527bU, + 0x07070e09U, 0x4b4b96ddU, 0x0e0e1c12U, 0xc1c1eb2aU, + 0x5151a2f3U, 0xaaaa3d97U, 0x89897bf2U, 0xd4d4c115U, + 0xcacafd37U, 0x01010203U, 0x46468ccaU, 0xb3b30fbcU, + 0xefefb758U, 0xddddd30eU, 0x444488ccU, 0x7b7bf68dU, + 0xc2c2ed2fU, 0x7f7ffe81U, 0xbebe15abU, 0xc3c3ef2cU, + 0x9f9f57c8U, 0x20204060U, 0x4c4c98d4U, 0x6464c8acU, + 0x83836fecU, 0xa2a22d8fU, 0x6868d0b8U, 0x424284c6U, + 0x13132635U, 0xb4b401b5U, 0x414182c3U, 0xcdcdf33eU, + 0xbaba1da7U, 0xc6c6e523U, 0xbbbb1fa4U, 0x6d6ddab7U, + 0x4d4d9ad7U, 0x7171e293U, 0x21214263U, 0xf4f48175U, + 0x8d8d73feU, 0xb0b009b9U, 0xe5e5a346U, 0x93934fdcU, + 0xfefe956bU, 0x8f8f77f8U, 0xe6e6a543U, 0xcfcff738U, + 0x434386c5U, 0x45458acfU, 0x31316253U, 0x22224466U, + 0x37376e59U, 0x36366c5aU, 0x969645d3U, 0xfafa9d67U, + 0xbcbc11adU, 0x0f0f1e11U, 0x08081018U, 0x5252a4f6U, + 0x1d1d3a27U, 0x5555aaffU, 0x1a1a342eU, 0xc5c5e326U, + 0x4e4e9cd2U, 0x23234665U, 0x6969d2bbU, 0x7a7af48eU, + 0x92924ddfU, 0xffff9768U, 0x5b5bb6edU, 0x5a5ab4eeU, + 0xebebbf54U, 0x9a9a5dc7U, 0x1c1c3824U, 0xa9a93b92U, + 0xd1d1cb1aU, 0x7e7efc82U, 0x0d0d1a17U, 0xfcfc916dU, + 0x5050a0f0U, 0x8a8a7df7U, 0xb6b605b3U, 0x6262c4a6U, + 0xf5f58376U, 0x0a0a141eU, 0xf8f89961U, 0xdcdcd10dU, + 0x03030605U, 0x3c3c7844U, 0x0c0c1814U, 0x3939724bU, + 0xf1f18b7aU, 0xb8b819a1U, 0xf3f38f7cU, 0x3d3d7a47U, + 0xf2f28d7fU, 0xd5d5c316U, 0x979747d0U, 0x6666ccaaU, + 0x81816beaU, 0x32326456U, 0xa0a02989U, 0x00000000U, + 0x06060c0aU, 0xcecef53bU, 0xf6f68573U, 0xeaeabd57U, + 0xb7b707b0U, 0x17172e39U, 0xf7f78770U, 0x8c8c71fdU, + 0x7979f28bU, 0xd6d6c513U, 0xa7a72780U, 0xbfbf17a8U, + 0x8b8b7ff4U, 0x3f3f7e41U, 0x1f1f3e21U, 0x5353a6f5U, + 0x6363c6a5U, 0x7575ea9fU, 0x35356a5fU, 0x2c2c5874U, + 0x6060c0a0U, 0xfdfd936eU, 0x27274e69U, 0xd3d3cf1cU, + 0x949441d5U, 0xa5a52386U, 0x7c7cf884U, 0xa1a12b8aU, + 0x05050a0fU, 0x5858b0e8U, 0x2d2d5a77U, 0xbdbd13aeU, + 0xd9d9db02U, 0xc7c7e720U, 0xafaf3798U, 0x6b6bd6bdU, + 0x5454a8fcU, 0x0b0b161dU, 0xe0e0a949U, 0x38387048U, + 0x0404080cU, 0xc8c8f931U, 0x9d9d53ceU, 0xe7e7a740U, + 0x1414283cU, 0xb1b10bbaU, 0x878767e0U, 0x9c9c51cdU, + 0xdfdfd708U, 0x6f6fdeb1U, 0xf9f99b62U, 0xdadadd07U, + 0x2a2a547eU, 0xc4c4e125U, 0x5959b2ebU, 0x16162c3aU, + 0x7474e89cU, 0x91914bdaU, 0xabab3f94U, 0x26264c6aU, + 0x6161c2a3U, 0x7676ec9aU, 0x3434685cU, 0x2b2b567dU, + 0xadad339eU, 0x99995bc2U, 0xfbfb9f64U, 0x7272e496U, + 0xececb15dU, 0x33336655U, 0x12122436U, 0xdeded50bU, + 0x989859c1U, 0x3b3b764dU, 0xc0c0e929U, 0x9b9b5fc4U, + 0x3e3e7c42U, 0x18183028U, 0x10102030U, 0x3a3a744eU, + 0x5656acfaU, 0xe1e1ab4aU, 0x7777ee99U, 0xc9c9fb32U, + 0x1e1e3c22U, 0x9e9e55cbU, 0x959543d6U, 0xa3a32f8cU, + 0x909049d9U, 0x1919322bU, 0xa8a83991U, 0x6c6cd8b4U, + 0x0909121bU, 0xd0d0c919U, 0xf0f08979U, 0x868665e3U, + }; + + const uint32_t S2_T2[256] = { + 0x254a6f25U, 0x24486c24U, 0x73e69573U, 0x67cea967U, + 0xd7c710d7U, 0xae359baeU, 0x5cb8e45cU, 0x30605030U, + 0xa42185a4U, 0xeeb55beeU, 0x6edcb26eU, 0xcbff34cbU, + 0x7dfa877dU, 0xb503b6b5U, 0x826def82U, 0xdbdf04dbU, + 0xe4a145e4U, 0x8e75fb8eU, 0x4890d848U, 0x4992db49U, + 0x4f9ed14fU, 0x5dbae75dU, 0x6ad4be6aU, 0x78f08878U, + 0x70e09070U, 0x8879f188U, 0xe8b951e8U, 0x5fbee15fU, + 0x5ebce25eU, 0x8461e584U, 0x65caaf65U, 0xe2ad4fe2U, + 0xd8d901d8U, 0xe9bb52e9U, 0xccf13dccU, 0xedb35eedU, + 0x4080c040U, 0x2f5e712fU, 0x11223311U, 0x28507828U, + 0x57aef957U, 0xd2cd1fd2U, 0xac319dacU, 0xe3af4ce3U, + 0x4a94de4aU, 0x152a3f15U, 0x1b362d1bU, 0xb91ba2b9U, + 0xb20dbfb2U, 0x8069e980U, 0x8563e685U, 0xa62583a6U, + 0x2e5c722eU, 0x02040602U, 0x478ec947U, 0x29527b29U, + 0x070e0907U, 0x4b96dd4bU, 0x0e1c120eU, 0xc1eb2ac1U, + 0x51a2f351U, 0xaa3d97aaU, 0x897bf289U, 0xd4c115d4U, + 0xcafd37caU, 0x01020301U, 0x468cca46U, 0xb30fbcb3U, + 0xefb758efU, 0xddd30eddU, 0x4488cc44U, 0x7bf68d7bU, + 0xc2ed2fc2U, 0x7ffe817fU, 0xbe15abbeU, 0xc3ef2cc3U, + 0x9f57c89fU, 0x20406020U, 0x4c98d44cU, 0x64c8ac64U, + 0x836fec83U, 0xa22d8fa2U, 0x68d0b868U, 0x4284c642U, + 0x13263513U, 0xb401b5b4U, 0x4182c341U, 0xcdf33ecdU, + 0xba1da7baU, 0xc6e523c6U, 0xbb1fa4bbU, 0x6ddab76dU, + 0x4d9ad74dU, 0x71e29371U, 0x21426321U, 0xf48175f4U, + 0x8d73fe8dU, 0xb009b9b0U, 0xe5a346e5U, 0x934fdc93U, + 0xfe956bfeU, 0x8f77f88fU, 0xe6a543e6U, 0xcff738cfU, + 0x4386c543U, 0x458acf45U, 0x31625331U, 0x22446622U, + 0x376e5937U, 0x366c5a36U, 0x9645d396U, 0xfa9d67faU, + 0xbc11adbcU, 0x0f1e110fU, 0x08101808U, 0x52a4f652U, + 0x1d3a271dU, 0x55aaff55U, 0x1a342e1aU, 0xc5e326c5U, + 0x4e9cd24eU, 0x23466523U, 0x69d2bb69U, 0x7af48e7aU, + 0x924ddf92U, 0xff9768ffU, 0x5bb6ed5bU, 0x5ab4ee5aU, + 0xebbf54ebU, 0x9a5dc79aU, 0x1c38241cU, 0xa93b92a9U, + 0xd1cb1ad1U, 0x7efc827eU, 0x0d1a170dU, 0xfc916dfcU, + 0x50a0f050U, 0x8a7df78aU, 0xb605b3b6U, 0x62c4a662U, + 0xf58376f5U, 0x0a141e0aU, 0xf89961f8U, 0xdcd10ddcU, + 0x03060503U, 0x3c78443cU, 0x0c18140cU, 0x39724b39U, + 0xf18b7af1U, 0xb819a1b8U, 0xf38f7cf3U, 0x3d7a473dU, + 0xf28d7ff2U, 0xd5c316d5U, 0x9747d097U, 0x66ccaa66U, + 0x816bea81U, 0x32645632U, 0xa02989a0U, 0x00000000U, + 0x060c0a06U, 0xcef53bceU, 0xf68573f6U, 0xeabd57eaU, + 0xb707b0b7U, 0x172e3917U, 0xf78770f7U, 0x8c71fd8cU, + 0x79f28b79U, 0xd6c513d6U, 0xa72780a7U, 0xbf17a8bfU, + 0x8b7ff48bU, 0x3f7e413fU, 0x1f3e211fU, 0x53a6f553U, + 0x63c6a563U, 0x75ea9f75U, 0x356a5f35U, 0x2c58742cU, + 0x60c0a060U, 0xfd936efdU, 0x274e6927U, 0xd3cf1cd3U, + 0x9441d594U, 0xa52386a5U, 0x7cf8847cU, 0xa12b8aa1U, + 0x050a0f05U, 0x58b0e858U, 0x2d5a772dU, 0xbd13aebdU, + 0xd9db02d9U, 0xc7e720c7U, 0xaf3798afU, 0x6bd6bd6bU, + 0x54a8fc54U, 0x0b161d0bU, 0xe0a949e0U, 0x38704838U, + 0x04080c04U, 0xc8f931c8U, 0x9d53ce9dU, 0xe7a740e7U, + 0x14283c14U, 0xb10bbab1U, 0x8767e087U, 0x9c51cd9cU, + 0xdfd708dfU, 0x6fdeb16fU, 0xf99b62f9U, 0xdadd07daU, + 0x2a547e2aU, 0xc4e125c4U, 0x59b2eb59U, 0x162c3a16U, + 0x74e89c74U, 0x914bda91U, 0xab3f94abU, 0x264c6a26U, + 0x61c2a361U, 0x76ec9a76U, 0x34685c34U, 0x2b567d2bU, + 0xad339eadU, 0x995bc299U, 0xfb9f64fbU, 0x72e49672U, + 0xecb15decU, 0x33665533U, 0x12243612U, 0xded50bdeU, + 0x9859c198U, 0x3b764d3bU, 0xc0e929c0U, 0x9b5fc49bU, + 0x3e7c423eU, 0x18302818U, 0x10203010U, 0x3a744e3aU, + 0x56acfa56U, 0xe1ab4ae1U, 0x77ee9977U, 0xc9fb32c9U, + 0x1e3c221eU, 0x9e55cb9eU, 0x9543d695U, 0xa32f8ca3U, + 0x9049d990U, 0x19322b19U, 0xa83991a8U, 0x6cd8b46cU, + 0x09121b09U, 0xd0c919d0U, 0xf08979f0U, 0x8665e386U, + }; + + const uint32_t S2_T3[256] = { + 0x4a6f2525U, 0x486c2424U, 0xe6957373U, 0xcea96767U, + 0xc710d7d7U, 0x359baeaeU, 0xb8e45c5cU, 0x60503030U, + 0x2185a4a4U, 0xb55beeeeU, 0xdcb26e6eU, 0xff34cbcbU, + 0xfa877d7dU, 0x03b6b5b5U, 0x6def8282U, 0xdf04dbdbU, + 0xa145e4e4U, 0x75fb8e8eU, 0x90d84848U, 0x92db4949U, + 0x9ed14f4fU, 0xbae75d5dU, 0xd4be6a6aU, 0xf0887878U, + 0xe0907070U, 0x79f18888U, 0xb951e8e8U, 0xbee15f5fU, + 0xbce25e5eU, 0x61e58484U, 0xcaaf6565U, 0xad4fe2e2U, + 0xd901d8d8U, 0xbb52e9e9U, 0xf13dccccU, 0xb35eededU, + 0x80c04040U, 0x5e712f2fU, 0x22331111U, 0x50782828U, + 0xaef95757U, 0xcd1fd2d2U, 0x319dacacU, 0xaf4ce3e3U, + 0x94de4a4aU, 0x2a3f1515U, 0x362d1b1bU, 0x1ba2b9b9U, + 0x0dbfb2b2U, 0x69e98080U, 0x63e68585U, 0x2583a6a6U, + 0x5c722e2eU, 0x04060202U, 0x8ec94747U, 0x527b2929U, + 0x0e090707U, 0x96dd4b4bU, 0x1c120e0eU, 0xeb2ac1c1U, + 0xa2f35151U, 0x3d97aaaaU, 0x7bf28989U, 0xc115d4d4U, + 0xfd37cacaU, 0x02030101U, 0x8cca4646U, 0x0fbcb3b3U, + 0xb758efefU, 0xd30eddddU, 0x88cc4444U, 0xf68d7b7bU, + 0xed2fc2c2U, 0xfe817f7fU, 0x15abbebeU, 0xef2cc3c3U, + 0x57c89f9fU, 0x40602020U, 0x98d44c4cU, 0xc8ac6464U, + 0x6fec8383U, 0x2d8fa2a2U, 0xd0b86868U, 0x84c64242U, + 0x26351313U, 0x01b5b4b4U, 0x82c34141U, 0xf33ecdcdU, + 0x1da7babaU, 0xe523c6c6U, 0x1fa4bbbbU, 0xdab76d6dU, + 0x9ad74d4dU, 0xe2937171U, 0x42632121U, 0x8175f4f4U, + 0x73fe8d8dU, 0x09b9b0b0U, 0xa346e5e5U, 0x4fdc9393U, + 0x956bfefeU, 0x77f88f8fU, 0xa543e6e6U, 0xf738cfcfU, + 0x86c54343U, 0x8acf4545U, 0x62533131U, 0x44662222U, + 0x6e593737U, 0x6c5a3636U, 0x45d39696U, 0x9d67fafaU, + 0x11adbcbcU, 0x1e110f0fU, 0x10180808U, 0xa4f65252U, + 0x3a271d1dU, 0xaaff5555U, 0x342e1a1aU, 0xe326c5c5U, + 0x9cd24e4eU, 0x46652323U, 0xd2bb6969U, 0xf48e7a7aU, + 0x4ddf9292U, 0x9768ffffU, 0xb6ed5b5bU, 0xb4ee5a5aU, + 0xbf54ebebU, 0x5dc79a9aU, 0x38241c1cU, 0x3b92a9a9U, + 0xcb1ad1d1U, 0xfc827e7eU, 0x1a170d0dU, 0x916dfcfcU, + 0xa0f05050U, 0x7df78a8aU, 0x05b3b6b6U, 0xc4a66262U, + 0x8376f5f5U, 0x141e0a0aU, 0x9961f8f8U, 0xd10ddcdcU, + 0x06050303U, 0x78443c3cU, 0x18140c0cU, 0x724b3939U, + 0x8b7af1f1U, 0x19a1b8b8U, 0x8f7cf3f3U, 0x7a473d3dU, + 0x8d7ff2f2U, 0xc316d5d5U, 0x47d09797U, 0xccaa6666U, + 0x6bea8181U, 0x64563232U, 0x2989a0a0U, 0x00000000U, + 0x0c0a0606U, 0xf53bceceU, 0x8573f6f6U, 0xbd57eaeaU, + 0x07b0b7b7U, 0x2e391717U, 0x8770f7f7U, 0x71fd8c8cU, + 0xf28b7979U, 0xc513d6d6U, 0x2780a7a7U, 0x17a8bfbfU, + 0x7ff48b8bU, 0x7e413f3fU, 0x3e211f1fU, 0xa6f55353U, + 0xc6a56363U, 0xea9f7575U, 0x6a5f3535U, 0x58742c2cU, + 0xc0a06060U, 0x936efdfdU, 0x4e692727U, 0xcf1cd3d3U, + 0x41d59494U, 0x2386a5a5U, 0xf8847c7cU, 0x2b8aa1a1U, + 0x0a0f0505U, 0xb0e85858U, 0x5a772d2dU, 0x13aebdbdU, + 0xdb02d9d9U, 0xe720c7c7U, 0x3798afafU, 0xd6bd6b6bU, + 0xa8fc5454U, 0x161d0b0bU, 0xa949e0e0U, 0x70483838U, + 0x080c0404U, 0xf931c8c8U, 0x53ce9d9dU, 0xa740e7e7U, + 0x283c1414U, 0x0bbab1b1U, 0x67e08787U, 0x51cd9c9cU, + 0xd708dfdfU, 0xdeb16f6fU, 0x9b62f9f9U, 0xdd07dadaU, + 0x547e2a2aU, 0xe125c4c4U, 0xb2eb5959U, 0x2c3a1616U, + 0xe89c7474U, 0x4bda9191U, 0x3f94ababU, 0x4c6a2626U, + 0xc2a36161U, 0xec9a7676U, 0x685c3434U, 0x567d2b2bU, + 0x339eadadU, 0x5bc29999U, 0x9f64fbfbU, 0xe4967272U, + 0xb15dececU, 0x66553333U, 0x24361212U, 0xd50bdedeU, + 0x59c19898U, 0x764d3b3bU, 0xe929c0c0U, 0x5fc49b9bU, + 0x7c423e3eU, 0x30281818U, 0x20301010U, 0x744e3a3aU, + 0xacfa5656U, 0xab4ae1e1U, 0xee997777U, 0xfb32c9c9U, + 0x3c221e1eU, 0x55cb9e9eU, 0x43d69595U, 0x2f8ca3a3U, + 0x49d99090U, 0x322b1919U, 0x3991a8a8U, 0xd8b46c6cU, + 0x121b0909U, 0xc919d0d0U, 0x8979f0f0U, 0x65e38686U, + }; + + const uint32_t MULalpha[256] = { + 0x00000000U, 0xE19FCF13U, 0x6B973726U, 0x8A08F835U, + 0xD6876E4CU, 0x3718A15FU, 0xBD10596AU, 0x5C8F9679U, + 0x05A7DC98U, 0xE438138BU, 0x6E30EBBEU, 0x8FAF24ADU, + 0xD320B2D4U, 0x32BF7DC7U, 0xB8B785F2U, 0x59284AE1U, + 0x0AE71199U, 0xEB78DE8AU, 0x617026BFU, 0x80EFE9ACU, + 0xDC607FD5U, 0x3DFFB0C6U, 0xB7F748F3U, 0x566887E0U, + 0x0F40CD01U, 0xEEDF0212U, 0x64D7FA27U, 0x85483534U, + 0xD9C7A34DU, 0x38586C5EU, 0xB250946BU, 0x53CF5B78U, + 0x1467229BU, 0xF5F8ED88U, 0x7FF015BDU, 0x9E6FDAAEU, + 0xC2E04CD7U, 0x237F83C4U, 0xA9777BF1U, 0x48E8B4E2U, + 0x11C0FE03U, 0xF05F3110U, 0x7A57C925U, 0x9BC80636U, + 0xC747904FU, 0x26D85F5CU, 0xACD0A769U, 0x4D4F687AU, + 0x1E803302U, 0xFF1FFC11U, 0x75170424U, 0x9488CB37U, + 0xC8075D4EU, 0x2998925DU, 0xA3906A68U, 0x420FA57BU, + 0x1B27EF9AU, 0xFAB82089U, 0x70B0D8BCU, 0x912F17AFU, + 0xCDA081D6U, 0x2C3F4EC5U, 0xA637B6F0U, 0x47A879E3U, + 0x28CE449FU, 0xC9518B8CU, 0x435973B9U, 0xA2C6BCAAU, + 0xFE492AD3U, 0x1FD6E5C0U, 0x95DE1DF5U, 0x7441D2E6U, + 0x2D699807U, 0xCCF65714U, 0x46FEAF21U, 0xA7616032U, + 0xFBEEF64BU, 0x1A713958U, 0x9079C16DU, 0x71E60E7EU, + 0x22295506U, 0xC3B69A15U, 0x49BE6220U, 0xA821AD33U, + 0xF4AE3B4AU, 0x1531F459U, 0x9F390C6CU, 0x7EA6C37FU, + 0x278E899EU, 0xC611468DU, 0x4C19BEB8U, 0xAD8671ABU, + 0xF109E7D2U, 0x109628C1U, 0x9A9ED0F4U, 0x7B011FE7U, + 0x3CA96604U, 0xDD36A917U, 0x573E5122U, 0xB6A19E31U, + 0xEA2E0848U, 0x0BB1C75BU, 0x81B93F6EU, 0x6026F07DU, + 0x390EBA9CU, 0xD891758FU, 0x52998DBAU, 0xB30642A9U, + 0xEF89D4D0U, 0x0E161BC3U, 0x841EE3F6U, 0x65812CE5U, + 0x364E779DU, 0xD7D1B88EU, 0x5DD940BBU, 0xBC468FA8U, + 0xE0C919D1U, 0x0156D6C2U, 0x8B5E2EF7U, 0x6AC1E1E4U, + 0x33E9AB05U, 0xD2766416U, 0x587E9C23U, 0xB9E15330U, + 0xE56EC549U, 0x04F10A5AU, 0x8EF9F26FU, 0x6F663D7CU, + 0x50358897U, 0xB1AA4784U, 0x3BA2BFB1U, 0xDA3D70A2U, + 0x86B2E6DBU, 0x672D29C8U, 0xED25D1FDU, 0x0CBA1EEEU, + 0x5592540FU, 0xB40D9B1CU, 0x3E056329U, 0xDF9AAC3AU, + 0x83153A43U, 0x628AF550U, 0xE8820D65U, 0x091DC276U, + 0x5AD2990EU, 0xBB4D561DU, 0x3145AE28U, 0xD0DA613BU, + 0x8C55F742U, 0x6DCA3851U, 0xE7C2C064U, 0x065D0F77U, + 0x5F754596U, 0xBEEA8A85U, 0x34E272B0U, 0xD57DBDA3U, + 0x89F22BDAU, 0x686DE4C9U, 0xE2651CFCU, 0x03FAD3EFU, + 0x4452AA0CU, 0xA5CD651FU, 0x2FC59D2AU, 0xCE5A5239U, + 0x92D5C440U, 0x734A0B53U, 0xF942F366U, 0x18DD3C75U, + 0x41F57694U, 0xA06AB987U, 0x2A6241B2U, 0xCBFD8EA1U, + 0x977218D8U, 0x76EDD7CBU, 0xFCE52FFEU, 0x1D7AE0EDU, + 0x4EB5BB95U, 0xAF2A7486U, 0x25228CB3U, 0xC4BD43A0U, + 0x9832D5D9U, 0x79AD1ACAU, 0xF3A5E2FFU, 0x123A2DECU, + 0x4B12670DU, 0xAA8DA81EU, 0x2085502BU, 0xC11A9F38U, + 0x9D950941U, 0x7C0AC652U, 0xF6023E67U, 0x179DF174U, + 0x78FBCC08U, 0x9964031BU, 0x136CFB2EU, 0xF2F3343DU, + 0xAE7CA244U, 0x4FE36D57U, 0xC5EB9562U, 0x24745A71U, + 0x7D5C1090U, 0x9CC3DF83U, 0x16CB27B6U, 0xF754E8A5U, + 0xABDB7EDCU, 0x4A44B1CFU, 0xC04C49FAU, 0x21D386E9U, + 0x721CDD91U, 0x93831282U, 0x198BEAB7U, 0xF81425A4U, + 0xA49BB3DDU, 0x45047CCEU, 0xCF0C84FBU, 0x2E934BE8U, + 0x77BB0109U, 0x9624CE1AU, 0x1C2C362FU, 0xFDB3F93CU, + 0xA13C6F45U, 0x40A3A056U, 0xCAAB5863U, 0x2B349770U, + 0x6C9CEE93U, 0x8D032180U, 0x070BD9B5U, 0xE69416A6U, + 0xBA1B80DFU, 0x5B844FCCU, 0xD18CB7F9U, 0x301378EAU, + 0x693B320BU, 0x88A4FD18U, 0x02AC052DU, 0xE333CA3EU, + 0xBFBC5C47U, 0x5E239354U, 0xD42B6B61U, 0x35B4A472U, + 0x667BFF0AU, 0x87E43019U, 0x0DECC82CU, 0xEC73073FU, + 0xB0FC9146U, 0x51635E55U, 0xDB6BA660U, 0x3AF46973U, + 0x63DC2392U, 0x8243EC81U, 0x084B14B4U, 0xE9D4DBA7U, + 0xB55B4DDEU, 0x54C482CDU, 0xDECC7AF8U, 0x3F53B5EBU, + }; + + const uint32_t DIValpha[256] = { + 0x00000000U, 0x180F40CDU, 0x301E8033U, 0x2811C0FEU, + 0x603CA966U, 0x7833E9ABU, 0x50222955U, 0x482D6998U, + 0xC078FBCCU, 0xD877BB01U, 0xF0667BFFU, 0xE8693B32U, + 0xA04452AAU, 0xB84B1267U, 0x905AD299U, 0x88559254U, + 0x29F05F31U, 0x31FF1FFCU, 0x19EEDF02U, 0x01E19FCFU, + 0x49CCF657U, 0x51C3B69AU, 0x79D27664U, 0x61DD36A9U, + 0xE988A4FDU, 0xF187E430U, 0xD99624CEU, 0xC1996403U, + 0x89B40D9BU, 0x91BB4D56U, 0xB9AA8DA8U, 0xA1A5CD65U, + 0x5249BE62U, 0x4A46FEAFU, 0x62573E51U, 0x7A587E9CU, + 0x32751704U, 0x2A7A57C9U, 0x026B9737U, 0x1A64D7FAU, + 0x923145AEU, 0x8A3E0563U, 0xA22FC59DU, 0xBA208550U, + 0xF20DECC8U, 0xEA02AC05U, 0xC2136CFBU, 0xDA1C2C36U, + 0x7BB9E153U, 0x63B6A19EU, 0x4BA76160U, 0x53A821ADU, + 0x1B854835U, 0x038A08F8U, 0x2B9BC806U, 0x339488CBU, + 0xBBC11A9FU, 0xA3CE5A52U, 0x8BDF9AACU, 0x93D0DA61U, + 0xDBFDB3F9U, 0xC3F2F334U, 0xEBE333CAU, 0xF3EC7307U, + 0xA492D5C4U, 0xBC9D9509U, 0x948C55F7U, 0x8C83153AU, + 0xC4AE7CA2U, 0xDCA13C6FU, 0xF4B0FC91U, 0xECBFBC5CU, + 0x64EA2E08U, 0x7CE56EC5U, 0x54F4AE3BU, 0x4CFBEEF6U, + 0x04D6876EU, 0x1CD9C7A3U, 0x34C8075DU, 0x2CC74790U, + 0x8D628AF5U, 0x956DCA38U, 0xBD7C0AC6U, 0xA5734A0BU, + 0xED5E2393U, 0xF551635EU, 0xDD40A3A0U, 0xC54FE36DU, + 0x4D1A7139U, 0x551531F4U, 0x7D04F10AU, 0x650BB1C7U, + 0x2D26D85FU, 0x35299892U, 0x1D38586CU, 0x053718A1U, + 0xF6DB6BA6U, 0xEED42B6BU, 0xC6C5EB95U, 0xDECAAB58U, + 0x96E7C2C0U, 0x8EE8820DU, 0xA6F942F3U, 0xBEF6023EU, + 0x36A3906AU, 0x2EACD0A7U, 0x06BD1059U, 0x1EB25094U, + 0x569F390CU, 0x4E9079C1U, 0x6681B93FU, 0x7E8EF9F2U, + 0xDF2B3497U, 0xC724745AU, 0xEF35B4A4U, 0xF73AF469U, + 0xBF179DF1U, 0xA718DD3CU, 0x8F091DC2U, 0x97065D0FU, + 0x1F53CF5BU, 0x075C8F96U, 0x2F4D4F68U, 0x37420FA5U, + 0x7F6F663DU, 0x676026F0U, 0x4F71E60EU, 0x577EA6C3U, + 0xE18D0321U, 0xF98243ECU, 0xD1938312U, 0xC99CC3DFU, + 0x81B1AA47U, 0x99BEEA8AU, 0xB1AF2A74U, 0xA9A06AB9U, + 0x21F5F8EDU, 0x39FAB820U, 0x11EB78DEU, 0x09E43813U, + 0x41C9518BU, 0x59C61146U, 0x71D7D1B8U, 0x69D89175U, + 0xC87D5C10U, 0xD0721CDDU, 0xF863DC23U, 0xE06C9CEEU, + 0xA841F576U, 0xB04EB5BBU, 0x985F7545U, 0x80503588U, + 0x0805A7DCU, 0x100AE711U, 0x381B27EFU, 0x20146722U, + 0x68390EBAU, 0x70364E77U, 0x58278E89U, 0x4028CE44U, + 0xB3C4BD43U, 0xABCBFD8EU, 0x83DA3D70U, 0x9BD57DBDU, + 0xD3F81425U, 0xCBF754E8U, 0xE3E69416U, 0xFBE9D4DBU, + 0x73BC468FU, 0x6BB30642U, 0x43A2C6BCU, 0x5BAD8671U, + 0x1380EFE9U, 0x0B8FAF24U, 0x239E6FDAU, 0x3B912F17U, + 0x9A34E272U, 0x823BA2BFU, 0xAA2A6241U, 0xB225228CU, + 0xFA084B14U, 0xE2070BD9U, 0xCA16CB27U, 0xD2198BEAU, + 0x5A4C19BEU, 0x42435973U, 0x6A52998DU, 0x725DD940U, + 0x3A70B0D8U, 0x227FF015U, 0x0A6E30EBU, 0x12617026U, + 0x451FD6E5U, 0x5D109628U, 0x750156D6U, 0x6D0E161BU, + 0x25237F83U, 0x3D2C3F4EU, 0x153DFFB0U, 0x0D32BF7DU, + 0x85672D29U, 0x9D686DE4U, 0xB579AD1AU, 0xAD76EDD7U, + 0xE55B844FU, 0xFD54C482U, 0xD545047CU, 0xCD4A44B1U, + 0x6CEF89D4U, 0x74E0C919U, 0x5CF109E7U, 0x44FE492AU, + 0x0CD320B2U, 0x14DC607FU, 0x3CCDA081U, 0x24C2E04CU, + 0xAC977218U, 0xB49832D5U, 0x9C89F22BU, 0x8486B2E6U, + 0xCCABDB7EU, 0xD4A49BB3U, 0xFCB55B4DU, 0xE4BA1B80U, + 0x17566887U, 0x0F59284AU, 0x2748E8B4U, 0x3F47A879U, + 0x776AC1E1U, 0x6F65812CU, 0x477441D2U, 0x5F7B011FU, + 0xD72E934BU, 0xCF21D386U, 0xE7301378U, 0xFF3F53B5U, + 0xB7123A2DU, 0xAF1D7AE0U, 0x870CBA1EU, 0x9F03FAD3U, + 0x3EA637B6U, 0x26A9777BU, 0x0EB8B785U, 0x16B7F748U, + 0x5E9A9ED0U, 0x4695DE1DU, 0x6E841EE3U, 0x768B5E2EU, + 0xFEDECC7AU, 0xE6D18CB7U, 0xCEC04C49U, 0xD6CF0C84U, + 0x9EE2651CU, 0x86ED25D1U, 0xAEFCE52FU, 0xB6F3A5E2U, + }; + + inline uint32_t snow_s1(uint32_t in) { return S1_T0[BYTE32(in, 3)] ^ S1_T1[BYTE32(in, 2)] ^ S1_T2[BYTE32(in, 1)] ^ S1_T3[BYTE32(in, 0)]; }; + + inline uint32_t snow_s2(uint32_t in) { return S2_T0[BYTE32(in, 3)] ^ S2_T1[BYTE32(in, 2)] ^ S2_T2[BYTE32(in, 1)] ^ S2_T3[BYTE32(in, 0)]; }; + + /* Clocking operations */ + inline void lfsr_init(uint32_t f, snow3g_context_t *ctx) { + uint32_t v = ( + ((ctx->lfsr[0] << 8) & 0xffffff00) ^ + MULalpha[BYTE32(ctx->lfsr[0], 0)] ^ + ctx->lfsr[2] ^ + ((ctx->lfsr[11] >> 8) & 0x00ffffff) ^ + DIValpha[BYTE32(ctx->lfsr[11], 3)] ^ + f + ); + ctx->lfsr[0] = ctx->lfsr[1]; + ctx->lfsr[1] = ctx->lfsr[2]; + ctx->lfsr[2] = ctx->lfsr[3]; + ctx->lfsr[3] = ctx->lfsr[4]; + ctx->lfsr[4] = ctx->lfsr[5]; + ctx->lfsr[5] = ctx->lfsr[6]; + ctx->lfsr[6] = ctx->lfsr[7]; + ctx->lfsr[7] = ctx->lfsr[8]; + ctx->lfsr[8] = ctx->lfsr[9]; + ctx->lfsr[9] = ctx->lfsr[10]; + ctx->lfsr[10] = ctx->lfsr[11]; + ctx->lfsr[11] = ctx->lfsr[12]; + ctx->lfsr[12] = ctx->lfsr[13]; + ctx->lfsr[13] = ctx->lfsr[14]; + ctx->lfsr[14] = ctx->lfsr[15]; + ctx->lfsr[15] = v; + }; + + inline void lfsr_keystream(snow3g_context_t *ctx) { + uint32_t s0 = ctx->lfsr[0]; + uint32_t s2 = ctx->lfsr[2]; + uint32_t s11 = ctx->lfsr[11]; + uint32_t v = ( + ((s0 << 8) & 0xffffff00) ^ + MULalpha[BYTE32(s0, 0)] ^ + s2 ^ + ((s11 >> 8) & 0x00ffffff) ^ + DIValpha[BYTE32(s11, 3)] + ); + + ctx->lfsr[0] = ctx->lfsr[1]; + ctx->lfsr[1] = ctx->lfsr[2]; + ctx->lfsr[2] = ctx->lfsr[3]; + ctx->lfsr[3] = ctx->lfsr[4]; + ctx->lfsr[4] = ctx->lfsr[5]; + ctx->lfsr[5] = ctx->lfsr[6]; + ctx->lfsr[6] = ctx->lfsr[7]; + ctx->lfsr[7] = ctx->lfsr[8]; + ctx->lfsr[8] = ctx->lfsr[9]; + ctx->lfsr[9] = ctx->lfsr[10]; + ctx->lfsr[10] = ctx->lfsr[11]; + ctx->lfsr[11] = ctx->lfsr[12]; + ctx->lfsr[12] = ctx->lfsr[13]; + ctx->lfsr[13] = ctx->lfsr[14]; + ctx->lfsr[14] = ctx->lfsr[15]; + ctx->lfsr[15] = v; + }; + + inline uint32_t clock_fsm(snow3g_context_t *ctx) { + uint32_t f = (ctx->lfsr[15] + ctx->fsm.r1) ^ ctx->fsm.r2; + uint32_t r = ctx->fsm.r2 + (ctx->fsm.r3 ^ ctx->lfsr[5]); + + ctx->fsm.r3 = snow_s2(ctx->fsm.r2); + ctx->fsm.r2 = snow_s1(ctx->fsm.r1); + ctx->fsm.r1 = r; + + return f; + }; + + inline struct snow_key_st snow_array_to_key(const unsigned char *key, const unsigned char *iv) { + int i; + struct snow_key_st key_iv; + for (i = 0; i < 4; i++) { + key_iv.key[i] = WORD_128(key, i); + key_iv.iv[i] = WORD_128(iv, i); + } + + return key_iv; + }; + + inline void snow_init_lfsr_fsm(struct snow_key_st key, snow3g_context_t *ctx) { + memset(ctx, 0, sizeof(*ctx)); + ctx->lfsr[15] = key.key[3] ^ key.iv[0]; + ctx->lfsr[14] = key.key[2]; + ctx->lfsr[13] = key.key[1]; + ctx->lfsr[12] = key.key[0] ^ key.iv[1]; + ctx->lfsr[11] = key.key[3] ^ ONE; + ctx->lfsr[10] = key.key[2] ^ ONE ^ key.iv[2]; + ctx->lfsr[9] = key.key[1] ^ ONE ^ key.iv[3]; + ctx->lfsr[8] = key.key[0] ^ ONE; + ctx->lfsr[7] = key.key[3]; + ctx->lfsr[6] = key.key[2]; + ctx->lfsr[5] = key.key[1]; + ctx->lfsr[4] = key.key[0]; + ctx->lfsr[3] = key.key[3] ^ ONE; + ctx->lfsr[2] = key.key[2] ^ ONE; + ctx->lfsr[1] = key.key[1] ^ ONE; + ctx->lfsr[0] = key.key[0] ^ ONE; + }; + + inline void snow_set_key(struct snow_key_st key, snow3g_context_t *ctx) { + int i = 0; + + snow_init_lfsr_fsm(key, ctx); + for (i = 0; i < 32; i++) { + lfsr_init(clock_fsm(ctx), ctx); + } + }; + + inline void snow_gen_keystream(uint32_t *stream, size_t nb_word, snow3g_context_t *ctx) { + size_t i = 0; + + for (i = 0; i < nb_word; i++) { + stream[i] = clock_fsm(ctx) ^ ctx->lfsr[0]; + lfsr_keystream(ctx); + } + }; + + /** + * @brief Initialize SNOW 3G with key and IV + * + * @param ctx SNOW 3G context to initialize + * @param key 16-byte encryption key + * @param iv 16-byte initialization vector + */ + int snow3g_initialize(uint32_t count, uint8_t bearer, uint8_t direction, const char *knas_enc, snow3g_context_t *ctx); + + /** + * @brief Generate keystream using SNOW 3G + * + * @param ctx SNOW 3G context + * @param keystream Output buffer for keystream + * @param length Length of keystream needed in bytes + */ + int snow3g_generate(size_t nb_byte, const unsigned char *in, unsigned char *out, snow3g_context_t *ctx); +}; diff --git a/ccsrc/Externals/ia2_128.cc b/ccsrc/Externals/ia2_128.cc new file mode 100644 index 0000000..d237d39 --- /dev/null +++ b/ccsrc/Externals/ia2_128.cc @@ -0,0 +1,220 @@ +/** + * @file ia2_128.cpp + * @brief AES-128 CTR mode Encryption class implementation + * @author Generated for 3GPP NAS encryption + * @date 2024 + */ + +#include "ia2_128.hh" +#include +#include +#include +#include +#include + +#include "loggers.hh" + +namespace { + constexpr size_t KEY_SIZE = 16; // 128 bits = 16 bytes + constexpr size_t BLOCK_SIZE = 16; // AES block size + constexpr size_t COUNTER_SIZE = 16; // Counter block size +} + +int ia2_128::encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length) { + loggers::get_instance().log(">>> ia2_128::encrypt: Starting encryption"); + loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: knas_enc", knas_enc, 16); + loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: payload", payload, payload_length); + loggers::get_instance().log(">>> ia2_128::encrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia2_128::encrypt: count: %u", count); + loggers::get_instance().log(">>> ia2_128::encrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia2_128::encrypt: direction: %d", direction); + + // Input validation + if (!knas_enc || !payload || !cyphered || !cyphered_length) { + loggers::get_instance().error("ia2_128::encrypt: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia2_128::encrypt: Wrong payload length"); + *cyphered = nullptr; + *cyphered_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *cyphered = static_cast(std::malloc(payload_length)); + if (!*cyphered) { + loggers::get_instance().error("ia2_128::encrypt: Failed to allocate memory"); + return -1; + } + + // Generate counter block + unsigned char counter_block[COUNTER_SIZE]; + generate_counter_block(count, bearer, direction, counter_block); + loggers::get_instance().log_to_hexa("ia2_128::encrypt: counter_block: ", counter_block, COUNTER_SIZE); + + // Initialize OpenSSL context + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + loggers::get_instance().error("ia2_128::encrypt: Failed to allocate memory"); + std::free(*cyphered); + *cyphered = nullptr; + return -1; + } + + int ret = -1; + int len = 0; + int final_len = 0; + + // Initialize encryption context for AES-128 CTR mode + if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), nullptr, knas_enc, counter_block) != 1) { + loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptInit_ex failed"); + goto cleanup; + } + + // Encrypt the payload + if (EVP_EncryptUpdate(ctx, *cyphered, &len, payload, static_cast(payload_length)) != 1) { + loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptUpdate failed"); + goto cleanup; + } + loggers::get_instance().log("ia2_128::encrypt: len: %d", len); + + // Finalize encryption + if (EVP_EncryptFinal_ex(ctx, *cyphered + len, &final_len) != 1) { + loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptFinal_ex failed"); + goto cleanup; + } + loggers::get_instance().log("ia2_128::encrypt: final_len: %d", final_len); + + *cyphered_length = static_cast(len + final_len); + loggers::get_instance().log("ia2_128::encrypt: cyphered_length: %d", *cyphered_length); + loggers::get_instance().log_to_hexa("ia2_128::encrypt: cyphered: ", *cyphered, *cyphered_length); + ret = 0; + +cleanup: + EVP_CIPHER_CTX_free(ctx); + if (ret != 0) { + std::free(*cyphered); + *cyphered = nullptr; + *cyphered_length = 0; + } + + loggers::get_instance().log("<<< ia2_128::encrypt: ret: %d", ret); + return ret; +} + +int ia2_128::decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length) { + loggers::get_instance().log(">>> ia2_128::decrypt: Starting decryption"); + loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: knas_enc", knas_enc, 16); + loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: cyphered", cyphered, cyphered_length); + loggers::get_instance().log(">>> ia2_128::decrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia2_128::decrypt: count: %u", count); + loggers::get_instance().log(">>> ia2_128::decrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia2_128::decrypt: direction: %d", direction); + + // Input validation + if (!knas_enc || !cyphered || !payload || !payload_length) { + loggers::get_instance().error("ia2_128::decrypt: Wrong input parameters"); + return -1; + } + + if (cyphered_length == 0) { + loggers::get_instance().error("ia2_128::encrypt: Wrong cyphered length"); + *payload = nullptr; + *payload_length = 0; + return 0; + } + + // Allocate memory for plaintext + *payload = static_cast(std::malloc(cyphered_length)); + if (!*payload) { + loggers::get_instance().error("ia2_128::decrypt: Failed to allocate memody"); + return -1; + } + + // Generate counter block (same as encryption) + unsigned char counter_block[COUNTER_SIZE]; + generate_counter_block(count, bearer, direction, counter_block); + loggers::get_instance().log_to_hexa("ia2_128::decrypt: counter_block: ", counter_block, COUNTER_SIZE); + + // Initialize OpenSSL context + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + loggers::get_instance().error("ia2_128::decrypt: Failed to allocate memory"); + std::free(*payload); + *payload = nullptr; + return -1; + } + + int ret = -1; + int len = 0; + int final_len = 0; + + // Initialize decryption context for AES-128 CTR mode + // Note: CTR mode decryption is identical to encryption + if (EVP_DecryptInit_ex(ctx, EVP_aes_128_ctr(), nullptr, knas_enc, counter_block) != 1) { + loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptInit_ex failed"); + goto cleanup; + } + + // Decrypt the ciphertext + if (EVP_DecryptUpdate(ctx, *payload, &len, cyphered, static_cast(cyphered_length)) != 1) { + loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptUpdate failed"); + goto cleanup; + } + loggers::get_instance().log("ia2_128::decrypt: len: %d", len); + + // Finalize decryption + if (EVP_DecryptFinal_ex(ctx, *payload + len, &final_len) != 1) { + loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptFinal_ex failed"); + goto cleanup; + } + + *payload_length = static_cast(len + final_len); + loggers::get_instance().log("ia2_128::decrypt: cyphered_length: %d", *payload_length); + loggers::get_instance().log_to_hexa("ia2_128::decrypt: cyphered: ", *payload, *payload_length); + ret = 0; + +cleanup: + EVP_CIPHER_CTX_free(ctx); + if (ret != 0) { + std::free(*payload); + *payload = nullptr; + *payload_length = 0; + } + + loggers::get_instance().log("<<< ia2_128::decrypt: ret: %d", ret); + return ret; +} + +// ETSI TS 133 401 V18.3.0 (2025-04) Annex B.1.3 128-EEA2 +void ia2_128::generate_counter_block(const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + unsigned char* counter_block) { + std::memset(counter_block, 0, COUNTER_SIZE); + counter_block[0] = static_cast((count >> 24) & 0xFF); + counter_block[1] = static_cast((count >> 16) & 0xFF); + counter_block[2] = static_cast((count >> 8) & 0xFF); + counter_block[3] = static_cast(count & 0xFF); + counter_block[4] = static_cast((bearer & 0x1F) << 3 | ((direction & 0x01) << 2)); + // Remaining bytes are zero +} + diff --git a/ccsrc/Externals/ia2_128.hh b/ccsrc/Externals/ia2_128.hh new file mode 100644 index 0000000..4c7313a --- /dev/null +++ b/ccsrc/Externals/ia2_128.hh @@ -0,0 +1,135 @@ +/** + * @file ia2_128.h + * @brief AES-128 CTR mode Encryption class header + * @author Generated for 3GPP NAS encryption + * @date 2024 + * + * This class implements the AES-128 in Counter (CTR) mode encryption algorithm (IA2-128) + * as specified in 3GPP TS 33.401 for NAS encryption/decryption. + */ + +#ifndef IA2_128_H +#define IA2_128_H + +#include +#include + +/** + * @class ia2_128 + * @brief Implements AES-128 CTR mode encryption and decryption (IA2-128) + * + * This class provides encryption and decryption functionality using the + * AES-128 algorithm in Counter (CTR) mode as specified in 3GPP TS 33.401. + * The algorithm is used for NAS (Non-Access Stratum) encryption in 3GPP networks. + * This implementation uses OpenSSL for the AES operations. + */ +class ia2_128 { +public: + /** + * @brief Default constructor + */ + ia2_128() = default; + + /** + * @brief Destructor + */ + ~ia2_128() = default; + + /** + * @brief Copy constructor (deleted) + */ + ia2_128(const ia2_128&) = delete; + + /** + * @brief Copy assignment operator (deleted) + */ + ia2_128& operator=(const ia2_128&) = delete; + + /** + * @brief Move constructor (deleted) + */ + ia2_128(ia2_128&&) = delete; + + /** + * @brief Move assignment operator (deleted) + */ + ia2_128& operator=(ia2_128&&) = delete; + + /** + * @brief Encrypts plaintext using AES-128 CTR mode + * + * This method encrypts the given payload using AES-128 in CTR mode. + * The counter block is generated based on the NAS encryption key (knas_enc), + * count, bearer, and direction parameters according to 3GPP TS 33.401. + * + * @param algo_id Algorithm identifier (should be 2 for AES-128 CTR) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to the plaintext data to encrypt + * @param payload_length Length of the plaintext data in bytes + * @param cyphered Pointer to pointer that will receive the encrypted data (caller must free) + * @param cyphered_length Pointer to variable that will receive the encrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for cyphered + * @note cyphered_length will be equal to payload_length for CTR mode + */ + int encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length); + + /** + * @brief Decrypts ciphertext using AES-128 CTR mode + * + * This method decrypts the given ciphertext using AES-128 in CTR mode. + * Decryption is identical to encryption for CTR mode. + * + * @param algo_id Algorithm identifier (should be 2 for AES-128 CTR) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param cyphered Pointer to the ciphertext data to decrypt + * @param cyphered_length Length of the ciphertext data in bytes + * @param payload Pointer to pointer that will receive the decrypted data (caller must free) + * @param payload_length Pointer to variable that will receive the decrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for payload + * @note payload_length will be equal to cyphered_length for CTR mode + */ + int decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length); + +private: + /** + * @brief Generates the initial counter block for AES-CTR + * + * @param count NAS count + * @param bearer Bearer identifier + * @param direction Direction bit + * @param counter_block Output buffer for 16-byte counter block + */ + void generate_counter_block(const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + unsigned char* counter_block); +}; + +#endif // IA2_128_H + diff --git a/ccsrc/Externals/ia3_128.cc b/ccsrc/Externals/ia3_128.cc new file mode 100644 index 0000000..8853b6f --- /dev/null +++ b/ccsrc/Externals/ia3_128.cc @@ -0,0 +1,207 @@ +/** + * @file ia3_128.cpp + * @brief 3GPP ZUC-based Encryption class implementation + * @author Generated for 3GPP NAS encryption + * @date 2024 + * + * This implementation uses the ZUC algorithm as specified in + * 3GPP TS 33.401. For the actual ZUC cipher implementation, + * this code can be linked with libraries such as libmilenage or + * open5gs crypto library. + */ + +#include "ia3_128.hh" +#include +#include + +#include "zuc.hh" + +#include "loggers.hh" + +namespace { + constexpr size_t KEY_SIZE = 16; // 128 bits = 16 bytes + constexpr size_t IV_SIZE = 16; // Initialization vector size +} + +uint32_t ia3_128::LFSR_S0 = 0; +uint32_t ia3_128::LFSR_S1 = 0; +uint32_t ia3_128::LFSR_S2 = 0; +uint32_t ia3_128::LFSR_S3 = 0; +uint32_t ia3_128::LFSR_S4 = 0; +uint32_t ia3_128::LFSR_S5 = 0; +uint32_t ia3_128::LFSR_S6 = 0; +uint32_t ia3_128::LFSR_S7 = 0; +uint32_t ia3_128::LFSR_S8 = 0; +uint32_t ia3_128::LFSR_S9 = 0; +uint32_t ia3_128::LFSR_S10 = 0; +uint32_t ia3_128::LFSR_S11 = 0; +uint32_t ia3_128::LFSR_S12 = 0; +uint32_t ia3_128::LFSR_S13 = 0; +uint32_t ia3_128::LFSR_S14 = 0; +uint32_t ia3_128::LFSR_S15 = 0; +uint32_t ia3_128::F_R1 = 0; +uint32_t ia3_128::F_R2 = 0; +uint32_t ia3_128::BRC_X0 = 0; +uint32_t ia3_128::BRC_X1 = 0; +uint32_t ia3_128::BRC_X2 = 0; +uint32_t ia3_128::BRC_X3 = 0; + +int ia3_128::encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length) { + loggers::get_instance().log_to_hexa(">>> ia3_128::encrypt: knas_enc", knas_enc, KEY_SIZE); + loggers::get_instance().log_to_hexa(">>> ia3_128::encrypt: payload", payload, payload_length); + loggers::get_instance().log(">>> ia3_128::encrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia3_128::encrypt: count: %u", count); + loggers::get_instance().log(">>> ia3_128::encrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia3_128::encrypt: direction: %d", direction); + + // Input validation + if (!knas_enc || !payload || !cyphered || !cyphered_length) { + loggers::get_instance().error("ia3_128::encrypt: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia3_128::encrypt: Wrong payload length"); + *cyphered = nullptr; + *cyphered_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *cyphered = static_cast(std::malloc(payload_length)); + if (!*cyphered) { + loggers::get_instance().error("ia3_128::encrypt: Failed to allocate memory"); + return -1; + } + + zuc_eea3(knas_enc, count, bearer, direction, payload_length * 8, payload, *cyphered); + *cyphered_length = payload_length; + loggers::get_instance().log("ia3_128::encrypt: cyphered_length: %d", *cyphered_length); + loggers::get_instance().log_to_hexa("ia3_128::encrypt: cyphered: ", *cyphered, *cyphered_length); + + loggers::get_instance().log("<<< ia3_128::encrypt: ret: 0"); + return 0; +} + +int ia3_128::decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length) { + // For stream ciphers, decryption is identical to encryption + return encrypt(algo_id, knas_enc, count, bearer, direction, + cyphered, cyphered_length, payload, payload_length); +} + +void ia3_128::zuc_eea3(const uint8_t* CK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint8_t* C) { + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: knas_enc", CK, KEY_SIZE); + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: payload", M, LENGTH / 8); + loggers::get_instance().log(">>> ia3_128::zuc_eea3: count: %u", COUNT); + loggers::get_instance().log(">>> ia3_128::zuc_eea3: bearer: %d", BEARER); + loggers::get_instance().log(">>> ia3_128::zuc_eea3: direction: %d", DIRECTION); + + uint32_t *z, L, L8, i; + uint8_t IV[KEY_SIZE]; + uint32_t lastbits = (8-(LENGTH%8))%8; + + L = (LENGTH+31)/32; + z = static_cast(std::malloc(L*sizeof(uint32_t))); + + + L8 = (LENGTH+7)/8; + + IV[0] = (COUNT>>24) & 0xFF; + IV[1] = (COUNT>>16) & 0xFF; + IV[2] = (COUNT>>8) & 0xFF; + IV[3] = COUNT & 0xFF; + + IV[4] = ((BEARER << 3) | ((DIRECTION&1)<<2)) & 0xFC; + IV[5] = 0; + IV[6] = 0; + IV[7] = 0; + + IV[8] = IV[0]; + IV[9] = IV[1]; + IV[10] = IV[2]; + IV[11] = IV[3]; + + IV[12] = IV[4]; + IV[13] = IV[5]; + IV[14] = IV[6]; + IV[15] = IV[7]; + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: IV", IV, KEY_SIZE); + + ZUC(CK, IV, z, L); + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: z", (uint8_t*)z, L*sizeof(uint32_t)); + + for (i=0; i> (3-i%4)*8) & 0xff); + } + + /* + * Issues #3349 + * Valgrind memcheck: Invalid read & write: Add {}. + */ + + /* zero last bits of data in case its length is not word-aligned (32 bits) + this is an addition to the C reference code, which did not handle it */ + if (lastbits) { + i--; + C[i] &= 0x100 - (1<>> ia3_128::zuc_eea3: C", C, LENGTH / 8); + + std::free(z); +} + +void ia3_128::zuc_eia3(const uint8_t* IK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint32_t* MAC) { + uint32_t *z, N, L, T, i; + uint8_t IV[16]; + + IV[0] = (COUNT>>24) & 0xFF; + IV[1] = (COUNT>>16) & 0xFF; + IV[2] = (COUNT>>8) & 0xFF; + IV[3] = COUNT & 0xFF; + + IV[4] = (BEARER << 3) & 0xF8; + IV[5] = IV[6] = IV[7] = 0; + + IV[8] = ((COUNT>>24) & 0xFF) ^ ((DIRECTION&1)<<7); + IV[9] = (COUNT>>16) & 0xFF; + IV[10] = (COUNT>>8) & 0xFF; + IV[11] = COUNT & 0xFF; + + IV[12] = IV[4]; + IV[13] = IV[5]; + IV[14] = IV[6] ^ ((DIRECTION&1)<<7); + IV[15] = IV[7]; + + N = LENGTH + 64; + L = (N + 31) / 32; + z = static_cast(std::malloc(L*sizeof(uint32_t))); + + ZUC(IK, IV, z, L); + + T = 0; + for (i=0; i +#include + +/** + * @class ia3_128 + * @brief Implements 3GPP ZUC-based encryption and decryption (IA3-128) + * + * This class provides encryption and decryption functionality using the + * ZUC stream cipher algorithm as specified in 3GPP TS 33.401. + * The algorithm is used for NAS (Non-Access Stratum) encryption in 3GPP networks. + */ +class ia3_128 { +public: + /** + * @brief Default constructor + */ + ia3_128() = default; + + /** + * @brief Destructor + */ + ~ia3_128() = default; + + /** + * @brief Copy constructor (deleted) + */ + ia3_128(const ia3_128&) = delete; + + /** + * @brief Copy assignment operator (deleted) + */ + ia3_128& operator=(const ia3_128&) = delete; + + /** + * @brief Move constructor (deleted) + */ + ia3_128(ia3_128&&) = delete; + + /** + * @brief Move assignment operator (deleted) + */ + ia3_128& operator=(ia3_128&&) = delete; + + /** + * @brief Encrypts plaintext using ZUC algorithm + * + * This method encrypts the given payload using the ZUC stream cipher. + * The keystream is generated based on the NAS encryption key (knas_enc), + * count, bearer, and direction parameters according to 3GPP TS 33.401. + * + * @param algo_id Algorithm identifier (should be 3 for ZUC) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to the plaintext data to encrypt + * @param payload_length Length of the plaintext data in bytes + * @param cyphered Pointer to pointer that will receive the encrypted data (caller must free) + * @param cyphered_length Pointer to variable that will receive the encrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for cyphered + * @note cyphered_length will be equal to payload_length for stream ciphers + */ + int encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length); + + /** + * @brief Decrypts ciphertext using ZUC algorithm + * + * This method decrypts the given ciphertext using the ZUC stream cipher. + * Decryption is identical to encryption for stream ciphers (XOR operation). + * + * @param algo_id Algorithm identifier (should be 3 for ZUC) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param cyphered Pointer to the ciphertext data to decrypt + * @param cyphered_length Length of the ciphertext data in bytes + * @param payload Pointer to pointer that will receive the decrypted data (caller must free) + * @param payload_length Pointer to variable that will receive the decrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for payload + * @note payload_length will be equal to cyphered_length for stream ciphers + */ + int decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length); + +private: + const uint8_t S0[256] = { + 0x3e,0x72,0x5b,0x47,0xca,0xe0,0x00,0x33,0x04,0xd1,0x54,0x98,0x09,0xb9,0x6d,0xcb, + 0x7b,0x1b,0xf9,0x32,0xaf,0x9d,0x6a,0xa5,0xb8,0x2d,0xfc,0x1d,0x08,0x53,0x03,0x90, + 0x4d,0x4e,0x84,0x99,0xe4,0xce,0xd9,0x91,0xdd,0xb6,0x85,0x48,0x8b,0x29,0x6e,0xac, + 0xcd,0xc1,0xf8,0x1e,0x73,0x43,0x69,0xc6,0xb5,0xbd,0xfd,0x39,0x63,0x20,0xd4,0x38, + 0x76,0x7d,0xb2,0xa7,0xcf,0xed,0x57,0xc5,0xf3,0x2c,0xbb,0x14,0x21,0x06,0x55,0x9b, + 0xe3,0xef,0x5e,0x31,0x4f,0x7f,0x5a,0xa4,0x0d,0x82,0x51,0x49,0x5f,0xba,0x58,0x1c, + 0x4a,0x16,0xd5,0x17,0xa8,0x92,0x24,0x1f,0x8c,0xff,0xd8,0xae,0x2e,0x01,0xd3,0xad, + 0x3b,0x4b,0xda,0x46,0xeb,0xc9,0xde,0x9a,0x8f,0x87,0xd7,0x3a,0x80,0x6f,0x2f,0xc8, + 0xb1,0xb4,0x37,0xf7,0x0a,0x22,0x13,0x28,0x7c,0xcc,0x3c,0x89,0xc7,0xc3,0x96,0x56, + 0x07,0xbf,0x7e,0xf0,0x0b,0x2b,0x97,0x52,0x35,0x41,0x79,0x61,0xa6,0x4c,0x10,0xfe, + 0xbc,0x26,0x95,0x88,0x8a,0xb0,0xa3,0xfb,0xc0,0x18,0x94,0xf2,0xe1,0xe5,0xe9,0x5d, + 0xd0,0xdc,0x11,0x66,0x64,0x5c,0xec,0x59,0x42,0x75,0x12,0xf5,0x74,0x9c,0xaa,0x23, + 0x0e,0x86,0xab,0xbe,0x2a,0x02,0xe7,0x67,0xe6,0x44,0xa2,0x6c,0xc2,0x93,0x9f,0xf1, + 0xf6,0xfa,0x36,0xd2,0x50,0x68,0x9e,0x62,0x71,0x15,0x3d,0xd6,0x40,0xc4,0xe2,0x0f, + 0x8e,0x83,0x77,0x6b,0x25,0x05,0x3f,0x0c,0x30,0xea,0x70,0xb7,0xa1,0xe8,0xa9,0x65, + 0x8d,0x27,0x1a,0xdb,0x81,0xb3,0xa0,0xf4,0x45,0x7a,0x19,0xdf,0xee,0x78,0x34,0x60 + }; + + const uint8_t S1[256] = { + 0x55,0xc2,0x63,0x71,0x3b,0xc8,0x47,0x86,0x9f,0x3c,0xda,0x5b,0x29,0xaa,0xfd,0x77, + 0x8c,0xc5,0x94,0x0c,0xa6,0x1a,0x13,0x00,0xe3,0xa8,0x16,0x72,0x40,0xf9,0xf8,0x42, + 0x44,0x26,0x68,0x96,0x81,0xd9,0x45,0x3e,0x10,0x76,0xc6,0xa7,0x8b,0x39,0x43,0xe1, + 0x3a,0xb5,0x56,0x2a,0xc0,0x6d,0xb3,0x05,0x22,0x66,0xbf,0xdc,0x0b,0xfa,0x62,0x48, + 0xdd,0x20,0x11,0x06,0x36,0xc9,0xc1,0xcf,0xf6,0x27,0x52,0xbb,0x69,0xf5,0xd4,0x87, + 0x7f,0x84,0x4c,0xd2,0x9c,0x57,0xa4,0xbc,0x4f,0x9a,0xdf,0xfe,0xd6,0x8d,0x7a,0xeb, + 0x2b,0x53,0xd8,0x5c,0xa1,0x14,0x17,0xfb,0x23,0xd5,0x7d,0x30,0x67,0x73,0x08,0x09, + 0xee,0xb7,0x70,0x3f,0x61,0xb2,0x19,0x8e,0x4e,0xe5,0x4b,0x93,0x8f,0x5d,0xdb,0xa9, + 0xad,0xf1,0xae,0x2e,0xcb,0x0d,0xfc,0xf4,0x2d,0x46,0x6e,0x1d,0x97,0xe8,0xd1,0xe9, + 0x4d,0x37,0xa5,0x75,0x5e,0x83,0x9e,0xab,0x82,0x9d,0xb9,0x1c,0xe0,0xcd,0x49,0x89, + 0x01,0xb6,0xbd,0x58,0x24,0xa2,0x5f,0x38,0x78,0x99,0x15,0x90,0x50,0xb8,0x95,0xe4, + 0xd0,0x91,0xc7,0xce,0xed,0x0f,0xb4,0x6f,0xa0,0xcc,0xf0,0x02,0x4a,0x79,0xc3,0xde, + 0xa3,0xef,0xea,0x51,0xe6,0x6b,0x18,0xec,0x1b,0x2c,0x80,0xf7,0x74,0xe7,0xff,0x21, + 0x5a,0x6a,0x54,0x1e,0x41,0x31,0x92,0x35,0xc4,0x33,0x07,0x0a,0xba,0x7e,0x0e,0x34, + 0x88,0xb1,0x98,0x7c,0xf3,0x3d,0x60,0x6c,0x7b,0xca,0xd3,0x1f,0x32,0x65,0x04,0x28, + 0x64,0xbe,0x85,0x9b,0x2f,0x59,0x8a,0xd7,0xb0,0x25,0xac,0xaf,0x12,0x03,0xe2,0xf2 + }; + + /* the constants D */ + const uint32_t EK_d[16] = { + 0x44D7, 0x26BC, 0x626B, 0x135E, 0x5789, 0x35E2, 0x7135, 0x09AF, + 0x4D78, 0x2F13, 0x6BC4, 0x1AF1, 0x5E26, 0x3C4D, 0x789A, 0x47AC + }; + + /* the state registers of LFSR */ + static uint32_t LFSR_S0; + static uint32_t LFSR_S1; + static uint32_t LFSR_S2; + static uint32_t LFSR_S3; + static uint32_t LFSR_S4; + static uint32_t LFSR_S5; + static uint32_t LFSR_S6; + static uint32_t LFSR_S7; + static uint32_t LFSR_S8; + static uint32_t LFSR_S9; + static uint32_t LFSR_S10; + static uint32_t LFSR_S11; + static uint32_t LFSR_S12; + static uint32_t LFSR_S13; + static uint32_t LFSR_S14; + static uint32_t LFSR_S15; + + /* the registers of F */ + static uint32_t F_R1; + static uint32_t F_R2; + + /* the outputs of BitReorganization */ + static uint32_t BRC_X0; + static uint32_t BRC_X1; + static uint32_t BRC_X2; + static uint32_t BRC_X3; + + /* c = a + b mod (2^31 - 1) */ + inline uint32_t AddM(uint32_t a, uint32_t b) { + uint32_t c = a + b; + return (c & 0x7FFFFFFF) + (c >> 31); + }; + + /* LFSR with initialization mode */ + #define MulByPow2(x, k) ((((x) << k) | ((x) >> (31 - k))) & 0x7FFFFFFF) + inline void LFSRWithInitialisationMode(uint32_t u) { + uint32_t f, v; + f = LFSR_S0; + + v = MulByPow2(LFSR_S0, 8); + f = AddM(f, v); + v = MulByPow2(LFSR_S4, 20); + f = AddM(f, v); + v = MulByPow2(LFSR_S10, 21); + f = AddM(f, v); + v = MulByPow2(LFSR_S13, 17); + f = AddM(f, v); + v = MulByPow2(LFSR_S15, 15); + f = AddM(f, v); + + f = AddM(f, u); + + /* update the state */ + LFSR_S0 = LFSR_S1; + LFSR_S1 = LFSR_S2; + LFSR_S2 = LFSR_S3; + LFSR_S3 = LFSR_S4; + LFSR_S4 = LFSR_S5; + LFSR_S5 = LFSR_S6; + LFSR_S6 = LFSR_S7; + LFSR_S7 = LFSR_S8; + LFSR_S8 = LFSR_S9; + LFSR_S9 = LFSR_S10; + LFSR_S10 = LFSR_S11; + LFSR_S11 = LFSR_S12; + LFSR_S12 = LFSR_S13; + LFSR_S13 = LFSR_S14; + LFSR_S14 = LFSR_S15; + LFSR_S15 = f; + }; + + /* LFSR with work mode */ + inline void LFSRWithWorkMode(void) { + uint32_t f, v; + f = LFSR_S0; + + v = MulByPow2(LFSR_S0, 8); + f = AddM(f, v); + v = MulByPow2(LFSR_S4, 20); + f = AddM(f, v); + v = MulByPow2(LFSR_S10, 21); + f = AddM(f, v); + v = MulByPow2(LFSR_S13, 17); + f = AddM(f, v); + v = MulByPow2(LFSR_S15, 15); + f = AddM(f, v); + + /* update the state */ + LFSR_S0 = LFSR_S1; + LFSR_S1 = LFSR_S2; + LFSR_S2 = LFSR_S3; + LFSR_S3 = LFSR_S4; + LFSR_S4 = LFSR_S5; + LFSR_S5 = LFSR_S6; + LFSR_S6 = LFSR_S7; + LFSR_S7 = LFSR_S8; + LFSR_S8 = LFSR_S9; + LFSR_S9 = LFSR_S10; + LFSR_S10 = LFSR_S11; + LFSR_S11 = LFSR_S12; + LFSR_S12 = LFSR_S13; + LFSR_S13 = LFSR_S14; + LFSR_S14 = LFSR_S15; + LFSR_S15 = f; + }; + + /* BitReorganization */ + inline void BitReorganization(void) { + BRC_X0 = ((LFSR_S15 & 0x7FFF8000) << 1) | (LFSR_S14 & 0xFFFF); + BRC_X1 = ((LFSR_S11 & 0xFFFF) << 16) | (LFSR_S9 >> 15); + BRC_X2 = ((LFSR_S7 & 0xFFFF) << 16) | (LFSR_S5 >> 15); + BRC_X3 = ((LFSR_S2 & 0xFFFF) << 16) | (LFSR_S0 >> 15); + }; + + #define ROT(a, k) (((a) << k) | ((a) >> (32 - k))) + + /* L1 */ + inline uint32_t L1(uint32_t X) { return (X ^ ROT(X, 2) ^ ROT(X, 10) ^ ROT(X, 18) ^ ROT(X, 24)); }; + + /* L2 */ + inline uint32_t L2(uint32_t X) { return (X ^ ROT(X, 8) ^ ROT(X, 14) ^ ROT(X, 22) ^ ROT(X, 30)); }; + + #define MAKEU32(a, b, c, d) (((uint32_t)(a) << 24) | ((uint32_t)(b) << 16) | ((uint32_t)(c) << 8) | ((uint32_t)(d))) + /* F */ + inline uint32_t F(void) { + uint32_t W, W1, W2, u, v; + + W = (BRC_X0 ^ F_R1) + F_R2; + W1 = F_R1 + BRC_X1; + W2 = F_R2 ^ BRC_X2; + + u = L1((W1 << 16) | (W2 >> 16)); + v = L2((W2 << 16) | (W1 >> 16)); + + F_R1 = MAKEU32(S0[u >> 24], S1[(u >> 16) & 0xFF], + S0[(u >> 8) & 0xFF], S1[u & 0xFF]); + F_R2 = MAKEU32(S0[v >> 24], S1[(v >> 16) & 0xFF], + S0[(v >> 8) & 0xFF], S1[v & 0xFF]); + + return W; + }; + +#define MAKEU31(a, b, c) (((uint32_t)(a) << 23) | ((uint32_t)(b) << 8) | (uint32_t)(c)) + + inline void zuc_initialize(const uint8_t* k, const uint8_t* iv) { + uint32_t w, nCount; + + /* expand key */ + LFSR_S0 = MAKEU31(k[0], EK_d[0], iv[0]); + LFSR_S1 = MAKEU31(k[1], EK_d[1], iv[1]); + LFSR_S2 = MAKEU31(k[2], EK_d[2], iv[2]); + LFSR_S3 = MAKEU31(k[3], EK_d[3], iv[3]); + LFSR_S4 = MAKEU31(k[4], EK_d[4], iv[4]); + LFSR_S5 = MAKEU31(k[5], EK_d[5], iv[5]); + LFSR_S6 = MAKEU31(k[6], EK_d[6], iv[6]); + LFSR_S7 = MAKEU31(k[7], EK_d[7], iv[7]); + LFSR_S8 = MAKEU31(k[8], EK_d[8], iv[8]); + LFSR_S9 = MAKEU31(k[9], EK_d[9], iv[9]); + LFSR_S10 = MAKEU31(k[10], EK_d[10], iv[10]); + LFSR_S11 = MAKEU31(k[11], EK_d[11], iv[11]); + LFSR_S12 = MAKEU31(k[12], EK_d[12], iv[12]); + LFSR_S13 = MAKEU31(k[13], EK_d[13], iv[13]); + LFSR_S14 = MAKEU31(k[14], EK_d[14], iv[14]); + LFSR_S15 = MAKEU31(k[15], EK_d[15], iv[15]); + + /* set F_R1 and F_R2 to zero */ + F_R1 = 0; + F_R2 = 0; + nCount = 32; + while (nCount > 0) + { + BitReorganization(); + w = F(); + LFSRWithInitialisationMode(w >> 1); + nCount --; + } + }; + + inline void zuc_generate_key_stream(uint32_t* pKeystream, uint32_t KeystreamLen) { + int i; + BitReorganization(); + F(); /* discard the output of F */ + LFSRWithWorkMode(); + + for (i = 0; i < KeystreamLen; i ++) + { + BitReorganization(); + pKeystream[i] = F() ^ BRC_X3; + LFSRWithWorkMode(); + } + }; + + /* The ZUC algorithm, see ref. [3]*/ + inline void ZUC(const uint8_t* k, uint8_t* iv, uint32_t* ks, uint32_t len) { + /* The initialization of ZUC, see page 17 of ref. [3]*/ + zuc_initialize(k, iv); + /* The procedure of generating keystream of ZUC, see page 18 of ref. [3]*/ + zuc_generate_key_stream(ks, len); + }; + + inline uint32_t GET_WORD(const uint32_t* DATA, const uint32_t i) { + uint32_t WORD, ti; + ti = i % 32; + if (ti == 0) + WORD = DATA[i/32]; + else + WORD = (DATA[i/32]<>(32-ti)); + return WORD; + }; + + inline uint8_t GET_BIT(const uint8_t* DATA, const uint32_t i) { return (DATA[i/8] & (1<<(7-(i%8)))) ? 1 : 0; }; + + /* + * CK: ciphering key + * COUNT: frame counter + * BEARER: radio bearer + * DIRECTION + * LENGTH: length of the frame in bits + * M: original message (input) + * C: processed message (output) + */ + void zuc_eea3(const uint8_t* CK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint8_t* C); + + /* + * IK: integrity key + * COUNT: frame counter + * BEARER: radio bearer + * DIRECTION + * LENGTH: length of the frame in bits + * M: original message (input) + * C: processed message (output) + */ + void zuc_eia3(const uint8_t* IK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint32_t* MAC); + +}; diff --git a/ccsrc/Externals/module.mk b/ccsrc/Externals/module.mk index 5a31951..77f08d5 100644 --- a/ccsrc/Externals/module.mk +++ b/ccsrc/Externals/module.mk @@ -1,6 +1,9 @@ -sources := \ - common_ext.cc \ - NG_security_ext.cc \ - Lib_NG_NAS_Functions_ext.cc +sources := \ + common_ext.cc \ + NG_security_ext.cc \ + Lib_NG_NAS_Functions_ext.cc \ + ia1_128.cc \ + ia2_128.cc \ + ia3_128.cc includes := . diff --git a/config.mk b/config.mk index 9aeee3f..957ec1a 100644 --- a/config.mk +++ b/config.mk @@ -1,7 +1,7 @@ # Do not use -X if -H is not used #TTCN3_COMPILER_OPTIONS := -d -e -f -g -j -H -l -L -R -U none -x -X TTCN3_COMPILER_OPTIONS := -b -d -e -f -g -j -l -L -O -P NGAP-PDU-Descriptions.NGAP-PDU -R -U none -x -TTCN3_DIR := $(HOME)/frameworks/titan/titan.core/Install +TTCN3_DIR := $(HOME)/frameworks/titan-11.0.0/Install #TTCN3_DIR := $(HOME)/tmp/ttcn3-9.0.0 #ASN1C_PATH := $(HOME)/frameworks/asn1c.denis #ASN1C_PATH := /home/ubuntu/bin/asn1c.denis/ diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 9880483..4c4ad7a 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -31,10 +31,10 @@ NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (202 # you want to log into the file or display on console (standard error). LogFile := "../logs/Ats_NG_NAS/%e.%h-%r.%s" -#FileMask := LOG_ALL | USER | DEBUG | MATCHING -#ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING -FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE -ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE LogSourceInfo := Stack LogEntityName:= Yes LogEventTypes:= Yes @@ -74,7 +74,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI -NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +#################NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure @@ -143,7 +143,7 @@ NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 @@ -151,7 +151,10 @@ NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 68f9c26..f576993 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2770,22 +2770,21 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 /** - * @desc Verify that the NAS cypher function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex D (normative): Algorithms for ciphering and integrity protection - * @see https://calctools.online/en/crypto/aes + * @desc Verify that the NAS cypher function is working correctly - 128-EEA2 (AES-128 CTR) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.1.1 Test Set 1 + * @see https://tool.hiofd.com/en/aes-encrypt-online/ */ - testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { - // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 - var O16_Type v_k_nas_enc := '1770e0a7c7efb241b2b1f3bc3c9f1ce5'O; // Cypher key - var NasCount_Type v_nas_count := '00000005'O; // NAS Count: 5 + var O16_Type v_k_nas_enc := 'd3c5d592327fb11c4035c6680af8c6d1'O; // Cypher key + var NasCount_Type v_nas_count := '398a59b4'O; // NAS Count var bitstring v_nas_enc_alg := '0010'B ; // 128-NEA2 128-bit AES based algorithm - var B5_Type v_bearer_id := '00001'B; // Bearer ID: 0 (Signalling) - var octetstring v_plain_text := '02017f6508fae201b745e1a68f'O; - var octetstring v_cyphered_text := 'fb849d6f238efda541d2ddecd9'O; // Expected cyphered text + var B5_Type v_bearer_id := '10101'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '981ba6824c1bfb1ab485472029b71d808ce33e2cc3c0b5fc1f3de8a6dc66b1f0'O; + var octetstring v_cyphered_text := 'e9fed8a63d155304d71df20bf3e82214b20ed7dad2f233dc3c22d7bdeeed8e78'O; // Expected cyphered text - var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 0) + var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 1) if (not(match(v_cyphered_text_computed, v_cyphered_text))) { log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_text_computed' did not return the expected value. ***"); setverdict(fail); @@ -2793,82 +2792,122 @@ module NG_NAS_TestCases { log("*** " & __SCOPE__ & ": 'v_cyphered_text_computed' returned the expected value ***"); } + var octetstring v_plain_text_computed := fx_NG_NasDeciphering(v_cyphered_text_computed, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 1) + if (not(match(v_plain_text_computed, v_plain_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_plain_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_plain_text_computed' returned the expected value ***"); + } + setverdict(pass) - } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01 + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 /** - * @desc Verify that the NAS cypher function is working correctly - * @see ETSI TS 133 501 V16.18.0 (2024-04) Figure 6.2.2-2: Key distribution and key derivation scheme for 5G for the UE - * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex D (normative): Algorithms for ciphering and integrity protection - * @see https://cryptii.com/pipes/hmac + * @desc Verify that the NAS cypher function is working correctly - 128-EEA2 (AES-128 CTR) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.1.2 Test Set 2 + * @see https://tool.hiofd.com/en/aes-encrypt-online/ */ - testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { - // From ETSI TS 135 207 V16.0.0 (2020-08) Clause 4.3 Test Set 1 - var O16_Type v_K := '465b5ce8b199b49faa5f0a2ee238a6bc'O; // The long-term key: Subscriber key - var B128_Type v_rand := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); - var O16_Type v_op := 'cdc202d5123e20f62b6d676ac72cb318'O; // Operator Variant Algorithm Configuration Field - var B48_Type v_sqn_ak := oct2bit('ff9bb4d0b607'O); - var B16_Type v_amf := oct2bit('b9b9'O); // AMF: Authentication Management Field - var NAS_PlmnId v_PLMN := '00f110'O; // PLMN ID: 001-01 - var hexstring v_NID := '000138'H; // NID: Network Identifier - var charstring v_supi := "001014444333000"; - var bitstring v_nas_enc_alg := '0010'B ; // 128-NEA2 128-bit AES based algorithm - var bitstring v_bearer_id := '00000'B; // Bearer ID: 0 (Signalling) - var NasCount_Type v_nas_count := '00000000'O; // NAS Count: 0 + var O16_Type v_k_nas_enc := '2bd6459f82c440e0952c49104805ff48'O; // Cypher key + var NasCount_Type v_nas_count := 'c675a64b'O; // NAS Count + var bitstring v_nas_enc_alg := '0010'B ; // 128-NEA2 128-bit AES based algorithm + var B5_Type v_bearer_id := '01100'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '7ec61272743bf1614726446a6c38ced166f6ca76eb5430044286346cef130f92922b03450d3a9975e5bd2ea0eb55ad8e1b199e3ec4316020e9a1b285e762795359b7bdfd39bef4b2484583d5afe082aee638bf5fd5a606193901a08f4ab41aab9b134880'O; + var octetstring v_cyphered_text := '5961605353c64bdca15b195e288553a910632506d6200aa790c4c806c99904cf2445cc50bb1cf168a49673734e081b57e324ce5259c0e78d4cd97b870976503c0943f2cb5ae8f052c7b7d392239587b8956086bcab18836042e2e6ce42432a17105c53d3'O; // Expected cyphered text - f_set_op(v_op); + var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 1) + if (not(match(v_cyphered_text_computed, v_cyphered_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cyphered_text_computed' returned the expected value ***"); + } - var B64_Type v_xres; - var B128_Type v_ck; - var B128_Type v_ik; - var B48_Type v_ak; - var integer v_result := f_f2345(oct2bit(v_K), v_rand, v_xres, v_ck, v_ik, v_ak); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + var octetstring v_plain_text_computed := fx_NG_NasDeciphering(v_cyphered_text_computed, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 1) + if (not(match(v_plain_text_computed, v_plain_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_plain_text_computed' did not return the expected value. ***"); setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_plain_text_computed' returned the expected value ***"); } - var B48_Type v_sqn := v_sqn_ak xor4b v_ak; // SQN = SQN_AK ⊕ AK - log("v_sqn =", bit2oct(v_sqn)); - var B64_Type v_mac_a; - v_result := f_f1(oct2bit(v_K), v_rand, v_sqn, v_amf, v_mac_a); - if (v_result != 0) { - log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 + + /** + * @desc Verify that the NAS cypher function is working correctly - 128-EEA1 (SNOW 3G) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.1.2 Test Set 2 + * @see https://asecuritysite.com/symmetric/snow + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_k_nas_enc := '2bd6459f82c5b300952c49104881ff48'O; // Cypher key + var NasCount_Type v_nas_count := '72a4f20f'O; // NAS Count + var bitstring v_nas_enc_alg := '0001'B ; // 128-NEA1 128-bit SNOW 3G algorithm + var B5_Type v_bearer_id := '01100'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '7ec61272743bf1614726446a6c38ced166f6ca76eb5430044286346cef130f92922b03450d3a9975e5bd2ea0eb55ad8e1b199e3ec4316020e9a1b285e762795359b7bdfd39bef4b2484583d5afe082aee638bf5fd5a606193901a08f4ab41aab9b134880'O; + var octetstring v_cyphered_text := '8ceba62943dced3a0990b06ea1b0a2c4fb3cedc71b369f42ba64c1eb6665e72aa1c9bb0deaa20fe86058b8baee2c2e7f0becce48b52932a53c9d5f931a3a7c532259af4325e2a65e3084ad5f6a513b7bddc1b65f0aa0d97a053db55a88c4c4f9605e4143'O; // Expected cyphered text + + var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 1) + if (not(match(v_cyphered_text_computed, v_cyphered_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_text_computed' did not return the expected value. ***"); setverdict(fail); - stop; + } else { + log("*** " & __SCOPE__ & ": 'v_cyphered_text_computed' returned the expected value ***"); } - var Common_AuthenticationParams_Type v_auth_params := valueof(cs_CommonAuthParams_Init(v_rand)); - v_auth_params.AUTN := v_sqn_ak & v_amf & v_mac_a; // ETSI TS 135 205 V16.0.0 (2020-08) 7.2 Use of the algorithms on the AuC side - v_auth_params.CK := v_ck; - v_auth_params.IK := v_ik; - v_auth_params.XRES := v_xres; - v_auth_params.XRESLength := lengthof(v_xres); + var octetstring v_plain_text_computed := fx_NG_NasDeciphering(v_cyphered_text_computed, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 1) + if (not(match(v_plain_text_computed, v_plain_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_plain_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_plain_text_computed' returned the expected value ***"); + } - var B256_Type v_Ks := v_ck & v_ik; // ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function: Ks = CK || IK - var B256_Type v_k_ausf := f_NG_Authentication_A2(v_auth_params, tsc_KDF_HMAC_SHA_256, v_Ks, v_PLMN, v_NID); - var B256_Type v_k_seaf := f_NG_Authentication_A6(v_PLMN, v_k_ausf, tsc_KDF_HMAC_SHA_256, v_NID); - var B256_Type v_k_amf := f_NG_Authentication_A7(v_supi, v_k_seaf, bit2oct(v_amf), tsc_KDF_HMAC_SHA_256) - var B128_Type v_k_nas_enc := f_NG_Authentication_A8(tsc_NAS_Enc_Alg, - v_nas_enc_alg, - v_k_amf, - tsc_KDF_HMAC_SHA_256) + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 + + /** + * @desc Verify that the NAS cypher function is working correctly - 128-EEA3 (ZUC) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.1.2 Test Set 2 + * @see https://asecuritysite.com/symmetric/snow + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_k_nas_enc := '173d14ba5003731d7a60049470f00a29'O; // Cypher key + var NasCount_Type v_nas_count := '66035492'O; // NAS Count + var bitstring v_nas_enc_alg := '0011'B ; // 128-NEA3 128-bit ZUC algorithm + var B5_Type v_bearer_id := '01111'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '6cf65340735552ab0c9752fa6f9025fe0bd675d9005875b200000000'O; + var octetstring v_cyphered_text := 'a6c85fc66afb8533aafc2518dfe784940ee1e4b030238cc810000000'O; // Expected cyphered text + + var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 0) + if (not(match(v_cyphered_text_computed, v_cyphered_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_cyphered_text_computed' returned the expected value ***"); + } - var octetstring v_raw_pdu := 'CAFEDECA'O; - var octetstring v_cyphered_nas_pdu := ''O; - var octetstring v_cyphered_nas_pdu_computed := fx_NG_NasCiphering(v_raw_pdu, v_nas_enc_alg, v_k_nas_enc, v_nas_count, v_bearer_id, tsc_DirectionDL) - if (not(match(v_cyphered_nas_pdu_computed, v_cyphered_nas_pdu))) { - log("*** " & __SCOPE__ & ": ERROR: 'v_cyphered_nas_pdu_computed' did not return the expected value. ***"); + var octetstring v_plain_text_computed := fx_NG_NasDeciphering(v_cyphered_text_computed, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 0) + if (not(match(v_plain_text_computed, v_plain_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_plain_text_computed' did not return the expected value. ***"); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": 'v_cyphered_nas_pdu_computed' returned the expected value ***"); + log("*** " & __SCOPE__ & ": 'v_plain_text_computed' returned the expected value ***"); } setverdict(pass) - } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02 + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 } // End of group fiveG_AKA_Crypto_Functions diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 7216f2b..2016ae9 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -123,8 +123,12 @@ module Lib_NG_NAS_Security_Functions { } log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); if (ischosen(v_message.security_Protected_Nas_Message)) { - if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) - // NOthing to do, message is not cyphered + if (v_message.security_Protected_Nas_Message.securityHeaderType == '0000'B) { // Not protected (0) + // TODO + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0001'B) { // Integrity protected (1) + // TODO + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) + // Nothing to do, message is not cyphered } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) // TODO Cyphered message // Decipher NAS container @@ -138,7 +142,7 @@ module Lib_NG_NAS_Security_Functions { setverdict(pass); return true; } - // Message was decrypted properly + // Message was decrypted/verified properly v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); if (decvalue(v_bs, v_message) != 0) { log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); -- GitLab From 99027404595b39838c5dd420e14de00fadd8f3c5 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 19 Dec 2025 16:41:52 +0100 Subject: [PATCH 028/151] validate cyphering with ZUC --- ccsrc/Externals/NG_security_ext.cc | 21 ++++++++++++++++++--- ccsrc/Externals/ia3_128.cc | 2 +- ccsrc/Externals/module.mk | 5 ++++- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 4 ++-- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index 791cf4c..73b36b6 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -19,6 +19,8 @@ #include "ia2_128.hh" #include "ia3_128.hh" +#include "zuc.hh" + namespace NG__SecurityDefinitionsAndExternalFunctions { /** @@ -114,6 +116,14 @@ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITST ); } else if (bit2int(p_CipheringAlgorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm loggers::get_instance().log("fx__NG__NasCiphering: ia3_128 selected"); + // loggers::get_instance().log("fx__NG__NasCiphering: %d", p_EncodedNasPdu.lengthof()); + // cyphered = (unsigned char*) std::malloc(p_EncodedNasPdu.lengthof()); + // zuc_eea3( + // (unsigned char*)static_cast(bit2oct(p_KNASenc)), + // nas_count, (uint32_t)bit2int(p_BearerId), p_Direction, + // p_EncodedNasPdu.lengthof() * 8, (unsigned char*)static_cast(p_EncodedNasPdu), cyphered); + // result = 0; + // cyphered_length = p_EncodedNasPdu.lengthof(); ia3_128 enc; result = enc.encrypt( bit2int(p_CipheringAlgorithm), @@ -204,7 +214,13 @@ OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BI &payload_length ); } else if (bit2int(p_CipheringAlgorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm - loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); + // loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); + // zuc_eea3( + // (unsigned char*)static_cast(bit2oct(p_KNASenc)), + // nas_count, bit2int(p_BearerId), p_Direction, + // p_CipheredNasMsg.lengthof() * 8, (unsigned char*)static_cast(p_CipheredNasMsg), payload); + // result = 0; + // payload_length = p_CipheredNasMsg.lengthof(); ia3_128 enc; result = enc.decrypt( bit2int(p_CipheringAlgorithm), @@ -241,5 +257,4 @@ OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BI -} // namespace NG__NAS__SecurityFunctions - // namespace NG__SecurityDefinitionsAndExternalFunctions +} // namespace NG__SecurityDefinitionsAndExternalFunctions diff --git a/ccsrc/Externals/ia3_128.cc b/ccsrc/Externals/ia3_128.cc index 8853b6f..ab815d2 100644 --- a/ccsrc/Externals/ia3_128.cc +++ b/ccsrc/Externals/ia3_128.cc @@ -161,7 +161,7 @@ void ia3_128::zuc_eea3(const uint8_t* CK, const uint32_t COUNT, const uint32_t B i--; C[i] &= 0x100 - (1<>> ia3_128::zuc_eea3: C", C, LENGTH / 8); + loggers::get_instance().log_to_hexa("ia3_128::zuc_eea3: C", C, LENGTH / 8); std::free(z); } diff --git a/ccsrc/Externals/module.mk b/ccsrc/Externals/module.mk index 77f08d5..d044cda 100644 --- a/ccsrc/Externals/module.mk +++ b/ccsrc/Externals/module.mk @@ -4,6 +4,9 @@ sources := \ Lib_NG_NAS_Functions_ext.cc \ ia1_128.cc \ ia2_128.cc \ - ia3_128.cc + ia3_128.cc \ + + +# zuc.cc includes := . diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index f576993..6c7158a 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2886,8 +2886,8 @@ module NG_NAS_TestCases { var NasCount_Type v_nas_count := '66035492'O; // NAS Count var bitstring v_nas_enc_alg := '0011'B ; // 128-NEA3 128-bit ZUC algorithm var B5_Type v_bearer_id := '01111'B; // Bearer ID (Signalling) - var octetstring v_plain_text := '6cf65340735552ab0c9752fa6f9025fe0bd675d9005875b200000000'O; - var octetstring v_cyphered_text := 'a6c85fc66afb8533aafc2518dfe784940ee1e4b030238cc810000000'O; // Expected cyphered text + var octetstring v_plain_text := '6cf65340735552ab0c9752fa6f9025fe0bd675d9005875b200'O; + var octetstring v_cyphered_text := 'a6c85fc66afb8533aafc2518dfe784940ee1e4b030238cc810'O; // Expected cyphered text var octetstring v_cyphered_text_computed := fx_NG_NasCiphering(v_plain_text, v_nas_enc_alg, oct2bit(v_k_nas_enc), v_nas_count, v_bearer_id, 0) if (not(match(v_cyphered_text_computed, v_cyphered_text))) { -- GitLab From 01aa234904400b66827fc9d7a3bdaeedaa52d052 Mon Sep 17 00:00:00 2001 From: garciay Date: Sat, 20 Dec 2025 16:15:25 +0100 Subject: [PATCH 029/151] Adding AtsNGAP config files --- etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 200 +++++++++++++++++++++++++++++++++++ etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 142 +++++++++++++++++++++++++ 2 files changed, 342 insertions(+) create mode 100644 etc/AtsNGAP/AtsNGAP_AMF.cfg_ create mode 100644 etc/AtsNGAP/AtsNGAP_GNB.cfg_ diff --git a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ new file mode 100644 index 0000000..a0b6bb5 --- /dev/null +++ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ @@ -0,0 +1,200 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +NGAP_Pics.PICS_OFFLINE_MODE := true +NGAP_Pics.PICS_NGAP_AMF_IUT := true + +# 5GRegAuthSec_deReg.pcap +LibNGAP_Pixits.PX_AMF_NAME := "Kontron5G-amf" +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 0 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 #8934 +LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B +LibNGAP_Pixits.PX_AMF_POINTER := '011111'B +LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "Jenkins-Open5gs-1-0" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O + +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +# OP +Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O +# OPc +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := '00000000000000000000000000000000'O +Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true + +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B +Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; + +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/AtsNGAP/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. +#system.NGAP_gNB_1.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" + +system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" +system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" + +#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +# Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_01 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_03 +# Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_04 +# Verify that the AMF node processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for not successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_05 + +# Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed +#NGAP_TestCases.TC_NGAP_AMF_CMP_01 +# Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID +NGAP_TestCases.TC_NGAP_AMF_CMP_02 +# Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons +#NGAP_TestCases.TC_NGAP_AMF_CMP_03 +# Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_04 +# Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_05 +# Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_06 +# Verify that the IUT can successfully request UE information from the AMF +#NGAP_TestCases.TC_NGAP_AMF_CMP_07 +# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_08 +# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension +#NGAP_TestCases.TC_NGAP_AMF_CMP_09 +# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_10 +# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_11 + + + +# Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER COMMAND with successfully handover. +#NGAP_TestCases.TC_NGAP_AMF_MMP_01 +# Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER PREPARATION FAILURE because the UE is not longer available. +#NGAP_TestCases.TC_NGAP_AMF_MMP_02 +# Verify that the AMF node successfully sends a HANDOVER REQUEST message that contains mandatory IEs to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_MMP_03 +# Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and answers with PATH SWITCH REQUEST ACKNOWLEDGE to acknowledge the path switch. +#NGAP_TestCases.TC_NGAP_AMF_MMP_04 +# Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and two PDU Sessions with same ID and answers with PATH SWITCH REQUEST FAILURE. +#NGAP_TestCases.TC_NGAP_AMF_MMP_05 +# Verify that the AMF node successfully processes a HANDOVER CANCEL message that contains mandatory IEs and answers with HANDOVER CANCEL ACKNOWLEDGE to confirm that the ongoing handover was cancelled. +#NGAP_TestCases.TC_NGAP_AMF_MMP_06 +# Verify that the AMF node successfully sends a DOWNLINK RAN STATUS TRANSFER message that contains mandatory IEs. +#NGAP_TestCases.TC_NGAP_AMF_MMP_07 +# Verify that the NG-RAN node successfully sends a Handover Success message to the AMF. +#NGAP_TestCases.TC_NGAP_AMF_MMP_08 +# Verify that the AMF node successfully sends a DOWNLINK RAN EARLY STATUS TRANSFER message that contains mandatory IEs. +#NGAP_TestCases.TC_NGAP_AMF_MMP_09 + +# Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. +#NGAP_TestCases.TC_NGAP_AMF_NAS_01 +# Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF. +#NGAP_TestCases.TC_NGAP_AMF_NAS_02 + +# Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_01 +# Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_02 +# Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_03 +# Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_04 +# Verify that the AMF node successfully processes a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update. +#NGAP_TestCases.TC_NGAP_AMF_IMP_05 +# Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request. +#NGAP_TestCases.TC_NGAP_AMF_IMP_06 +# Verify that the IUT can send a AMF CONFIGURATION UPDATE message to the AMF. +#NGAP_TestCases.TC_NGAP_AMF_IMP_07 +# Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset. +#NGAP_TestCases.TC_NGAP_AMF_IMP_08 +# Verify that the AMF can send a ERROR INDICATION to the GNB when a error occurs. +#NGAP_TestCases.TC_NGAP_AMF_IMP_09 +# Verify that the AMF can send a AMF STATUS INDICATION to the GNB when a error occurs. +#NGAP_TestCases.TC_NGAP_AMF_IMP_10 +# Verify that the AMF can send a OVERLOAD START to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_IMP_11 +# Verify that the AMF can send a OVERLOAD STOP to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_IMP_12 + +# Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_AMF_WTP_01 +#Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_AMF_WTP_02 + +# Verify that the IUT can send a TRACE_START to initiate a trace session for a UE. +#NGAP_TestCases.TC_NGAP_AMF_TRP_01 +# Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE. +#NGAP_TestCases.TC_NGAP_AMF_TRP_02 + +# Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure. +#NGAP_TestCases.TC_NGAP_AMF_UBP_01 +# Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping. +#NGAP_TestCases.TC_NGAP_AMF_URP_02 + +# Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER. +#NGAP_TestCases.TC_NGAP_AMF_RIP_01 + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ new file mode 100644 index 0000000..64cc365 --- /dev/null +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -0,0 +1,142 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +NGAP_Pics.PICS_NGAP_GNB_IUT := true +NGAP_Pics.PICS_NGAP_AMF_IUT := false + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/AtsNGAP/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. +aMFNGAPComponent.N2_gNBaMF_P.params := "NGAP/ETH/PCAP_FILE(file=../captures/free5gc.pcap)" + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE SETUP REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE SETUP RESPONSE for successfully established PDU session. +NGAP_TestCases.TC_NGAP_GNB_PDU_01 +# Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value. +#NGAP_TestCases.TC_NGAP_GNB_PDU_02 +# Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP. +#NGAP_TestCases.TC_NGAP_GNB_PDU_03 +# Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a QoS Flow Setup Request List IE in the PDU Session Resource Setup Request Transfer IE including at least one Non-GBR QoS flow but the PDU Session Aggregate Maximum Bit Rate IE is not present. +#NGAP_TestCases.TC_NGAP_GNB_PDU_04 +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND contains mandatory IEs and answers with PDU SESSION RESOURCE RELEASE RESPONSE to release PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_05 +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND containing multiple PDU Session ID IEs set to the same value and ignore the duplication. +#NGAP_TestCases.TC_NGAP_GNB_PDU_05 +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE MODIFY REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE MODIFY RESPONSE for successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_07 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_NOTIFY that already established QoS flow or PDU session for given UE are release. +#NGAP_TestCases.TC_NGAP_GNB_PDU_08 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_INDICATION to request modification of established PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_09 + +# Verify that the IUT can send a HANDOVER REQUIRED message containing mandatory IEs. +#NGAP_TestCases.TC_NGAP_GNB_MMP_01 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. +#NGAP_TestCases.TC_NGAP_GNB_MMP_02 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST FAILURE because the UE is not longer available. +#NGAP_TestCases.TC_NGAP_GNB_MMP_03 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. +#NGAP_TestCases.TC_NGAP_GNB_MMP_04 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs within the Handover Request Transfer IEs and answers with correct HANDOVER REQUEST ACKNOWLEDGE. +#NGAP_TestCases.TC_NGAP_GNB_MMP_05 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message for an intra-system handover and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. +#NGAP_TestCases.TC_NGAP_GNB_MMP_06 +# Verify that the AMF node successfully sends a HANDOVER NOTIFICATION message that contains mandatory IEs to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_07 +# Verify that the AMF node successfully sends a PATH SWITCH REQUEST message that contains mandatory IEs to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_08 +# Verify that the GNB node successfully sends a HANDOVER CANCEL message that contains mandatory IEs to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_09 +# Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_10 +# Verify that the NG-RAN node successfully sends a UPLINK RAN EARLY STATUS TRANSFER message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_11 + +# Verify that the IUT can send an INITIAL UE MESSAGE to indicate the initiation of a NAS Transport procedure. +#NGAP_TestCases.TC_NGAP_GNB_NAS_01 +# Verify that the IUT can send an UPLINK NAS TRANSPORT message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_NAS_02 +# Verify that the IUT can send a NAS NON DELIVERY INDICATION message to t.he AMF +#NGAP_TestCases.TC_NGAP_GNB_NAS_03 + +# Verify that the GNB node successfully sends a NG SETUP REQEST message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_IMP_01 +# Verify that the IUT can send a RAN CONFIGURATION UPDATE message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_IMP_02 +# Verify that the GNB node successfully processes a AMF CONFIGURATION UPDATE message with AMF CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update. +#NGAP_TestCases.TC_NGAP_GNB_IMP_03 +# Verify that the GNB node can send a AMF CONFIGURATION UPDATE FAILURE. +#NGAP_TestCases.TC_NGAP_GNB_IMP_04 +# Verify that the GNB node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset. +#NGAP_TestCases.TC_NGAP_GNB_IMP_05 +# Verify that the GNB can send a ERROR INDICATION to the AMF when a error occurs. +#NGAP_TestCases.TC_NGAP_GNB_IMP_06 + +# Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing mandatory IEs and answers with WRITE-REPLACE WARNING RESPONSE to start broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_GNB_WTP_01 +# Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing Message Identifier IE and/or Serial Number IE different from those in the warning message being broadcast and if Concurent Warning Message Indicator is not present then IUT node answers with WRITE-REPLACE WARNING RESPONSE and replaces the warning message being broadcast with newly received one for that area. +#NGAP_TestCases.TC_NGAP_GNB_WTP_02 +# Verify that the NG-RAN node successfully processes a PWS CANCEL REQUEST containing mandatory IEs and answers with PWS CANCEL RESPONSE to cancel an already ongoing broadcast warning messages in all of the cells in the NG-RAN. +#NGAP_TestCases.TC_NGAP_GNB_WTP_03 +# Verify that the IUT can send a PWS RESTART INDICATION to inform AMF that PWS information for some or all cells may be reloaded from the CBC if needed. +#NGAP_TestCases.TC_NGAP_GNB_WTP_04 +# Verify that the IUT can send a PWS FAILURE INDICATION to inform AMF that ongoing PWS operation for one or more cells has failed. +#NGAP_TestCases.TC_NGAP_GNB_WTP_05 + +# Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that Trace Start procedure has failed due to an interaction with handover procedure. +#NGAP_TestCases.TC_NGAP_GNB_TRP_01 +# Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that a Deactivate Trace procedure has failed due to an interaction with handover procedure. +#NGAP_TestCases.TC_NGAP_GNB_TRP_02 +# Verify that the IUT can send a CELL_TRAFFIC_TRACE to send the allocated Trace Recording Session Reference and Trace Reference to AMF. +#NGAP_TestCases.TC_NGAP_GNB_TRP_03 + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 -- GitLab From 97a3fa35b49baa576a18b41782f2ea68e6216581 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 22 Dec 2025 15:11:15 +0100 Subject: [PATCH 030/151] Validating integrity protection with ZUC --- ccsrc/Externals/NG_security_ext.cc | 302 ++++++++++++++++---------- ccsrc/Externals/ia3_128.cc | 224 +++++++++++-------- ccsrc/Externals/ia3_128.hh | 299 +++++++++++++------------ ccsrc/Externals/module.mk | 2 - etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 1 + ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 29 ++- 6 files changed, 509 insertions(+), 348 deletions(-) diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index 73b36b6..613edbe 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -32,120 +32,184 @@ namespace NG__SecurityDefinitionsAndExternalFunctions { //BITSTRING fx__NR__AsIntegrityAlgorithm(const OCTETSTRING &a, const NR__RRC__ASN1__Definitions::IntegrityProtAlgorithm& b, const BITSTRING &c, const OCTETSTRING &d, const BITSTRING &e, const INTEGER &f){ //return int2bit(0, 0); //} -OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_EncodedNasPdu, const BITSTRING& p_IntegrityAlgorithm, const BITSTRING& p_KNASint, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_EncodedNasPdu: ", p_EncodedNasPdu); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_IntegrityAlgorithm: ", bit2oct(p_IntegrityAlgorithm)); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_KNASint: ", bit2oct(p_KNASint)); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_NasCount: ", p_NasCount); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_BearerId: ", bit2oct(p_BearerId)); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_Direction: ", p_Direction); +OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_encoded_nas_pdu, const BITSTRING& p_integrity_algorithm, const BITSTRING& p_knas_int, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction){ + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_encoded_nas_pdu: ", p_encoded_nas_pdu); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: ", bit2oct(p_integrity_algorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_knas_int: ", bit2oct(p_knas_int)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_nas_count: ", p_nas_count); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_bearer_id: ", bit2oct(p_bearer_id)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_direction: ", p_direction); // Sanity checks - if (p_IntegrityAlgorithm.lengthof() != 4) { - loggers::get_instance().error("fx__NG__NasCiphering: p_IntegrityAlgorithm: Wrong length"); + if (p_integrity_algorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Wrong length"); return int2oct(0, 0); - } else if (p_KNASint.lengthof() != 128) { - loggers::get_instance().error("fx__NG__NasCiphering: p_KNASint: Wrong length"); + } else if (p_knas_int.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_knas_int: Wrong length"); return int2oct(0, 0); - } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { - loggers::get_instance().error("fx__NG__NasCiphering: p_NasCount/p_BearerId: Wrong length"); + } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_nas_count/p_bearer_id: Wrong length"); return int2oct(0, 0); } + unsigned char *mac; + uint32_t mac_length; + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); + int result = -1; + if (bit2int(p_integrity_algorithm) == 0) { // IA0/NEA0: No integrity protection + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: No integrity protection"); + return p_encoded_nas_pdu; // no integrity protection + } else if (bit2int(p_integrity_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia1_128 selected"); + // ia1_128 enc; + // result = enc.mac( + // bit2int(p_integrity_algorithm), + // static_cast(bit2oct(p_knas_int)), + // nas_count, + // bit2int(p_bearer_id), + // p_direction, + // static_cast(p_encoded_nas_pdu), + // p_encoded_nas_pdu.lengthof(), + // &mac, + // &mac_length + // ); + } else if (bit2int(p_integrity_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia2_128 selected"); + // ia2_128 enc; + // result = enc.encrypt( + // bit2int(p_integrity_algorithm), + // static_cast(bit2oct(p_knas_int)), + // nas_count, + // bit2int(p_bearer_id), + // p_direction, + // static_cast(p_encoded_nas_pdu), + // p_encoded_nas_pdu.lengthof(), + // &mac, + // &mac_length + // ); + } else if (bit2int(p_integrity_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia3_128 selected"); + ia3_128 enc; + result = enc.mac( + bit2int(p_integrity_algorithm), + static_cast(bit2oct(p_knas_int)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &mac, + &mac_length + ); + } else if (bit2int(p_integrity_algorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else if (bit2int(p_integrity_algorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else if (bit2int(p_integrity_algorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else if (bit2int(p_integrity_algorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unknown algorithm"); + } + if (result != 0) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: ia2_128.mac() failed"); + return int2oct(0, 0); + } + OCTETSTRING os(mac_length, (const unsigned char*)mac); + free(mac); - - - - return int2oct(0, 0); + loggers::get_instance().log_msg("<<< fx__NG__NasIntegrityAlgorithm: ", os); + return os; } -OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ - loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_EncodedNasPdu: ", p_EncodedNasPdu); - loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_CipheringAlgorithm: ", bit2oct(p_CipheringAlgorithm)); - loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_KNASenc: ", bit2oct(p_KNASenc)); - loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_NasCount: ", p_NasCount); - loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_BearerId: ", bit2oct(p_BearerId)); - loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_Direction: ", p_Direction); +OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_encoded_nas_pdu,const BITSTRING& p_ciphering_algorithm, const BITSTRING& p_knas_enc, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction){ + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_encoded_nas_pdu: ", p_encoded_nas_pdu); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_ciphering_algorithm: ", bit2oct(p_ciphering_algorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_knas_enc: ", bit2oct(p_knas_enc)); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_nas_count: ", p_nas_count); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_bearer_id: ", bit2oct(p_bearer_id)); + loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_direction: ", p_direction); // Sanity checks - if (p_CipheringAlgorithm.lengthof() != 4) { - loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Wrong length"); + if (p_ciphering_algorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Wrong length"); return int2oct(0, 0); - } else if (p_KNASenc.lengthof() != 128) { - loggers::get_instance().error("fx__NG__NasCiphering: p_KNASenc: Wrong length"); + } else if (p_knas_enc.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasCiphering: p_knas_enc: Wrong length"); return int2oct(0, 0); - } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { - loggers::get_instance().error("fx__NG__NasCiphering: p_NasCount/p_BearerId: Wrong length"); + } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasCiphering: p_nas_count/p_bearer_id: Wrong length"); return int2oct(0, 0); } unsigned char *cyphered; uint32_t cyphered_length; - uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_NasCount), static_cast(p_NasCount) + p_NasCount.lengthof())); + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); int result = -1; - if (bit2int(p_CipheringAlgorithm) == 0) { // IA0/NEA0: No cyphering + if (bit2int(p_ciphering_algorithm) == 0) { // IA0/NEA0: No cyphering loggers::get_instance().log("fx__NG__NasCiphering: No cyphering"); - return p_EncodedNasPdu; // no cyphering - } else if (bit2int(p_CipheringAlgorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + return p_encoded_nas_pdu; // no cyphering + } else if (bit2int(p_ciphering_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm loggers::get_instance().log("fx__NG__NasCiphering: ia1_128 selected"); ia1_128 enc; result = enc.encrypt( - bit2int(p_CipheringAlgorithm), - static_cast(bit2oct(p_KNASenc)), + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), nas_count, - bit2int(p_BearerId), - p_Direction, - static_cast(p_EncodedNasPdu), - p_EncodedNasPdu.lengthof(), + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), &cyphered, &cyphered_length ); - } else if (bit2int(p_CipheringAlgorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + } else if (bit2int(p_ciphering_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm loggers::get_instance().log("fx__NG__NasCiphering: ia2_128 selected"); ia2_128 enc; result = enc.encrypt( - bit2int(p_CipheringAlgorithm), - static_cast(bit2oct(p_KNASenc)), + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), nas_count, - bit2int(p_BearerId), - p_Direction, - static_cast(p_EncodedNasPdu), - p_EncodedNasPdu.lengthof(), + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), &cyphered, &cyphered_length ); - } else if (bit2int(p_CipheringAlgorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + } else if (bit2int(p_ciphering_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm loggers::get_instance().log("fx__NG__NasCiphering: ia3_128 selected"); - // loggers::get_instance().log("fx__NG__NasCiphering: %d", p_EncodedNasPdu.lengthof()); - // cyphered = (unsigned char*) std::malloc(p_EncodedNasPdu.lengthof()); + // loggers::get_instance().log("fx__NG__NasCiphering: %d", p_encoded_nas_pdu.lengthof()); + // cyphered = (unsigned char*) std::malloc(p_encoded_nas_pdu.lengthof()); // zuc_eea3( - // (unsigned char*)static_cast(bit2oct(p_KNASenc)), - // nas_count, (uint32_t)bit2int(p_BearerId), p_Direction, - // p_EncodedNasPdu.lengthof() * 8, (unsigned char*)static_cast(p_EncodedNasPdu), cyphered); + // (unsigned char*)static_cast(bit2oct(p_knas_enc)), + // nas_count, (uint32_t)bit2int(p_bearer_id), p_direction, + // p_encoded_nas_pdu.lengthof() * 8, (unsigned char*)static_cast(p_encoded_nas_pdu), cyphered); // result = 0; - // cyphered_length = p_EncodedNasPdu.lengthof(); + // cyphered_length = p_encoded_nas_pdu.lengthof(); ia3_128 enc; result = enc.encrypt( - bit2int(p_CipheringAlgorithm), - static_cast(bit2oct(p_KNASenc)), + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), nas_count, - bit2int(p_BearerId), - p_Direction, - static_cast(p_EncodedNasPdu), - p_EncodedNasPdu.lengthof(), + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), &cyphered, &cyphered_length ); - } else if (bit2int(p_CipheringAlgorithm) == 4) { // IA4 - loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); - } else if (bit2int(p_CipheringAlgorithm) == 5) { // IA5 - loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); - } else if (bit2int(p_CipheringAlgorithm) == 6) { // IA6 - loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); - } else if (bit2int(p_CipheringAlgorithm) == 7) { // IA7 - loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); } else { - loggers::get_instance().error("fx__NG__NasCiphering: p_CipheringAlgorithm: Unknown algorithm"); + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unknown algorithm"); } if (result != 0) { loggers::get_instance().error("fx__NG__NasCiphering: ia2_128.encrypt() failed"); @@ -158,91 +222,91 @@ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_EncodedNasPdu,const BITST return os; } -OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_CipheredNasMsg, const BITSTRING& p_CipheringAlgorithm, const BITSTRING& p_KNASenc, const OCTETSTRING& p_NasCount, const BITSTRING& p_BearerId, const INTEGER& p_Direction){ - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_CipheredNasMsg: ", p_CipheredNasMsg); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_CipheringAlgorithm: ", bit2oct(p_CipheringAlgorithm)); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_KNASenc: ", bit2oct(p_KNASenc)); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_NasCount: ", p_NasCount); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_BearerId: ", bit2oct(p_BearerId)); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_Direction: ", p_Direction); +OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_ciphered_nas_message, const BITSTRING& p_ciphering_algorithm, const BITSTRING& p_knas_enc, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction){ + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_ciphered_nas_message: ", p_ciphered_nas_message); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_ciphering_algorithm: ", bit2oct(p_ciphering_algorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_knas_enc: ", bit2oct(p_knas_enc)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_nas_count: ", p_nas_count); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_bearer_id: ", bit2oct(p_bearer_id)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_direction: ", p_direction); // Sanity checks - if (p_CipheringAlgorithm.lengthof() != 4) { - loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Wrong length"); + if (p_ciphering_algorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Wrong length"); return int2oct(0, 0); - } else if (p_KNASenc.lengthof() != 128) { - loggers::get_instance().error("fx__NG__NasDeciphering: p_KNASenc: Wrong length"); + } else if (p_knas_enc.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_knas_enc: Wrong length"); return int2oct(0, 0); - } else if ((p_NasCount.lengthof() != 4) || (p_BearerId.lengthof() != 5)) { - loggers::get_instance().error("fx__NG__NasDeciphering: p_NasCount/p_BearerId: Wrong length"); + } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_nas_count/p_bearer_id: Wrong length"); return int2oct(0, 0); } unsigned char *payload; uint32_t payload_length; - uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_NasCount), static_cast(p_NasCount) + p_NasCount.lengthof())); + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); int result = -1; - if (bit2int(p_CipheringAlgorithm) == 0) { // IA0/NEA0: No cyphering + if (bit2int(p_ciphering_algorithm) == 0) { // IA0/NEA0: No cyphering loggers::get_instance().log("fx__NG__NasDeciphering: No cyphering"); - return p_CipheredNasMsg; // no cyphering - } else if (bit2int(p_CipheringAlgorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + return p_ciphered_nas_message; // no cyphering + } else if (bit2int(p_ciphering_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); ia1_128 enc; result = enc.decrypt( - bit2int(p_CipheringAlgorithm), - static_cast(bit2oct(p_KNASenc)), + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), nas_count, - bit2int(p_BearerId), - p_Direction, - static_cast(p_CipheredNasMsg), - p_CipheredNasMsg.lengthof(), + bit2int(p_bearer_id), + p_direction, + static_cast(p_ciphered_nas_message), + p_ciphered_nas_message.lengthof(), &payload, &payload_length ); - } else if (bit2int(p_CipheringAlgorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + } else if (bit2int(p_ciphering_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm loggers::get_instance().log("fx__NG__NasDeciphering: ia2_128 selected"); ia2_128 enc; result = enc.decrypt( - bit2int(p_CipheringAlgorithm), - static_cast(bit2oct(p_KNASenc)), + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), nas_count, - bit2int(p_BearerId), - p_Direction, - static_cast(p_CipheredNasMsg), - p_CipheredNasMsg.lengthof(), + bit2int(p_bearer_id), + p_direction, + static_cast(p_ciphered_nas_message), + p_ciphered_nas_message.lengthof(), &payload, &payload_length ); - } else if (bit2int(p_CipheringAlgorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + } else if (bit2int(p_ciphering_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm // loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); // zuc_eea3( - // (unsigned char*)static_cast(bit2oct(p_KNASenc)), - // nas_count, bit2int(p_BearerId), p_Direction, - // p_CipheredNasMsg.lengthof() * 8, (unsigned char*)static_cast(p_CipheredNasMsg), payload); + // (unsigned char*)static_cast(bit2oct(p_knas_enc)), + // nas_count, bit2int(p_bearer_id), p_direction, + // p_ciphered_nas_message.lengthof() * 8, (unsigned char*)static_cast(p_ciphered_nas_message), payload); // result = 0; - // payload_length = p_CipheredNasMsg.lengthof(); + // payload_length = p_ciphered_nas_message.lengthof(); ia3_128 enc; result = enc.decrypt( - bit2int(p_CipheringAlgorithm), - static_cast(bit2oct(p_KNASenc)), + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), nas_count, - bit2int(p_BearerId), - p_Direction, - static_cast(p_CipheredNasMsg), - p_CipheredNasMsg.lengthof(), + bit2int(p_bearer_id), + p_direction, + static_cast(p_ciphered_nas_message), + p_ciphered_nas_message.lengthof(), &payload, &payload_length ); - } else if (bit2int(p_CipheringAlgorithm) == 4) { // IA4 - loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); - } else if (bit2int(p_CipheringAlgorithm) == 5) { // IA5 - loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); - } else if (bit2int(p_CipheringAlgorithm) == 6) { // IA6 - loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); - } else if (bit2int(p_CipheringAlgorithm) == 7) { // IA7 - loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); } else { - loggers::get_instance().error("fx__NG__NasDeciphering: p_CipheringAlgorithm: Unknown algorithm"); + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unknown algorithm"); } if (result != 0) { loggers::get_instance().error("fx__NG__NasDeciphering: decrypt() failed"); diff --git a/ccsrc/Externals/ia3_128.cc b/ccsrc/Externals/ia3_128.cc index ab815d2..f9dc7e5 100644 --- a/ccsrc/Externals/ia3_128.cc +++ b/ccsrc/Externals/ia3_128.cc @@ -23,28 +23,28 @@ namespace { constexpr size_t IV_SIZE = 16; // Initialization vector size } -uint32_t ia3_128::LFSR_S0 = 0; -uint32_t ia3_128::LFSR_S1 = 0; -uint32_t ia3_128::LFSR_S2 = 0; -uint32_t ia3_128::LFSR_S3 = 0; -uint32_t ia3_128::LFSR_S4 = 0; -uint32_t ia3_128::LFSR_S5 = 0; -uint32_t ia3_128::LFSR_S6 = 0; -uint32_t ia3_128::LFSR_S7 = 0; -uint32_t ia3_128::LFSR_S8 = 0; -uint32_t ia3_128::LFSR_S9 = 0; -uint32_t ia3_128::LFSR_S10 = 0; -uint32_t ia3_128::LFSR_S11 = 0; -uint32_t ia3_128::LFSR_S12 = 0; -uint32_t ia3_128::LFSR_S13 = 0; -uint32_t ia3_128::LFSR_S14 = 0; -uint32_t ia3_128::LFSR_S15 = 0; -uint32_t ia3_128::F_R1 = 0; -uint32_t ia3_128::F_R2 = 0; -uint32_t ia3_128::BRC_X0 = 0; -uint32_t ia3_128::BRC_X1 = 0; -uint32_t ia3_128::BRC_X2 = 0; -uint32_t ia3_128::BRC_X3 = 0; +uint32_t ia3_128::lfsr_s0 = 0; +uint32_t ia3_128::lfsr_s1 = 0; +uint32_t ia3_128::lfsr_s2 = 0; +uint32_t ia3_128::lfsr_s3 = 0; +uint32_t ia3_128::lfsr_s4 = 0; +uint32_t ia3_128::lfsr_s5 = 0; +uint32_t ia3_128::lfsr_s6 = 0; +uint32_t ia3_128::lfsr_s7 = 0; +uint32_t ia3_128::lfsr_s8 = 0; +uint32_t ia3_128::lfsr_s9 = 0; +uint32_t ia3_128::lfsr_s10 = 0; +uint32_t ia3_128::lfsr_s11 = 0; +uint32_t ia3_128::lfsr_s12 = 0; +uint32_t ia3_128::lfsr_s13 = 0; +uint32_t ia3_128::lfsr_s14 = 0; +uint32_t ia3_128::lfsr_s15 = 0; +uint32_t ia3_128::f_r1 = 0; +uint32_t ia3_128::f_r2 = 0; +uint32_t ia3_128::brc_x0 = 0; +uint32_t ia3_128::brc_x1 = 0; +uint32_t ia3_128::brc_x2 = 0; +uint32_t ia3_128::brc_x3 = 0; int ia3_128::encrypt(const uint8_t algo_id, const unsigned char* knas_enc, @@ -105,103 +105,147 @@ int ia3_128::decrypt(const uint8_t algo_id, cyphered, cyphered_length, payload, payload_length); } -void ia3_128::zuc_eea3(const uint8_t* CK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint8_t* C) { - loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: knas_enc", CK, KEY_SIZE); - loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: payload", M, LENGTH / 8); - loggers::get_instance().log(">>> ia3_128::zuc_eea3: count: %u", COUNT); - loggers::get_instance().log(">>> ia3_128::zuc_eea3: bearer: %d", BEARER); - loggers::get_instance().log(">>> ia3_128::zuc_eea3: direction: %d", DIRECTION); +int ia3_128::mac(const uint8_t algo_id, + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length) { + loggers::get_instance().log_to_hexa(">>> ia3_128::mac: knas_int", knas_int, KEY_SIZE); + loggers::get_instance().log(">>> ia3_128::mac: payload_length: %d", payload_length); + loggers::get_instance().log_to_hexa(">>> ia3_128::mac: payload", payload, payload_length); + loggers::get_instance().log(">>> ia3_128::mac: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia3_128::mac: count: %u", count); + loggers::get_instance().log(">>> ia3_128::mac: bearer: %d", bearer); + loggers::get_instance().log(">>> ia3_128::mac: direction: %d", direction); - uint32_t *z, L, L8, i; - uint8_t IV[KEY_SIZE]; - uint32_t lastbits = (8-(LENGTH%8))%8; + // Input validation + if (!knas_int || !payload || !mac || !mac_length) { + loggers::get_instance().error("ia3_128::mac: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia3_128::mac: Wrong payload length"); + *mac = nullptr; + *mac_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *mac = static_cast(std::malloc(4)); + if (!*mac) { + loggers::get_instance().error("ia3_128::mac: Failed to allocate memory"); + return -1; + } + *mac_length = 4; + uint32_t wmac = 0; + zuc_eia3(knas_int, count, bearer, direction, payload_length * 8, payload, &wmac); + (*mac)[0] = (wmac >> 24) & 0xFF; + (*mac)[1] = (wmac >> 16) & 0xFF; + (*mac)[2] = (wmac >> 8) & 0xFF; + (*mac)[3] = wmac & 0xFF; + loggers::get_instance().log_to_hexa("ia3_128::mac: mac: ", *mac, *mac_length); + + loggers::get_instance().log("<<< ia3_128::mac: ret: 0"); + return 0; +} + +void ia3_128::zuc_eea3(const uint8_t* p_knas_enc, const uint32_t count, const uint32_t bearer, const uint32_t direction, const uint32_t payload_length, const uint8_t* payload, uint8_t* ciphered) { + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: knas_enc", p_knas_enc, KEY_SIZE); + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: payload", payload, payload_length / 8); + loggers::get_instance().log(">>> ia3_128::zuc_eea3: count: %u", count); + loggers::get_instance().log(">>> ia3_128::zuc_eea3: bearer: %d", bearer); + loggers::get_instance().log(">>> ia3_128::zuc_eea3: direction: %d", direction); + + uint32_t *z, lenght, lenght_in_bytes, i; + uint8_t iv[KEY_SIZE]; + uint32_t lastbits = (8-(payload_length%8))%8; - L = (LENGTH+31)/32; - z = static_cast(std::malloc(L*sizeof(uint32_t))); + lenght = (payload_length+31)/32; + z = static_cast(std::malloc(lenght*sizeof(uint32_t))); - L8 = (LENGTH+7)/8; + lenght_in_bytes = (payload_length+7)/8; - IV[0] = (COUNT>>24) & 0xFF; - IV[1] = (COUNT>>16) & 0xFF; - IV[2] = (COUNT>>8) & 0xFF; - IV[3] = COUNT & 0xFF; + iv[0] = (count>>24) & 0xFF; + iv[1] = (count>>16) & 0xFF; + iv[2] = (count>>8) & 0xFF; + iv[3] = count & 0xFF; - IV[4] = ((BEARER << 3) | ((DIRECTION&1)<<2)) & 0xFC; - IV[5] = 0; - IV[6] = 0; - IV[7] = 0; + iv[4] = ((bearer << 3) | ((direction&1)<<2)) & 0xFC; + iv[5] = 0; + iv[6] = 0; + iv[7] = 0; - IV[8] = IV[0]; - IV[9] = IV[1]; - IV[10] = IV[2]; - IV[11] = IV[3]; + iv[8] = iv[0]; + iv[9] = iv[1]; + iv[10] = iv[2]; + iv[11] = iv[3]; - IV[12] = IV[4]; - IV[13] = IV[5]; - IV[14] = IV[6]; - IV[15] = IV[7]; - loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: IV", IV, KEY_SIZE); + iv[12] = iv[4]; + iv[13] = iv[5]; + iv[14] = iv[6]; + iv[15] = iv[7]; + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: iv", iv, KEY_SIZE); - ZUC(CK, IV, z, L); - loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: z", (uint8_t*)z, L*sizeof(uint32_t)); + zuc(p_knas_enc, iv, z, lenght); + loggers::get_instance().log_to_hexa(">>> ia3_128::zuc_eea3: z", (uint8_t*)z, lenght*sizeof(uint32_t)); - for (i=0; i> (3-i%4)*8) & 0xff); + for (i=0; i> (3-i%4)*8) & 0xff); } - /* - * Issues #3349 - * Valgrind memcheck: Invalid read & write: Add {}. - */ - /* zero last bits of data in case its length is not word-aligned (32 bits) - this is an addition to the C reference code, which did not handle it */ + this is an addition to the ciphered reference code, which did not handle it */ if (lastbits) { - i--; - C[i] &= 0x100 - (1<>24) & 0xFF; - IV[1] = (COUNT>>16) & 0xFF; - IV[2] = (COUNT>>8) & 0xFF; - IV[3] = COUNT & 0xFF; + iv[0] = (count>>24) & 0xFF; + iv[1] = (count>>16) & 0xFF; + iv[2] = (count>>8) & 0xFF; + iv[3] = count & 0xFF; - IV[4] = (BEARER << 3) & 0xF8; - IV[5] = IV[6] = IV[7] = 0; + iv[4] = (bearer << 3) & 0xF8; + iv[5] = iv[6] = iv[7] = 0; - IV[8] = ((COUNT>>24) & 0xFF) ^ ((DIRECTION&1)<<7); - IV[9] = (COUNT>>16) & 0xFF; - IV[10] = (COUNT>>8) & 0xFF; - IV[11] = COUNT & 0xFF; + iv[8] = ((count>>24) & 0xFF) ^ ((direction&1)<<7); + iv[9] = (count>>16) & 0xFF; + iv[10] = (count>>8) & 0xFF; + iv[11] = count & 0xFF; - IV[12] = IV[4]; - IV[13] = IV[5]; - IV[14] = IV[6] ^ ((DIRECTION&1)<<7); - IV[15] = IV[7]; + iv[12] = iv[4]; + iv[13] = iv[5]; + iv[14] = iv[6] ^ ((direction&1)<<7); + iv[15] = iv[7]; - N = LENGTH + 64; - L = (N + 31) / 32; - z = static_cast(std::malloc(L*sizeof(uint32_t))); + N = payload_length + 64; + lenght = (N + 31) / 32; + z = static_cast(std::malloc(lenght*sizeof(uint32_t))); - ZUC(IK, IV, z, L); + zuc(p_knas_int, iv, z, lenght); T = 0; - for (i=0; i> (31 - k))) & 0x7FFFFFFF) - inline void LFSRWithInitialisationMode(uint32_t u) { + inline void lfsr_with_initialisation_mode(uint32_t u) { uint32_t f, v; - f = LFSR_S0; + f = lfsr_s0; - v = MulByPow2(LFSR_S0, 8); + v = MulByPow2(lfsr_s0, 8); f = AddM(f, v); - v = MulByPow2(LFSR_S4, 20); + v = MulByPow2(lfsr_s4, 20); f = AddM(f, v); - v = MulByPow2(LFSR_S10, 21); + v = MulByPow2(lfsr_s10, 21); f = AddM(f, v); - v = MulByPow2(LFSR_S13, 17); + v = MulByPow2(lfsr_s13, 17); f = AddM(f, v); - v = MulByPow2(LFSR_S15, 15); + v = MulByPow2(lfsr_s15, 15); f = AddM(f, v); f = AddM(f, u); /* update the state */ - LFSR_S0 = LFSR_S1; - LFSR_S1 = LFSR_S2; - LFSR_S2 = LFSR_S3; - LFSR_S3 = LFSR_S4; - LFSR_S4 = LFSR_S5; - LFSR_S5 = LFSR_S6; - LFSR_S6 = LFSR_S7; - LFSR_S7 = LFSR_S8; - LFSR_S8 = LFSR_S9; - LFSR_S9 = LFSR_S10; - LFSR_S10 = LFSR_S11; - LFSR_S11 = LFSR_S12; - LFSR_S12 = LFSR_S13; - LFSR_S13 = LFSR_S14; - LFSR_S14 = LFSR_S15; - LFSR_S15 = f; + lfsr_s0 = lfsr_s1; + lfsr_s1 = lfsr_s2; + lfsr_s2 = lfsr_s3; + lfsr_s3 = lfsr_s4; + lfsr_s4 = lfsr_s5; + lfsr_s5 = lfsr_s6; + lfsr_s6 = lfsr_s7; + lfsr_s7 = lfsr_s8; + lfsr_s8 = lfsr_s9; + lfsr_s9 = lfsr_s10; + lfsr_s10 = lfsr_s11; + lfsr_s11 = lfsr_s12; + lfsr_s12 = lfsr_s13; + lfsr_s13 = lfsr_s14; + lfsr_s14 = lfsr_s15; + lfsr_s15 = f; }; /* LFSR with work mode */ - inline void LFSRWithWorkMode(void) { + inline void lfsr_with_work_mode(void) { uint32_t f, v; - f = LFSR_S0; + f = lfsr_s0; - v = MulByPow2(LFSR_S0, 8); + v = MulByPow2(lfsr_s0, 8); f = AddM(f, v); - v = MulByPow2(LFSR_S4, 20); + v = MulByPow2(lfsr_s4, 20); f = AddM(f, v); - v = MulByPow2(LFSR_S10, 21); + v = MulByPow2(lfsr_s10, 21); f = AddM(f, v); - v = MulByPow2(LFSR_S13, 17); + v = MulByPow2(lfsr_s13, 17); f = AddM(f, v); - v = MulByPow2(LFSR_S15, 15); + v = MulByPow2(lfsr_s15, 15); f = AddM(f, v); /* update the state */ - LFSR_S0 = LFSR_S1; - LFSR_S1 = LFSR_S2; - LFSR_S2 = LFSR_S3; - LFSR_S3 = LFSR_S4; - LFSR_S4 = LFSR_S5; - LFSR_S5 = LFSR_S6; - LFSR_S6 = LFSR_S7; - LFSR_S7 = LFSR_S8; - LFSR_S8 = LFSR_S9; - LFSR_S9 = LFSR_S10; - LFSR_S10 = LFSR_S11; - LFSR_S11 = LFSR_S12; - LFSR_S12 = LFSR_S13; - LFSR_S13 = LFSR_S14; - LFSR_S14 = LFSR_S15; - LFSR_S15 = f; + lfsr_s0 = lfsr_s1; + lfsr_s1 = lfsr_s2; + lfsr_s2 = lfsr_s3; + lfsr_s3 = lfsr_s4; + lfsr_s4 = lfsr_s5; + lfsr_s5 = lfsr_s6; + lfsr_s6 = lfsr_s7; + lfsr_s7 = lfsr_s8; + lfsr_s8 = lfsr_s9; + lfsr_s9 = lfsr_s10; + lfsr_s10 = lfsr_s11; + lfsr_s11 = lfsr_s12; + lfsr_s12 = lfsr_s13; + lfsr_s13 = lfsr_s14; + lfsr_s14 = lfsr_s15; + lfsr_s15 = f; }; - /* BitReorganization */ - inline void BitReorganization(void) { - BRC_X0 = ((LFSR_S15 & 0x7FFF8000) << 1) | (LFSR_S14 & 0xFFFF); - BRC_X1 = ((LFSR_S11 & 0xFFFF) << 16) | (LFSR_S9 >> 15); - BRC_X2 = ((LFSR_S7 & 0xFFFF) << 16) | (LFSR_S5 >> 15); - BRC_X3 = ((LFSR_S2 & 0xFFFF) << 16) | (LFSR_S0 >> 15); + /* bit_reorganization */ + inline void bit_reorganization(void) { + brc_x0 = ((lfsr_s15 & 0x7FFF8000) << 1) | (lfsr_s14 & 0xFFFF); + brc_x1 = ((lfsr_s11 & 0xFFFF) << 16) | (lfsr_s9 >> 15); + brc_x2 = ((lfsr_s7 & 0xFFFF) << 16) | (lfsr_s5 >> 15); + brc_x3 = ((lfsr_s2 & 0xFFFF) << 16) | (lfsr_s0 >> 15); }; #define ROT(a, k) (((a) << k) | ((a) >> (32 - k))) @@ -287,17 +316,17 @@ private: inline uint32_t F(void) { uint32_t W, W1, W2, u, v; - W = (BRC_X0 ^ F_R1) + F_R2; - W1 = F_R1 + BRC_X1; - W2 = F_R2 ^ BRC_X2; + W = (brc_x0 ^ f_r1) + f_r2; + W1 = f_r1 + brc_x1; + W2 = f_r2 ^ brc_x2; u = L1((W1 << 16) | (W2 >> 16)); v = L2((W2 << 16) | (W1 >> 16)); - F_R1 = MAKEU32(S0[u >> 24], S1[(u >> 16) & 0xFF], - S0[(u >> 8) & 0xFF], S1[u & 0xFF]); - F_R2 = MAKEU32(S0[v >> 24], S1[(v >> 16) & 0xFF], - S0[(v >> 8) & 0xFF], S1[v & 0xFF]); + f_r1 = MAKEU32(s0[u >> 24], s1[(u >> 16) & 0xFF], + s0[(u >> 8) & 0xFF], s1[u & 0xFF]); + f_r2 = MAKEU32(s0[v >> 24], s1[(v >> 16) & 0xFF], + s0[(v >> 8) & 0xFF], s1[v & 0xFF]); return W; }; @@ -308,90 +337,90 @@ private: uint32_t w, nCount; /* expand key */ - LFSR_S0 = MAKEU31(k[0], EK_d[0], iv[0]); - LFSR_S1 = MAKEU31(k[1], EK_d[1], iv[1]); - LFSR_S2 = MAKEU31(k[2], EK_d[2], iv[2]); - LFSR_S3 = MAKEU31(k[3], EK_d[3], iv[3]); - LFSR_S4 = MAKEU31(k[4], EK_d[4], iv[4]); - LFSR_S5 = MAKEU31(k[5], EK_d[5], iv[5]); - LFSR_S6 = MAKEU31(k[6], EK_d[6], iv[6]); - LFSR_S7 = MAKEU31(k[7], EK_d[7], iv[7]); - LFSR_S8 = MAKEU31(k[8], EK_d[8], iv[8]); - LFSR_S9 = MAKEU31(k[9], EK_d[9], iv[9]); - LFSR_S10 = MAKEU31(k[10], EK_d[10], iv[10]); - LFSR_S11 = MAKEU31(k[11], EK_d[11], iv[11]); - LFSR_S12 = MAKEU31(k[12], EK_d[12], iv[12]); - LFSR_S13 = MAKEU31(k[13], EK_d[13], iv[13]); - LFSR_S14 = MAKEU31(k[14], EK_d[14], iv[14]); - LFSR_S15 = MAKEU31(k[15], EK_d[15], iv[15]); - - /* set F_R1 and F_R2 to zero */ - F_R1 = 0; - F_R2 = 0; + lfsr_s0 = MAKEU31(k[0], EK_d[0], iv[0]); + lfsr_s1 = MAKEU31(k[1], EK_d[1], iv[1]); + lfsr_s2 = MAKEU31(k[2], EK_d[2], iv[2]); + lfsr_s3 = MAKEU31(k[3], EK_d[3], iv[3]); + lfsr_s4 = MAKEU31(k[4], EK_d[4], iv[4]); + lfsr_s5 = MAKEU31(k[5], EK_d[5], iv[5]); + lfsr_s6 = MAKEU31(k[6], EK_d[6], iv[6]); + lfsr_s7 = MAKEU31(k[7], EK_d[7], iv[7]); + lfsr_s8 = MAKEU31(k[8], EK_d[8], iv[8]); + lfsr_s9 = MAKEU31(k[9], EK_d[9], iv[9]); + lfsr_s10 = MAKEU31(k[10], EK_d[10], iv[10]); + lfsr_s11 = MAKEU31(k[11], EK_d[11], iv[11]); + lfsr_s12 = MAKEU31(k[12], EK_d[12], iv[12]); + lfsr_s13 = MAKEU31(k[13], EK_d[13], iv[13]); + lfsr_s14 = MAKEU31(k[14], EK_d[14], iv[14]); + lfsr_s15 = MAKEU31(k[15], EK_d[15], iv[15]); + + /* set f_r1 and f_r2 to zero */ + f_r1 = 0; + f_r2 = 0; nCount = 32; while (nCount > 0) { - BitReorganization(); + bit_reorganization(); w = F(); - LFSRWithInitialisationMode(w >> 1); + lfsr_with_initialisation_mode(w >> 1); nCount --; } }; inline void zuc_generate_key_stream(uint32_t* pKeystream, uint32_t KeystreamLen) { int i; - BitReorganization(); + bit_reorganization(); F(); /* discard the output of F */ - LFSRWithWorkMode(); + lfsr_with_work_mode(); for (i = 0; i < KeystreamLen; i ++) { - BitReorganization(); - pKeystream[i] = F() ^ BRC_X3; - LFSRWithWorkMode(); + bit_reorganization(); + pKeystream[i] = F() ^ brc_x3; + lfsr_with_work_mode(); } }; /* The ZUC algorithm, see ref. [3]*/ - inline void ZUC(const uint8_t* k, uint8_t* iv, uint32_t* ks, uint32_t len) { + inline void zuc(const uint8_t* k, uint8_t* iv, uint32_t* ks, uint32_t len) { /* The initialization of ZUC, see page 17 of ref. [3]*/ zuc_initialize(k, iv); /* The procedure of generating keystream of ZUC, see page 18 of ref. [3]*/ zuc_generate_key_stream(ks, len); }; - inline uint32_t GET_WORD(const uint32_t* DATA, const uint32_t i) { - uint32_t WORD, ti; + inline uint32_t get_word(const uint32_t* p_data, const uint32_t i) { + uint32_t word, ti; ti = i % 32; if (ti == 0) - WORD = DATA[i/32]; + word = p_data[i/32]; else - WORD = (DATA[i/32]<>(32-ti)); - return WORD; + word = (p_data[i/32]<>(32-ti)); + return word; }; - inline uint8_t GET_BIT(const uint8_t* DATA, const uint32_t i) { return (DATA[i/8] & (1<<(7-(i%8)))) ? 1 : 0; }; + inline uint8_t get_bit(const uint8_t* p_data, const uint32_t i) { return (p_data[i/8] & (1<<(7-(i%8)))) ? 1 : 0; }; /* - * CK: ciphering key - * COUNT: frame counter - * BEARER: radio bearer - * DIRECTION - * LENGTH: length of the frame in bits - * M: original message (input) - * C: processed message (output) + * p_knas_enc: ciphering key + * count: frame counter + * bearer: radio bearer + * direction + * payload_length: length of the frame in bits + * payload: original message (input) + * ciphered: processed message (output) */ - void zuc_eea3(const uint8_t* CK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint8_t* C); + void zuc_eea3(const uint8_t* p_knas_enc, const uint32_t count, const uint32_t bearer, const uint32_t direction, const uint32_t payload_length, const uint8_t* payload, uint8_t* ciphered); /* - * IK: integrity key - * COUNT: frame counter - * BEARER: radio bearer - * DIRECTION - * LENGTH: length of the frame in bits - * M: original message (input) - * C: processed message (output) + * p_knas_int: integrity key + * count: frame counter + * bearer: radio bearer + * direction + * payload_length: length of the frame in bits + * payload: original message (input) + * mac: computed integrity protection (output) */ - void zuc_eia3(const uint8_t* IK, const uint32_t COUNT, const uint32_t BEARER, const uint32_t DIRECTION, const uint32_t LENGTH, const uint8_t* M, uint32_t* MAC); + void zuc_eia3(const uint8_t* p_knas_int, const uint32_t count, const uint32_t bearer, const uint32_t direction, const uint32_t payload_length, const uint8_t* payload, uint32_t* mac); }; diff --git a/ccsrc/Externals/module.mk b/ccsrc/Externals/module.mk index d044cda..7626f8c 100644 --- a/ccsrc/Externals/module.mk +++ b/ccsrc/Externals/module.mk @@ -7,6 +7,4 @@ sources := \ ia3_128.cc \ -# zuc.cc - includes := . diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 4c4ad7a..8af36db 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -155,6 +155,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 6c7158a..ae0fd70 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2877,8 +2877,7 @@ module NG_NAS_TestCases { /** * @desc Verify that the NAS cypher function is working correctly - 128-EEA3 (ZUC) * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture - * @see ETSI TS 133 401 V18.3.0 (2025-04) C.1.2 Test Set 2 - * @see https://asecuritysite.com/symmetric/snow + * @see ETSI TS 133 401 V18.3.0 (2025-04) B.1.4 128-EEA3 */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2909,6 +2908,32 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 + /** + * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI3 (ZUC) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) B.2.4 128-EIA3 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_ik := 'c9e6cec4607c72db000aefa88385ab0a'O; // Integrity key + var NasCount_Type v_nas_count := 'a94059da'O; // NAS Count + var bitstring v_nas_enc_alg := '0011'B ; // 128-NEA3 128-bit ZUC algorithm + var B5_Type v_bearer_id := '01010'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '983b41d47d780c9e1ad11d7eb70391b1de0b35da2dc62f83e7b78d6306ca0ea07e941b7be91348f9fcb170e2217fecd97f9f68adb16e5d7d21e569d280ed775cebde3f4093c5388100'O; + var O4_Type v_mac_text := '24a842b3'O; // Expected mac text + + var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 1) + if (not(match(v_mac_text_computed, v_mac_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 + } // End of group fiveG_AKA_Crypto_Functions }// End of module NG_NAS_TestCases -- GitLab From 4864f43d2011dfbbc3294ddf50182e0e57e92daa Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 31 Dec 2025 11:02:59 +0100 Subject: [PATCH 031/151] Review SNOW 3G & ZUC code --- ccsrc/Externals/NG_security_ext.cc | 48 ++++---- ccsrc/Externals/ia1_128.cc | 158 +++++++++++++++++++++++++- ccsrc/Externals/ia1_128.hh | 72 +++++++++++- ccsrc/Externals/ia2_128.cc | 46 ++++++++ ccsrc/Externals/ia2_128.hh | 28 +++++ ccsrc/Externals/ia3_128.cc | 88 +++++++++----- ccsrc/Externals/ia3_128.hh | 110 +++++++++--------- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 8 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 77 +++++++++++++ 9 files changed, 515 insertions(+), 120 deletions(-) diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index 613edbe..96465ab 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -61,32 +61,32 @@ OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_encoded_nas_pdu, return p_encoded_nas_pdu; // no integrity protection } else if (bit2int(p_integrity_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia1_128 selected"); - // ia1_128 enc; - // result = enc.mac( - // bit2int(p_integrity_algorithm), - // static_cast(bit2oct(p_knas_int)), - // nas_count, - // bit2int(p_bearer_id), - // p_direction, - // static_cast(p_encoded_nas_pdu), - // p_encoded_nas_pdu.lengthof(), - // &mac, - // &mac_length - // ); + ia1_128 enc; + result = enc.mac( + bit2int(p_integrity_algorithm), + static_cast(bit2oct(p_knas_int)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &mac, + &mac_length + ); } else if (bit2int(p_integrity_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia2_128 selected"); - // ia2_128 enc; - // result = enc.encrypt( - // bit2int(p_integrity_algorithm), - // static_cast(bit2oct(p_knas_int)), - // nas_count, - // bit2int(p_bearer_id), - // p_direction, - // static_cast(p_encoded_nas_pdu), - // p_encoded_nas_pdu.lengthof(), - // &mac, - // &mac_length - // ); + ia2_128 enc; + result = enc.encrypt( + bit2int(p_integrity_algorithm), + static_cast(bit2oct(p_knas_int)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &mac, + &mac_length + ); } else if (bit2int(p_integrity_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia3_128 selected"); ia3_128 enc; diff --git a/ccsrc/Externals/ia1_128.cc b/ccsrc/Externals/ia1_128.cc index cb20ae1..3dd8592 100644 --- a/ccsrc/Externals/ia1_128.cc +++ b/ccsrc/Externals/ia1_128.cc @@ -21,6 +21,11 @@ namespace { constexpr size_t IV_SIZE = 16; // Initialization vector size } +void ia1_128::reset() { + loggers::get_instance().log("ia1_128::reset"); + std::memset(&_ctx, 0, sizeof(_ctx)); +} + int ia1_128::encrypt(const uint8_t algo_id, const unsigned char* knas_enc, const uint32_t count, @@ -57,7 +62,8 @@ int ia1_128::encrypt(const uint8_t algo_id, return -1; } snow3g_context_t ctx; - snow3g_initialize(count, bearer, direction, (const char *)knas_enc, &ctx); + ctx.ciphering = true; + snow3g_initialize(count, bearer, direction, knas_enc, &ctx); snow3g_generate(payload_length, payload, *cyphered, &ctx); *cyphered_length = payload_length; loggers::get_instance().log("ia1_128::encrypt: cyphered_length: %d", *cyphered_length); @@ -88,7 +94,118 @@ int ia1_128::decrypt(const uint8_t algo_id, cyphered, cyphered_length, payload, payload_length); } -int ia1_128::snow3g_initialize(uint32_t count, uint8_t bearer, uint8_t direction, const char *knas_enc, snow3g_context_t *ctx) { +int ia1_128::mac(const uint8_t algo_id, + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length) { + loggers::get_instance().log_to_hexa(">>> ia1_128::mac: knas_int", knas_int, KEY_SIZE); + loggers::get_instance().log(">>> ia1_128::mac: payload_length: %d", payload_length); + loggers::get_instance().log_to_hexa(">>> ia1_128::mac: payload", payload, payload_length); + loggers::get_instance().log(">>> ia1_128::mac: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia1_128::mac: count: %u", count); + loggers::get_instance().log(">>> ia1_128::mac: bearer: %d", bearer); + loggers::get_instance().log(">>> ia1_128::mac: direction: %d", direction); + + // Input validation + if (!knas_int || !payload || !mac || !mac_length) { + loggers::get_instance().error("ia1_128::mac: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia1_128::mac: Wrong payload length"); + *mac = nullptr; + *mac_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *mac = static_cast(std::malloc(4)); + if (!*mac) { + loggers::get_instance().error("ia1_128::mac: Failed to allocate memory"); + return -1; + } + *mac_length = 4; + + snow3g_context_t ctx; + ctx.ciphering = false; + snow3g_initialize(count, bearer, direction, knas_int, &ctx); + + uint32_t z[5] = {0}; + snow3g_generate(5, (uint32_t*)z, &ctx); + loggers::get_instance().log_to_hexa("ia1_128::mac: z: ", (const unsigned char*)z, 5 * sizeof(uint32_t)); + + uint64_t p = (uint64_t)z[0] << 32 | (uint64_t)z[1]; + uint64_t q = (uint64_t)z[2] << 32 | (uint64_t)z[3]; + + uint32_t d; + uint64_t length = payload_length * 8; // Length in bits + loggers::get_instance().log("ia1_128::mac: length: %ld", length); + if ((length % 64) == 0) + d = (length>>6) + 1; + else + d = (length>>6) + 2; + loggers::get_instance().log("ia1_128::mac: d: %u", d); + uint64_t c = 0x1b; + + uint64_t eval = 0; + uint64_t v = 0; + for (uint64_t i = 0; i < d - 2; i++) { + v = eval ^ ((uint64_t)payload[8*i ]<<56 | (uint64_t)payload[8*i+1] << 48 | + (uint64_t)payload[8*i+2]<<40 | (uint64_t)payload[8*i+3] << 32 | + (uint64_t)payload[8*i+4]<<24 | (uint64_t)payload[8*i+5] << 16 | + (uint64_t)payload[8*i+6]<< 8 | (uint64_t)payload[8*i+7] + ); + eval = mul64(v, p, c); + } + loggers::get_instance().log_to_hexa("ia1_128::mac: eval: ", (const unsigned char*)&eval, sizeof(uint64_t)); + + uint64_t rem = length % 64; + if (rem == 0) { + rem = 64; + } + loggers::get_instance().log("ia1_128::mac:rem: %d", rem); + uint64_t m_d_2 = 0; + uint8_t i = 0; + while (rem > 7) { + m_d_2 |= (uint64_t)payload[8*(d-2)+i] << (8*(7-i)); + rem -= 8; + i++; + } + if (rem > 0) { + m_d_2 |= (uint64_t)(payload[8*(d-2)+i] & mask8bit(rem)) << (8*(7-i)); + } + loggers::get_instance().log_to_hexa("ia1_128::mac: m_d_2: ", (const unsigned char*)&m_d_2, sizeof(uint64_t)); + + v = eval ^ m_d_2; + eval = mul64(v, p, c); + loggers::get_instance().log_to_hexa("ia1_128::mac: eval: ", (const unsigned char*)&eval, sizeof(uint64_t)); + + /* for d-1 */ + eval ^= length; + loggers::get_instance().log_to_hexa("ia1_128::mac: eval: ", (const unsigned char*)&eval, sizeof(uint64_t)); + + /* Multiply by q */ + eval = mul64(eval, q, c); + loggers::get_instance().log_to_hexa("ia1_128::mac: eval: ", (const unsigned char*)&eval, sizeof(uint64_t)); + + /* XOR with z_5: this is a modification to the reference C code, + which forgot to XOR z[5] */ + for (i = 0; i < 4; i++) { + (*mac)[i] = ((eval >> (56-(i*8))) ^ (z[4] >> (24-(i*8)))) & 0xff; + } + loggers::get_instance().log_to_hexa("ia1_128::mac: mac: ", *mac, *mac_length); + + loggers::get_instance().log("<<< ia1_128::mac: ret: 0"); + return 0; +} + +int ia1_128::snow3g_initialize(const uint32_t count, const uint8_t bearer, const uint8_t direction, const unsigned char *knas_enc, snow3g_context_t *ctx) { loggers::get_instance().log_to_hexa(">>> ia1_128::snow3g_initialize: knas_enc", (const unsigned char*)knas_enc, 16); loggers::get_instance().log(">>> ia1_128::snow3g_initialize: count: %u", count); loggers::get_instance().log(">>> ia1_128::snow3g_initialize: bearer: %d", bearer); @@ -108,9 +225,15 @@ int ia1_128::snow3g_initialize(uint32_t count, uint8_t bearer, uint8_t direction snow_key.key[0] = WORD_128(knas_enc, 3); snow_key.iv[3] = count; - snow_key.iv[2] = ((bearer & 0x1F) << 27) | ((direction & 0x01) << 26); - snow_key.iv[1] = snow_key.iv[3]; - snow_key.iv[0] = snow_key.iv[2]; + if (ctx->ciphering) { + snow_key.iv[2] = ((bearer & 0x1F) << 27) | ((direction & 0x01) << 26); + snow_key.iv[1] = snow_key.iv[3]; + snow_key.iv[0] = snow_key.iv[2]; + } else { + snow_key.iv[2] = ((bearer & 0x1F) << 27); + snow_key.iv[1] = count ^ ( direction << 31 ); + snow_key.iv[0] = ((bearer & 0x1F) << 27) ^ (direction << 15); + } loggers::get_instance().log_to_hexa("ia1_128::snow3g_initialize: snow_key.key", (const unsigned char*)snow_key.key, 4 * sizeof(uint32_t)); loggers::get_instance().log_to_hexa("ia1_128::snow3g_initialize: snow_key.iv", (const unsigned char*)snow_key.iv, 4 * sizeof(uint32_t)); @@ -162,3 +285,28 @@ int ia1_128::snow3g_generate(size_t nb_byte, const unsigned char *in, unsigned c loggers::get_instance().log_to_hexa("<<< SNOW: out", (const unsigned char*)out, nb_byte); return 0; } + +int ia1_128::snow3g_generate(size_t nb, uint32_t* out, snow3g_context_t* ctx) { + loggers::get_instance().log(">>> snow3g_generate: nb: %u", nb); + + // Sanity checks + if (ctx == NULL) { + loggers::get_instance().error("snow3g_generate: Wrong parameters"); + return -1; + } + + size_t i = 0; + + /* init */ + clock_fsm(ctx); + lfsr_keystream(ctx); + + for (i = 0; i < nb; i++) { + uint32_t f; + out[i] = clock_fsm(ctx) ^ ctx->lfsr[0]; + lfsr_keystream(ctx); + } + + loggers::get_instance().log_to_hexa("<<< snow3g_generate: out", (const unsigned char*)out, nb); + return 0; +} diff --git a/ccsrc/Externals/ia1_128.hh b/ccsrc/Externals/ia1_128.hh index b8cbdf7..1f32f86 100644 --- a/ccsrc/Externals/ia1_128.hh +++ b/ccsrc/Externals/ia1_128.hh @@ -59,6 +59,7 @@ class ia1_128 { typedef struct snow_ctx_st { uint32_t lfsr[SNOW_KEY_SIZE]; struct fsm_st fsm; + bool ciphering; } snow3g_context_t; public: @@ -153,6 +154,35 @@ public: unsigned char** payload, uint32_t* payload_length); + /** + * @brief Compute NAS integrity protection using SNOW 3G algorithm + * + * This method computes the integrity protection using the SNOW 3G algorithm. + * + * @param algo_id Algorithm identifier (should be 3 for SNOW 3G) + * @param knas_int Pointer to the 16-byte NAS integrity key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to pointer that will receive the decrypted data (caller must free) + * @param payload_length Pointer to variable that will receive the decrypted data length + * @param mac Pointer to the mac to decrypt + * @param mac_length Length of the mac in bytes + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for payload + * @note payload_length will be equal to cyphered_length for stream ciphers + */ + int mac(const uint8_t algo_id, + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length); + private: const uint32_t S1_T0[256] = { 0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U, @@ -824,9 +854,41 @@ private: 0x9EE2651CU, 0x86ED25D1U, 0xAEFCE52FU, 0xB6F3A5E2U, }; - inline uint32_t snow_s1(uint32_t in) { return S1_T0[BYTE32(in, 3)] ^ S1_T1[BYTE32(in, 2)] ^ S1_T2[BYTE32(in, 1)] ^ S1_T3[BYTE32(in, 0)]; }; + snow3g_context_t _ctx; + + void reset(); + + inline uint32_t snow_s1(const uint32_t in) { return S1_T0[BYTE32(in, 3)] ^ S1_T1[BYTE32(in, 2)] ^ S1_T2[BYTE32(in, 1)] ^ S1_T3[BYTE32(in, 0)]; }; + + inline uint32_t snow_s2(const uint32_t in) { return S2_T0[BYTE32(in, 3)] ^ S2_T1[BYTE32(in, 2)] ^ S2_T2[BYTE32(in, 1)] ^ S2_T3[BYTE32(in, 0)]; }; + + inline uint64_t mul64(uint64_t V, uint64_t P, uint64_t c) { + uint64_t result = 0; + for (int8_t i = 0; i < 64; i++) { + if ((P >> i ) & 0x1) { + result ^= mul64x_pow(V, i, c); + } + } + return result; + }; + + inline uint64_t mul64x_pow(uint64_t V, uint8_t i, uint64_t c) { + if (i == 0) { + return V; + } else { + return mul64x(mul64x_pow(V, i-1, c) , c); + } + }; + + inline uint64_t mul64x(uint64_t V, uint64_t c) { + if (V & 0x8000000000000000) { + return (V << 1) ^ c; + } else { + return V << 1; + } + }; - inline uint32_t snow_s2(uint32_t in) { return S2_T0[BYTE32(in, 3)] ^ S2_T1[BYTE32(in, 2)] ^ S2_T2[BYTE32(in, 1)] ^ S2_T3[BYTE32(in, 0)]; }; + inline uint8_t mask8bit(int n) { return 0xFF ^ ((1<<(8-n)) - 1); }; /* Clocking operations */ inline void lfsr_init(uint32_t f, snow3g_context_t *ctx) { @@ -953,7 +1015,7 @@ private: * @param key 16-byte encryption key * @param iv 16-byte initialization vector */ - int snow3g_initialize(uint32_t count, uint8_t bearer, uint8_t direction, const char *knas_enc, snow3g_context_t *ctx); + int snow3g_initialize(const uint32_t count, const uint8_t bearer, const uint8_t direction, const unsigned char *knas_enc, snow3g_context_t *ctx); /** * @brief Generate keystream using SNOW 3G @@ -962,5 +1024,7 @@ private: * @param keystream Output buffer for keystream * @param length Length of keystream needed in bytes */ - int snow3g_generate(size_t nb_byte, const unsigned char *in, unsigned char *out, snow3g_context_t *ctx); + int snow3g_generate(size_t nb_byte, const unsigned char* in, unsigned char* out, snow3g_context_t *ctx); + + int snow3g_generate(size_t nb_byte, uint32_t* out, snow3g_context_t *ctx); }; diff --git a/ccsrc/Externals/ia2_128.cc b/ccsrc/Externals/ia2_128.cc index d237d39..67f386d 100644 --- a/ccsrc/Externals/ia2_128.cc +++ b/ccsrc/Externals/ia2_128.cc @@ -204,6 +204,52 @@ cleanup: return ret; } +int ia2_128::mac(const uint8_t algo_id, + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length) { + loggers::get_instance().log_to_hexa(">>> ia2_128::mac: knas_int", knas_int, KEY_SIZE); + loggers::get_instance().log(">>> ia2_128::mac: payload_length: %d", payload_length); + loggers::get_instance().log_to_hexa(">>> ia2_128::mac: payload", payload, payload_length); + loggers::get_instance().log(">>> ia2_128::mac: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia2_128::mac: count: %u", count); + loggers::get_instance().log(">>> ia2_128::mac: bearer: %d", bearer); + loggers::get_instance().log(">>> ia2_128::mac: direction: %d", direction); + + // Input validation + if (!knas_int || !payload || !mac || !mac_length) { + loggers::get_instance().error("ia2_128::mac: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia2_128::mac: Wrong payload length"); + *mac = nullptr; + *mac_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *mac = static_cast(std::malloc(4)); + if (!*mac) { + loggers::get_instance().error("ia2_128::mac: Failed to allocate memory"); + return -1; + } + *mac_length = 4; + + // TODO: Implement AES CMAC computation according to 3GPP TS 33.401 + + loggers::get_instance().log_to_hexa("ia2_128::mac: mac: ", *mac, *mac_length); + + loggers::get_instance().log("<<< ia2_128::mac: ret: 0"); + return 0; +} + // ETSI TS 133 401 V18.3.0 (2025-04) Annex B.1.3 128-EEA2 void ia2_128::generate_counter_block(const uint32_t count, const uint8_t bearer, diff --git a/ccsrc/Externals/ia2_128.hh b/ccsrc/Externals/ia2_128.hh index 4c7313a..f4f6ea6 100644 --- a/ccsrc/Externals/ia2_128.hh +++ b/ccsrc/Externals/ia2_128.hh @@ -116,6 +116,34 @@ public: unsigned char** payload, uint32_t* payload_length); + /** + * @brief Compute NAS integrity protection using AES 128 CRT algorithm + * + * This method computes the integrity protection using the AES 128 CRT algorithm. + * + * @param algo_id Algorithm identifier (should be 3 for AES 128 CRT) + * @param knas_int Pointer to the 16-byte NAS integrity key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to pointer that will receive the decrypted data (caller must free) + * @param payload_length Pointer to variable that will receive the decrypted data length + * @param mac Pointer to the mac to decrypt + * @param mac_length Length of the mac in bytes + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for payload + * @note payload_length will be equal to cyphered_length for stream ciphers + */ + int mac(const uint8_t algo_id, + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length); private: /** * @brief Generates the initial counter block for AES-CTR diff --git a/ccsrc/Externals/ia3_128.cc b/ccsrc/Externals/ia3_128.cc index f9dc7e5..92dff41 100644 --- a/ccsrc/Externals/ia3_128.cc +++ b/ccsrc/Externals/ia3_128.cc @@ -23,28 +23,52 @@ namespace { constexpr size_t IV_SIZE = 16; // Initialization vector size } -uint32_t ia3_128::lfsr_s0 = 0; -uint32_t ia3_128::lfsr_s1 = 0; -uint32_t ia3_128::lfsr_s2 = 0; -uint32_t ia3_128::lfsr_s3 = 0; -uint32_t ia3_128::lfsr_s4 = 0; -uint32_t ia3_128::lfsr_s5 = 0; -uint32_t ia3_128::lfsr_s6 = 0; -uint32_t ia3_128::lfsr_s7 = 0; -uint32_t ia3_128::lfsr_s8 = 0; -uint32_t ia3_128::lfsr_s9 = 0; -uint32_t ia3_128::lfsr_s10 = 0; -uint32_t ia3_128::lfsr_s11 = 0; -uint32_t ia3_128::lfsr_s12 = 0; -uint32_t ia3_128::lfsr_s13 = 0; -uint32_t ia3_128::lfsr_s14 = 0; -uint32_t ia3_128::lfsr_s15 = 0; -uint32_t ia3_128::f_r1 = 0; -uint32_t ia3_128::f_r2 = 0; -uint32_t ia3_128::brc_x0 = 0; -uint32_t ia3_128::brc_x1 = 0; -uint32_t ia3_128::brc_x2 = 0; -uint32_t ia3_128::brc_x3 = 0; +// uint32_t ia3_128::lfsr_s0 = 0; +// uint32_t ia3_128::lfsr_s1 = 0; +// uint32_t ia3_128::lfsr_s2 = 0; +// uint32_t ia3_128::lfsr_s3 = 0; +// uint32_t ia3_128::lfsr_s4 = 0; +// uint32_t ia3_128::lfsr_s5 = 0; +// uint32_t ia3_128::lfsr_s6 = 0; +// uint32_t ia3_128::lfsr_s7 = 0; +// uint32_t ia3_128::lfsr_s8 = 0; +// uint32_t ia3_128::lfsr_s9 = 0; +// uint32_t ia3_128::lfsr_s10 = 0; +// uint32_t ia3_128::lfsr_s11 = 0; +// uint32_t ia3_128::lfsr_s12 = 0; +// uint32_t ia3_128::lfsr_s13 = 0; +// uint32_t ia3_128::lfsr_s14 = 0; +// uint32_t ia3_128::lfsr_s15 = 0; +// uint32_t ia3_128::f_r1 = 0; +// uint32_t ia3_128::f_r2 = 0; +// uint32_t ia3_128::brc_x0 = 0; +// uint32_t ia3_128::brc_x1 = 0; +// uint32_t ia3_128::brc_x2 = 0; +// uint32_t ia3_128::brc_x3 = 0; +void ia3_128::reset() { + lfsr_s0 = 0; + lfsr_s1 = 0; + lfsr_s2 = 0; + lfsr_s3 = 0; + lfsr_s4 = 0; + lfsr_s5 = 0; + lfsr_s6 = 0; + lfsr_s7 = 0; + lfsr_s8 = 0; + lfsr_s9 = 0; + lfsr_s10 = 0; + lfsr_s11 = 0; + lfsr_s12 = 0; + lfsr_s13 = 0; + lfsr_s14 = 0; + lfsr_s15 = 0; + f_r1 = 0; + f_r2 = 0; + brc_x0 = 0; + brc_x1 = 0; + brc_x2 = 0; + brc_x3 = 0; +} int ia3_128::encrypt(const uint8_t algo_id, const unsigned char* knas_enc, @@ -75,6 +99,8 @@ int ia3_128::encrypt(const uint8_t algo_id, return 0; } + reset(); + // Allocate memory for ciphertext *cyphered = static_cast(std::malloc(payload_length)); if (!*cyphered) { @@ -106,14 +132,14 @@ int ia3_128::decrypt(const uint8_t algo_id, } int ia3_128::mac(const uint8_t algo_id, - const unsigned char* knas_int, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** mac, - uint32_t* mac_length) { + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length) { loggers::get_instance().log_to_hexa(">>> ia3_128::mac: knas_int", knas_int, KEY_SIZE); loggers::get_instance().log(">>> ia3_128::mac: payload_length: %d", payload_length); loggers::get_instance().log_to_hexa(">>> ia3_128::mac: payload", payload, payload_length); @@ -135,6 +161,8 @@ int ia3_128::mac(const uint8_t algo_id, return 0; } + reset(); + // Allocate memory for ciphertext *mac = static_cast(std::malloc(4)); if (!*mac) { diff --git a/ccsrc/Externals/ia3_128.hh b/ccsrc/Externals/ia3_128.hh index 1911947..9d018cb 100644 --- a/ccsrc/Externals/ia3_128.hh +++ b/ccsrc/Externals/ia3_128.hh @@ -1,8 +1,7 @@ /** * @file ia3_128.h - * @brief 3GPP ZUC-based Encryption class header - * @author Generated for 3GPP NAS encryption - * @date 2024 + * @brief 3GPP ZUC-based Encryption & integrity protection class header + * @author Generated for 3GPP NAS encryption & integrity protection * * This class implements the 3GPP ZUC-based encryption algorithm (IA3-128) * as specified in 3GPP TS 33.401 for NAS encryption/decryption. @@ -120,14 +119,14 @@ public: * This method computes the integrity protection using the ZUC stream cipher. * * @param algo_id Algorithm identifier (should be 3 for ZUC) - * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param knas_int Pointer to the 16-byte NAS integrity key * @param count 32-bit NAS count value * @param bearer 5-bit bearer identifier (only lower 5 bits are used) * @param direction Direction bit (0 = uplink, 1 = downlink) - * @param cyphered Pointer to the ciphertext data to decrypt - * @param cyphered_length Length of the ciphertext data in bytes * @param payload Pointer to pointer that will receive the decrypted data (caller must free) * @param payload_length Pointer to variable that will receive the decrypted data length + * @param mac Pointer to the mac to decrypt + * @param mac_length Length of the mac in bytes * @return 0 on success, negative value on error * * @note The caller is responsible for freeing the memory allocated for payload @@ -140,8 +139,8 @@ public: const uint8_t direction, const unsigned char* payload, const uint32_t payload_length, - unsigned char** cyphered, - uint32_t* cyphered_length); + unsigned char** mac, + uint32_t* mac_length); private: const uint8_t s0[256] = { @@ -189,57 +188,59 @@ private: }; /* the state registers of LFSR */ - static uint32_t lfsr_s0; - static uint32_t lfsr_s1; - static uint32_t lfsr_s2; - static uint32_t lfsr_s3; - static uint32_t lfsr_s4; - static uint32_t lfsr_s5; - static uint32_t lfsr_s6; - static uint32_t lfsr_s7; - static uint32_t lfsr_s8; - static uint32_t lfsr_s9; - static uint32_t lfsr_s10; - static uint32_t lfsr_s11; - static uint32_t lfsr_s12; - static uint32_t lfsr_s13; - static uint32_t lfsr_s14; - static uint32_t lfsr_s15; + uint32_t lfsr_s0; + uint32_t lfsr_s1; + uint32_t lfsr_s2; + uint32_t lfsr_s3; + uint32_t lfsr_s4; + uint32_t lfsr_s5; + uint32_t lfsr_s6; + uint32_t lfsr_s7; + uint32_t lfsr_s8; + uint32_t lfsr_s9; + uint32_t lfsr_s10; + uint32_t lfsr_s11; + uint32_t lfsr_s12; + uint32_t lfsr_s13; + uint32_t lfsr_s14; + uint32_t lfsr_s15; /* the registers of F */ - static uint32_t f_r1; - static uint32_t f_r2; + uint32_t f_r1; + uint32_t f_r2; /* the outputs of bit_reorganization */ - static uint32_t brc_x0; - static uint32_t brc_x1; - static uint32_t brc_x2; - static uint32_t brc_x3; + uint32_t brc_x0; + uint32_t brc_x1; + uint32_t brc_x2; + uint32_t brc_x3; + + void reset(); /* c = a + b mod (2^31 - 1) */ - inline uint32_t AddM(uint32_t a, uint32_t b) { + inline uint32_t add_m(uint32_t a, uint32_t b) { uint32_t c = a + b; return (c & 0x7FFFFFFF) + (c >> 31); }; /* LFSR with initialization mode */ - #define MulByPow2(x, k) ((((x) << k) | ((x) >> (31 - k))) & 0x7FFFFFFF) + #define mul_by_pow2(x, k) ((((x) << k) | ((x) >> (31 - k))) & 0x7FFFFFFF) inline void lfsr_with_initialisation_mode(uint32_t u) { uint32_t f, v; f = lfsr_s0; - v = MulByPow2(lfsr_s0, 8); - f = AddM(f, v); - v = MulByPow2(lfsr_s4, 20); - f = AddM(f, v); - v = MulByPow2(lfsr_s10, 21); - f = AddM(f, v); - v = MulByPow2(lfsr_s13, 17); - f = AddM(f, v); - v = MulByPow2(lfsr_s15, 15); - f = AddM(f, v); + v = mul_by_pow2(lfsr_s0, 8); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s4, 20); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s10, 21); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s13, 17); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s15, 15); + f = add_m(f, v); - f = AddM(f, u); + f = add_m(f, u); /* update the state */ lfsr_s0 = lfsr_s1; @@ -265,16 +266,16 @@ private: uint32_t f, v; f = lfsr_s0; - v = MulByPow2(lfsr_s0, 8); - f = AddM(f, v); - v = MulByPow2(lfsr_s4, 20); - f = AddM(f, v); - v = MulByPow2(lfsr_s10, 21); - f = AddM(f, v); - v = MulByPow2(lfsr_s13, 17); - f = AddM(f, v); - v = MulByPow2(lfsr_s15, 15); - f = AddM(f, v); + v = mul_by_pow2(lfsr_s0, 8); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s4, 20); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s10, 21); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s13, 17); + f = add_m(f, v); + v = mul_by_pow2(lfsr_s15, 15); + f = add_m(f, v); /* update the state */ lfsr_s0 = lfsr_s1; @@ -358,8 +359,7 @@ private: f_r1 = 0; f_r2 = 0; nCount = 32; - while (nCount > 0) - { + while (nCount > 0) { bit_reorganization(); w = F(); lfsr_with_initialisation_mode(w >> 1); diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 8af36db..d6cdf54 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -151,10 +151,14 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 [GROUPS] diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index ae0fd70..c81ba4c 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2908,6 +2908,83 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 + /** + * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI1 (SNOW 3G) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.4.1 Test Set 1 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_ik := '2bd6459f82c5b300952c49104881ff48'O; // Integrity key + var NasCount_Type v_nas_count := '38a6f056'O; // NAS Count + var bitstring v_nas_enc_alg := '0001'B ; // 128-NEA3 128-bit ZUC algorithm + var B5_Type v_bearer_id := '11111'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '3332346263393861373479'O; + var O4_Type v_mac_text := '731f1165'O; // Expected mac text + + var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 0) + if (not(match(v_mac_text_computed, v_mac_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 + + /** + * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI1 (SNOW 3G) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.4.2 Test Set 2 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_ik := '7e5e94431e11d73828d739cc6ced4573'O; // Integrity key + var NasCount_Type v_nas_count := '36af6144'O; // NAS Count + var bitstring v_nas_enc_alg := '0001'B ; // 128-NEA3 128-bit ZUC algorithm + var B5_Type v_bearer_id := '11000'B; // Bearer ID (Signalling) + var octetstring v_plain_text := 'b3d3c9170a4e1632f60f861013d22d84b726b6a278d802d1eeaf1321ba5929'O; + var O4_Type v_mac_text := 'e3259f6f'O; // Expected mac text + + var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 1) + if (not(match(v_mac_text_computed, v_mac_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 + + /** + * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI1 (SNOW 3G) + * @see open5gs/tests/uint/security-test.c, security-test4 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_ik := '2bd6459f82c5b300952c49104881ff48'O; // Integrity key + var NasCount_Type v_nas_count := '38a6f056'O; // NAS Count + var bitstring v_nas_enc_alg := '0001'B ; // 128-NEA3 128-bit ZUC algorithm + var B5_Type v_bearer_id := '11111'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '3332346263393861373479'O; + var O4_Type v_mac_text := '731f1165'O; // Expected mac text + + var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 0) + if (not(match(v_mac_text_computed, v_mac_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 + /** * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI3 (ZUC) * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture -- GitLab From 7ae3a3e5ddcbc3328755c8ccb066fc2029f7b4d1 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 5 Jan 2026 09:00:29 +0100 Subject: [PATCH 032/151] Validating integrity protection with 128 AES CMAC --- NAS_ETSI.code-workspace | 12 - ccsrc/Externals/NG_security_ext.cc | 514 ++++++++++++------------- ccsrc/Externals/ia2_128.cc | 522 ++++++++++++++++---------- ccsrc/Externals/ia2_128.hh | 255 +++++++------ ccsrc/Externals/ia3_128.cc | 24 -- ccsrc/Externals/module.mk | 1 - config.mk | 2 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 7 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 48 ++- 9 files changed, 750 insertions(+), 635 deletions(-) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index 47146f7..a72cd0f 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -6,18 +6,6 @@ { "path": "../../frameworks/titan/titan.core" }, - { - "path": "../5G-AKA-simulation-in-C" - }, - { - "path": "../free5gc" - }, - { - "path": "../free5gc.util" - }, - { - "path": "../5G_ciphered_NAS_decipher_tool" - }, { "path": "../open5gs" }, diff --git a/ccsrc/Externals/NG_security_ext.cc b/ccsrc/Externals/NG_security_ext.cc index 96465ab..207f2b9 100644 --- a/ccsrc/Externals/NG_security_ext.cc +++ b/ccsrc/Externals/NG_security_ext.cc @@ -19,8 +19,6 @@ #include "ia2_128.hh" #include "ia3_128.hh" -#include "zuc.hh" - namespace NG__SecurityDefinitionsAndExternalFunctions { /** @@ -33,94 +31,91 @@ namespace NG__SecurityDefinitionsAndExternalFunctions { //return int2bit(0, 0); //} OCTETSTRING fx__NG__NasIntegrityAlgorithm(const OCTETSTRING& p_encoded_nas_pdu, const BITSTRING& p_integrity_algorithm, const BITSTRING& p_knas_int, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction){ - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_encoded_nas_pdu: ", p_encoded_nas_pdu); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: ", bit2oct(p_integrity_algorithm)); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_knas_int: ", bit2oct(p_knas_int)); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_nas_count: ", p_nas_count); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_bearer_id: ", bit2oct(p_bearer_id)); - loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_direction: ", p_direction); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_encoded_nas_pdu: ", p_encoded_nas_pdu); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: ", bit2oct(p_integrity_algorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_knas_int: ", bit2oct(p_knas_int)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_nas_count: ", p_nas_count); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_bearer_id: ", bit2oct(p_bearer_id)); + loggers::get_instance().log_msg(">>> fx__NG__NasIntegrityAlgorithm: p_direction: ", p_direction); - // Sanity checks - if (p_integrity_algorithm.lengthof() != 4) { - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Wrong length"); - return int2oct(0, 0); - } else if (p_knas_int.lengthof() != 128) { - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_knas_int: Wrong length"); - return int2oct(0, 0); - } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_nas_count/p_bearer_id: Wrong length"); - return int2oct(0, 0); - } + // Sanity checks + if (p_integrity_algorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Wrong length"); + return int2oct(0, 0); + } else if (p_knas_int.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_knas_int: Wrong length"); + return int2oct(0, 0); + } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_nas_count/p_bearer_id: Wrong length"); + return int2oct(0, 0); + } - unsigned char *mac; - uint32_t mac_length; - uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); - int result = -1; - if (bit2int(p_integrity_algorithm) == 0) { // IA0/NEA0: No integrity protection - loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: No integrity protection"); - return p_encoded_nas_pdu; // no integrity protection - } else if (bit2int(p_integrity_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm - loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia1_128 selected"); - ia1_128 enc; - result = enc.mac( - bit2int(p_integrity_algorithm), - static_cast(bit2oct(p_knas_int)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_encoded_nas_pdu), - p_encoded_nas_pdu.lengthof(), - &mac, - &mac_length - ); - } else if (bit2int(p_integrity_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm - loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia2_128 selected"); - ia2_128 enc; - result = enc.encrypt( - bit2int(p_integrity_algorithm), - static_cast(bit2oct(p_knas_int)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_encoded_nas_pdu), - p_encoded_nas_pdu.lengthof(), - &mac, - &mac_length - ); - } else if (bit2int(p_integrity_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm - loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia3_128 selected"); - ia3_128 enc; - result = enc.mac( - bit2int(p_integrity_algorithm), - static_cast(bit2oct(p_knas_int)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_encoded_nas_pdu), - p_encoded_nas_pdu.lengthof(), - &mac, - &mac_length - ); - } else if (bit2int(p_integrity_algorithm) == 4) { // IA4 - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); - } else if (bit2int(p_integrity_algorithm) == 5) { // IA5 - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); - } else if (bit2int(p_integrity_algorithm) == 6) { // IA6 - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); - } else if (bit2int(p_integrity_algorithm) == 7) { // IA7 - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); - } else { - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unknown algorithm"); - } - if (result != 0) { - loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: ia2_128.mac() failed"); - return int2oct(0, 0); - } - OCTETSTRING os(mac_length, (const unsigned char*)mac); - free(mac); + unsigned char *mac; + uint32_t mac_length; + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); + int result = -1; + if (bit2int(p_integrity_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia1_128 selected"); + ia1_128 enc; + result = enc.mac( + bit2int(p_integrity_algorithm), + static_cast(bit2oct(p_knas_int)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &mac, + &mac_length + ); + } else if (bit2int(p_integrity_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia2_128 selected"); + ia2_128 enc; + result = enc.mac( + bit2int(p_integrity_algorithm), + static_cast(bit2oct(p_knas_int)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &mac, + &mac_length + ); + } else if (bit2int(p_integrity_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + loggers::get_instance().log("fx__NG__NasIntegrityAlgorithm: ia3_128 selected"); + ia3_128 enc; + result = enc.mac( + bit2int(p_integrity_algorithm), + static_cast(bit2oct(p_knas_int)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &mac, + &mac_length + ); + } else if (bit2int(p_integrity_algorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else if (bit2int(p_integrity_algorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else if (bit2int(p_integrity_algorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else if (bit2int(p_integrity_algorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unsupported algorithm"); + } else { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: p_integrity_algorithm: Unknown algorithm"); + } + if (result != 0) { + loggers::get_instance().error("fx__NG__NasIntegrityAlgorithm: ia2_128.mac() failed"); + return int2oct(0, 0); + } + OCTETSTRING os(mac_length, (const unsigned char*)mac); + std::free(mac); - loggers::get_instance().log_msg("<<< fx__NG__NasIntegrityAlgorithm: ", os); - return os; + loggers::get_instance().log_msg("<<< fx__NG__NasIntegrityAlgorithm: ", os); + return os; } OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_encoded_nas_pdu,const BITSTRING& p_ciphering_algorithm, const BITSTRING& p_knas_enc, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction){ @@ -131,194 +126,177 @@ OCTETSTRING fx__NG__NasCiphering(const OCTETSTRING& p_encoded_nas_pdu,const BIT loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_bearer_id: ", bit2oct(p_bearer_id)); loggers::get_instance().log_msg(">>> fx__NG__NasCiphering: p_direction: ", p_direction); - // Sanity checks - if (p_ciphering_algorithm.lengthof() != 4) { - loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Wrong length"); - return int2oct(0, 0); - } else if (p_knas_enc.lengthof() != 128) { - loggers::get_instance().error("fx__NG__NasCiphering: p_knas_enc: Wrong length"); - return int2oct(0, 0); - } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { - loggers::get_instance().error("fx__NG__NasCiphering: p_nas_count/p_bearer_id: Wrong length"); - return int2oct(0, 0); - } + // Sanity checks + if (p_ciphering_algorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Wrong length"); + return int2oct(0, 0); + } else if (p_knas_enc.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasCiphering: p_knas_enc: Wrong length"); + return int2oct(0, 0); + } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasCiphering: p_nas_count/p_bearer_id: Wrong length"); + return int2oct(0, 0); + } - unsigned char *cyphered; - uint32_t cyphered_length; - uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); - int result = -1; - if (bit2int(p_ciphering_algorithm) == 0) { // IA0/NEA0: No cyphering - loggers::get_instance().log("fx__NG__NasCiphering: No cyphering"); - return p_encoded_nas_pdu; // no cyphering - } else if (bit2int(p_ciphering_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm - loggers::get_instance().log("fx__NG__NasCiphering: ia1_128 selected"); - ia1_128 enc; - result = enc.encrypt( - bit2int(p_ciphering_algorithm), - static_cast(bit2oct(p_knas_enc)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_encoded_nas_pdu), - p_encoded_nas_pdu.lengthof(), - &cyphered, - &cyphered_length - ); - } else if (bit2int(p_ciphering_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm - loggers::get_instance().log("fx__NG__NasCiphering: ia2_128 selected"); - ia2_128 enc; - result = enc.encrypt( - bit2int(p_ciphering_algorithm), - static_cast(bit2oct(p_knas_enc)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_encoded_nas_pdu), - p_encoded_nas_pdu.lengthof(), - &cyphered, - &cyphered_length - ); - } else if (bit2int(p_ciphering_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm - loggers::get_instance().log("fx__NG__NasCiphering: ia3_128 selected"); - // loggers::get_instance().log("fx__NG__NasCiphering: %d", p_encoded_nas_pdu.lengthof()); - // cyphered = (unsigned char*) std::malloc(p_encoded_nas_pdu.lengthof()); - // zuc_eea3( - // (unsigned char*)static_cast(bit2oct(p_knas_enc)), - // nas_count, (uint32_t)bit2int(p_bearer_id), p_direction, - // p_encoded_nas_pdu.lengthof() * 8, (unsigned char*)static_cast(p_encoded_nas_pdu), cyphered); - // result = 0; - // cyphered_length = p_encoded_nas_pdu.lengthof(); - ia3_128 enc; - result = enc.encrypt( - bit2int(p_ciphering_algorithm), - static_cast(bit2oct(p_knas_enc)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_encoded_nas_pdu), - p_encoded_nas_pdu.lengthof(), - &cyphered, - &cyphered_length - ); - } else if (bit2int(p_ciphering_algorithm) == 4) { // IA4 - loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); - } else if (bit2int(p_ciphering_algorithm) == 5) { // IA5 - loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); - } else if (bit2int(p_ciphering_algorithm) == 6) { // IA6 - loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); - } else if (bit2int(p_ciphering_algorithm) == 7) { // IA7 - loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); - } else { - loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unknown algorithm"); - } - if (result != 0) { - loggers::get_instance().error("fx__NG__NasCiphering: ia2_128.encrypt() failed"); - return int2oct(0, 0); - } - OCTETSTRING os(cyphered_length, (const unsigned char*)cyphered); - free(cyphered); + unsigned char *cyphered; + uint32_t cyphered_length; + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); + int result = -1; + if (bit2int(p_ciphering_algorithm) == 0) { // IA0/NEA0: No cyphering + loggers::get_instance().log("fx__NG__NasCiphering: No cyphering"); + return p_encoded_nas_pdu; // no cyphering + } else if (bit2int(p_ciphering_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + loggers::get_instance().log("fx__NG__NasCiphering: ia1_128 selected"); + ia1_128 enc; + result = enc.encrypt( + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &cyphered, + &cyphered_length + ); + } else if (bit2int(p_ciphering_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + loggers::get_instance().log("fx__NG__NasCiphering: ia2_128 selected"); + ia2_128 enc; + result = enc.encrypt( + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &cyphered, + &cyphered_length + ); + } else if (bit2int(p_ciphering_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + loggers::get_instance().log("fx__NG__NasCiphering: ia3_128 selected"); + ia3_128 enc; + result = enc.encrypt( + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_encoded_nas_pdu), + p_encoded_nas_pdu.lengthof(), + &cyphered, + &cyphered_length + ); + } else if (bit2int(p_ciphering_algorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unsupported algorithm"); + } else { + loggers::get_instance().error("fx__NG__NasCiphering: p_ciphering_algorithm: Unknown algorithm"); + } + if (result != 0) { + loggers::get_instance().error("fx__NG__NasCiphering: ia2_128.encrypt() failed"); + return int2oct(0, 0); + } + OCTETSTRING os(cyphered_length, (const unsigned char*)cyphered); + free(cyphered); - loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: ", os); - return os; + loggers::get_instance().log_msg("<<< fx__NG__NasCiphering: ", os); + return os; } -OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_ciphered_nas_message, const BITSTRING& p_ciphering_algorithm, const BITSTRING& p_knas_enc, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction){ - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_ciphered_nas_message: ", p_ciphered_nas_message); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_ciphering_algorithm: ", bit2oct(p_ciphering_algorithm)); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_knas_enc: ", bit2oct(p_knas_enc)); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_nas_count: ", p_nas_count); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_bearer_id: ", bit2oct(p_bearer_id)); - loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_direction: ", p_direction); +OCTETSTRING fx__NG__NasDeciphering(const OCTETSTRING& p_ciphered_nas_message, const BITSTRING& p_ciphering_algorithm, const BITSTRING& p_knas_enc, const OCTETSTRING& p_nas_count, const BITSTRING& p_bearer_id, const INTEGER& p_direction) { + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_ciphered_nas_message: ", p_ciphered_nas_message); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_ciphering_algorithm: ", bit2oct(p_ciphering_algorithm)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_knas_enc: ", bit2oct(p_knas_enc)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_nas_count: ", p_nas_count); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_bearer_id: ", bit2oct(p_bearer_id)); + loggers::get_instance().log_msg(">>> fx__NG__NasDeciphering: p_direction: ", p_direction); - // Sanity checks - if (p_ciphering_algorithm.lengthof() != 4) { - loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Wrong length"); - return int2oct(0, 0); - } else if (p_knas_enc.lengthof() != 128) { - loggers::get_instance().error("fx__NG__NasDeciphering: p_knas_enc: Wrong length"); - return int2oct(0, 0); - } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { - loggers::get_instance().error("fx__NG__NasDeciphering: p_nas_count/p_bearer_id: Wrong length"); - return int2oct(0, 0); - } + // Sanity checks + if (p_ciphering_algorithm.lengthof() != 4) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Wrong length"); + return int2oct(0, 0); + } else if (p_knas_enc.lengthof() != 128) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_knas_enc: Wrong length"); + return int2oct(0, 0); + } else if ((p_nas_count.lengthof() != 4) || (p_bearer_id.lengthof() != 5)) { + loggers::get_instance().error("fx__NG__NasDeciphering: p_nas_count/p_bearer_id: Wrong length"); + return int2oct(0, 0); + } - unsigned char *payload; - uint32_t payload_length; - uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); - int result = -1; - if (bit2int(p_ciphering_algorithm) == 0) { // IA0/NEA0: No cyphering - loggers::get_instance().log("fx__NG__NasDeciphering: No cyphering"); - return p_ciphered_nas_message; // no cyphering - } else if (bit2int(p_ciphering_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm - loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); - ia1_128 enc; - result = enc.decrypt( - bit2int(p_ciphering_algorithm), - static_cast(bit2oct(p_knas_enc)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_ciphered_nas_message), - p_ciphered_nas_message.lengthof(), - &payload, - &payload_length - ); - } else if (bit2int(p_ciphering_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm - loggers::get_instance().log("fx__NG__NasDeciphering: ia2_128 selected"); - ia2_128 enc; - result = enc.decrypt( - bit2int(p_ciphering_algorithm), - static_cast(bit2oct(p_knas_enc)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_ciphered_nas_message), - p_ciphered_nas_message.lengthof(), - &payload, - &payload_length - ); - } else if (bit2int(p_ciphering_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm - // loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); - // zuc_eea3( - // (unsigned char*)static_cast(bit2oct(p_knas_enc)), - // nas_count, bit2int(p_bearer_id), p_direction, - // p_ciphered_nas_message.lengthof() * 8, (unsigned char*)static_cast(p_ciphered_nas_message), payload); - // result = 0; - // payload_length = p_ciphered_nas_message.lengthof(); - ia3_128 enc; - result = enc.decrypt( - bit2int(p_ciphering_algorithm), - static_cast(bit2oct(p_knas_enc)), - nas_count, - bit2int(p_bearer_id), - p_direction, - static_cast(p_ciphered_nas_message), - p_ciphered_nas_message.lengthof(), - &payload, - &payload_length - ); - } else if (bit2int(p_ciphering_algorithm) == 4) { // IA4 - loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); - } else if (bit2int(p_ciphering_algorithm) == 5) { // IA5 - loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); - } else if (bit2int(p_ciphering_algorithm) == 6) { // IA6 - loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); - } else if (bit2int(p_ciphering_algorithm) == 7) { // IA7 - loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); - } else { - loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unknown algorithm"); - } - if (result != 0) { - loggers::get_instance().error("fx__NG__NasDeciphering: decrypt() failed"); - return int2oct(0, 0); - } - OCTETSTRING os(payload_length, (const unsigned char*)payload); - free(payload); + unsigned char *payload; + uint32_t payload_length; + uint32_t nas_count = converter::get_instance().bytes_to_int(std::vector(static_cast(p_nas_count), static_cast(p_nas_count) + p_nas_count.lengthof())); + int result = -1; + if (bit2int(p_ciphering_algorithm) == 0) { // IA0/NEA0: No cyphering + loggers::get_instance().log("fx__NG__NasDeciphering: No cyphering"); + return p_ciphered_nas_message; // no cyphering + } else if (bit2int(p_ciphering_algorithm) == 1) { // IA1_128/NEA1_128: Snow 3G based algorithm + loggers::get_instance().log("fx__NG__NasDeciphering: ia1_128 selected"); + ia1_128 enc; + result = enc.decrypt( + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_ciphered_nas_message), + p_ciphered_nas_message.lengthof(), + &payload, + &payload_length + ); + } else if (bit2int(p_ciphering_algorithm) == 2) { // IA2_128/NEA2_128: AES 128 CTR based algorithm + loggers::get_instance().log("fx__NG__NasDeciphering: ia2_128 selected"); + ia2_128 enc; + result = enc.decrypt( + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_ciphered_nas_message), + p_ciphered_nas_message.lengthof(), + &payload, + &payload_length + ); + } else if (bit2int(p_ciphering_algorithm) == 3) { // IA3_128/NEA3_128: ZUC based algorithm + ia3_128 enc; + result = enc.decrypt( + bit2int(p_ciphering_algorithm), + static_cast(bit2oct(p_knas_enc)), + nas_count, + bit2int(p_bearer_id), + p_direction, + static_cast(p_ciphered_nas_message), + p_ciphered_nas_message.lengthof(), + &payload, + &payload_length + ); + } else if (bit2int(p_ciphering_algorithm) == 4) { // IA4 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 5) { // IA5 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 6) { // IA6 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else if (bit2int(p_ciphering_algorithm) == 7) { // IA7 + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unsupported algorithm"); + } else { + loggers::get_instance().error("fx__NG__NasDeciphering: p_ciphering_algorithm: Unknown algorithm"); + } + if (result != 0) { + loggers::get_instance().error("fx__NG__NasDeciphering: decrypt() failed"); + return int2oct(0, 0); + } + OCTETSTRING os(payload_length, (const unsigned char*)payload); + free(payload); - loggers::get_instance().log_msg("<<< fx__NG__NasDeciphering: ", os); - return os; + loggers::get_instance().log_msg("<<< fx__NG__NasDeciphering: ", os); + return os; } - - } // namespace NG__SecurityDefinitionsAndExternalFunctions diff --git a/ccsrc/Externals/ia2_128.cc b/ccsrc/Externals/ia2_128.cc index 67f386d..49e9406 100644 --- a/ccsrc/Externals/ia2_128.cc +++ b/ccsrc/Externals/ia2_128.cc @@ -7,6 +7,7 @@ #include "ia2_128.hh" #include +#include #include #include #include @@ -15,204 +16,205 @@ #include "loggers.hh" namespace { - constexpr size_t KEY_SIZE = 16; // 128 bits = 16 bytes - constexpr size_t BLOCK_SIZE = 16; // AES block size - constexpr size_t COUNTER_SIZE = 16; // Counter block size + constexpr size_t KEY_SIZE = 16; // 128 bits = 16 bytes + constexpr size_t BLOCK_SIZE = 16; // AES block size + constexpr size_t COUNTER_SIZE = 16; // Counter block size + constexpr size_t MAC_SIZE = 4; // MAC size in bytes } int ia2_128::encrypt(const uint8_t algo_id, - const unsigned char* knas_enc, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** cyphered, - uint32_t* cyphered_length) { - loggers::get_instance().log(">>> ia2_128::encrypt: Starting encryption"); - loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: knas_enc", knas_enc, 16); - loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: payload", payload, payload_length); - loggers::get_instance().log(">>> ia2_128::encrypt: algo_id: %d", algo_id); - loggers::get_instance().log(">>> ia2_128::encrypt: count: %u", count); - loggers::get_instance().log(">>> ia2_128::encrypt: bearer: %d", bearer); - loggers::get_instance().log(">>> ia2_128::encrypt: direction: %d", direction); - - // Input validation - if (!knas_enc || !payload || !cyphered || !cyphered_length) { - loggers::get_instance().error("ia2_128::encrypt: Wrong input parameters"); - return -1; - } - - if (payload_length == 0) { - loggers::get_instance().error("ia2_128::encrypt: Wrong payload length"); - *cyphered = nullptr; - *cyphered_length = 0; - return 0; - } - - // Allocate memory for ciphertext - *cyphered = static_cast(std::malloc(payload_length)); - if (!*cyphered) { - loggers::get_instance().error("ia2_128::encrypt: Failed to allocate memory"); - return -1; - } - - // Generate counter block - unsigned char counter_block[COUNTER_SIZE]; - generate_counter_block(count, bearer, direction, counter_block); - loggers::get_instance().log_to_hexa("ia2_128::encrypt: counter_block: ", counter_block, COUNTER_SIZE); - - // Initialize OpenSSL context - EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); - if (!ctx) { - loggers::get_instance().error("ia2_128::encrypt: Failed to allocate memory"); - std::free(*cyphered); - *cyphered = nullptr; - return -1; - } - - int ret = -1; - int len = 0; - int final_len = 0; - - // Initialize encryption context for AES-128 CTR mode - if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), nullptr, knas_enc, counter_block) != 1) { - loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptInit_ex failed"); - goto cleanup; - } - - // Encrypt the payload - if (EVP_EncryptUpdate(ctx, *cyphered, &len, payload, static_cast(payload_length)) != 1) { - loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptUpdate failed"); - goto cleanup; - } - loggers::get_instance().log("ia2_128::encrypt: len: %d", len); - - // Finalize encryption - if (EVP_EncryptFinal_ex(ctx, *cyphered + len, &final_len) != 1) { - loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptFinal_ex failed"); - goto cleanup; - } - loggers::get_instance().log("ia2_128::encrypt: final_len: %d", final_len); - - *cyphered_length = static_cast(len + final_len); - loggers::get_instance().log("ia2_128::encrypt: cyphered_length: %d", *cyphered_length); - loggers::get_instance().log_to_hexa("ia2_128::encrypt: cyphered: ", *cyphered, *cyphered_length); - ret = 0; + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length) { + loggers::get_instance().log(">>> ia2_128::encrypt: Starting encryption"); + loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: knas_enc", knas_enc, 16); + loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: payload", payload, payload_length); + loggers::get_instance().log(">>> ia2_128::encrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia2_128::encrypt: count: %u", count); + loggers::get_instance().log(">>> ia2_128::encrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia2_128::encrypt: direction: %d", direction); + + // Input validation + if (!knas_enc || !payload || !cyphered || !cyphered_length) { + loggers::get_instance().error("ia2_128::encrypt: Wrong input parameters"); + return -1; + } + + if (payload_length == 0) { + loggers::get_instance().error("ia2_128::encrypt: Wrong payload length"); + *cyphered = nullptr; + *cyphered_length = 0; + return 0; + } + + // Allocate memory for ciphertext + *cyphered = static_cast(std::malloc(payload_length)); + if (!*cyphered) { + loggers::get_instance().error("ia2_128::encrypt: Failed to allocate memory"); + return -1; + } + + // Generate counter block + unsigned char counter_block[COUNTER_SIZE]; + generate_counter_block(count, bearer, direction, counter_block); + loggers::get_instance().log_to_hexa("ia2_128::encrypt: counter_block: ", counter_block, COUNTER_SIZE); + + // Initialize OpenSSL context + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + loggers::get_instance().error("ia2_128::encrypt: Failed to allocate memory"); + std::free(*cyphered); + *cyphered = nullptr; + return -1; + } + + int result = -1; + int len = 0; + int final_len = 0; + + // Initialize encryption context for AES-128 CTR mode + if (EVP_EncryptInit_ex(ctx, EVP_aes_128_ctr(), nullptr, knas_enc, counter_block) != 1) { + loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptInit_ex failed"); + goto cleanup; + } + + // Encrypt the payload + if (EVP_EncryptUpdate(ctx, *cyphered, &len, payload, static_cast(payload_length)) != 1) { + loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptUpdate failed"); + goto cleanup; + } + loggers::get_instance().log("ia2_128::encrypt: len: %d", len); + + // Finalize encryption + if (EVP_EncryptFinal_ex(ctx, *cyphered + len, &final_len) != 1) { + loggers::get_instance().error("ia2_128::encrypt: EVP_EncryptFinal_ex failed"); + goto cleanup; + } + loggers::get_instance().log("ia2_128::encrypt: final_len: %d", final_len); + + *cyphered_length = static_cast(len + final_len); + loggers::get_instance().log("ia2_128::encrypt: cyphered_length: %d", *cyphered_length); + loggers::get_instance().log_to_hexa("ia2_128::encrypt: cyphered: ", *cyphered, *cyphered_length); + result = 0; cleanup: - EVP_CIPHER_CTX_free(ctx); - if (ret != 0) { - std::free(*cyphered); - *cyphered = nullptr; - *cyphered_length = 0; - } - - loggers::get_instance().log("<<< ia2_128::encrypt: ret: %d", ret); - return ret; + EVP_CIPHER_CTX_free(ctx); + if (result != 0) { + std::free(*cyphered); + *cyphered = nullptr; + *cyphered_length = 0; + } + + loggers::get_instance().log("<<< ia2_128::encrypt: result: %d", result); + return result; } int ia2_128::decrypt(const uint8_t algo_id, - const unsigned char* knas_enc, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* cyphered, - const uint32_t cyphered_length, - unsigned char** payload, - uint32_t* payload_length) { - loggers::get_instance().log(">>> ia2_128::decrypt: Starting decryption"); - loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: knas_enc", knas_enc, 16); - loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: cyphered", cyphered, cyphered_length); - loggers::get_instance().log(">>> ia2_128::decrypt: algo_id: %d", algo_id); - loggers::get_instance().log(">>> ia2_128::decrypt: count: %u", count); - loggers::get_instance().log(">>> ia2_128::decrypt: bearer: %d", bearer); - loggers::get_instance().log(">>> ia2_128::decrypt: direction: %d", direction); - - // Input validation - if (!knas_enc || !cyphered || !payload || !payload_length) { - loggers::get_instance().error("ia2_128::decrypt: Wrong input parameters"); - return -1; - } - - if (cyphered_length == 0) { - loggers::get_instance().error("ia2_128::encrypt: Wrong cyphered length"); - *payload = nullptr; - *payload_length = 0; - return 0; - } - - // Allocate memory for plaintext - *payload = static_cast(std::malloc(cyphered_length)); - if (!*payload) { - loggers::get_instance().error("ia2_128::decrypt: Failed to allocate memody"); - return -1; - } - - // Generate counter block (same as encryption) - unsigned char counter_block[COUNTER_SIZE]; - generate_counter_block(count, bearer, direction, counter_block); - loggers::get_instance().log_to_hexa("ia2_128::decrypt: counter_block: ", counter_block, COUNTER_SIZE); - - // Initialize OpenSSL context - EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); - if (!ctx) { - loggers::get_instance().error("ia2_128::decrypt: Failed to allocate memory"); - std::free(*payload); - *payload = nullptr; - return -1; - } - - int ret = -1; - int len = 0; - int final_len = 0; - - // Initialize decryption context for AES-128 CTR mode - // Note: CTR mode decryption is identical to encryption - if (EVP_DecryptInit_ex(ctx, EVP_aes_128_ctr(), nullptr, knas_enc, counter_block) != 1) { - loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptInit_ex failed"); - goto cleanup; - } - - // Decrypt the ciphertext - if (EVP_DecryptUpdate(ctx, *payload, &len, cyphered, static_cast(cyphered_length)) != 1) { - loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptUpdate failed"); - goto cleanup; - } - loggers::get_instance().log("ia2_128::decrypt: len: %d", len); - - // Finalize decryption - if (EVP_DecryptFinal_ex(ctx, *payload + len, &final_len) != 1) { - loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptFinal_ex failed"); - goto cleanup; - } - - *payload_length = static_cast(len + final_len); - loggers::get_instance().log("ia2_128::decrypt: cyphered_length: %d", *payload_length); - loggers::get_instance().log_to_hexa("ia2_128::decrypt: cyphered: ", *payload, *payload_length); - ret = 0; + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length) { + loggers::get_instance().log(">>> ia2_128::decrypt: Starting decryption"); + loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: knas_enc", knas_enc, 16); + loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: cyphered", cyphered, cyphered_length); + loggers::get_instance().log(">>> ia2_128::decrypt: algo_id: %d", algo_id); + loggers::get_instance().log(">>> ia2_128::decrypt: count: %u", count); + loggers::get_instance().log(">>> ia2_128::decrypt: bearer: %d", bearer); + loggers::get_instance().log(">>> ia2_128::decrypt: direction: %d", direction); + + // Input validation + if (!knas_enc || !cyphered || !payload || !payload_length) { + loggers::get_instance().error("ia2_128::decrypt: Wrong input parameters"); + return -1; + } + + if (cyphered_length == 0) { + loggers::get_instance().error("ia2_128::encrypt: Wrong cyphered length"); + *payload = nullptr; + *payload_length = 0; + return 0; + } + + // Allocate memory for plaintext + *payload = static_cast(std::malloc(cyphered_length)); + if (!*payload) { + loggers::get_instance().error("ia2_128::decrypt: Failed to allocate memody"); + return -1; + } + + // Generate counter block (same as encryption) + unsigned char counter_block[COUNTER_SIZE]; + generate_counter_block(count, bearer, direction, counter_block); + loggers::get_instance().log_to_hexa("ia2_128::decrypt: counter_block: ", counter_block, COUNTER_SIZE); + + // Initialize OpenSSL context + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + if (!ctx) { + loggers::get_instance().error("ia2_128::decrypt: Failed to allocate memory"); + std::free(*payload); + *payload = nullptr; + return -1; + } + + int result = -1; + int len = 0; + int final_len = 0; + + // Initialize decryption context for AES-128 CTR mode + // Note: CTR mode decryption is identical to encryption + if (EVP_DecryptInit_ex(ctx, EVP_aes_128_ctr(), nullptr, knas_enc, counter_block) != 1) { + loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptInit_ex failed"); + goto cleanup; + } + + // Decrypt the ciphertext + if (EVP_DecryptUpdate(ctx, *payload, &len, cyphered, static_cast(cyphered_length)) != 1) { + loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptUpdate failed"); + goto cleanup; + } + loggers::get_instance().log("ia2_128::decrypt: len: %d", len); + + // Finalize decryption + if (EVP_DecryptFinal_ex(ctx, *payload + len, &final_len) != 1) { + loggers::get_instance().error("ia2_128::decrypt: EVP_DecryptFinal_ex failed"); + goto cleanup; + } + + *payload_length = static_cast(len + final_len); + loggers::get_instance().log("ia2_128::decrypt: cyphered_length: %d", *payload_length); + loggers::get_instance().log_to_hexa("ia2_128::decrypt: cyphered: ", *payload, *payload_length); + result = 0; cleanup: - EVP_CIPHER_CTX_free(ctx); - if (ret != 0) { - std::free(*payload); - *payload = nullptr; - *payload_length = 0; - } - - loggers::get_instance().log("<<< ia2_128::decrypt: ret: %d", ret); - return ret; + EVP_CIPHER_CTX_free(ctx); + if (result != 0) { + std::free(*payload); + *payload = nullptr; + *payload_length = 0; + } + + loggers::get_instance().log("<<< ia2_128::decrypt: result: %d", result); + return result; } int ia2_128::mac(const uint8_t algo_id, - const unsigned char* knas_int, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** mac, - uint32_t* mac_length) { + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length) { loggers::get_instance().log_to_hexa(">>> ia2_128::mac: knas_int", knas_int, KEY_SIZE); loggers::get_instance().log(">>> ia2_128::mac: payload_length: %d", payload_length); loggers::get_instance().log_to_hexa(">>> ia2_128::mac: payload", payload, payload_length); @@ -235,32 +237,154 @@ int ia2_128::mac(const uint8_t algo_id, } // Allocate memory for ciphertext - *mac = static_cast(std::malloc(4)); + *mac = static_cast(std::malloc(MAC_SIZE)); if (!*mac) { loggers::get_instance().error("ia2_128::mac: Failed to allocate memory"); return -1; } - *mac_length = 4; + *mac_length = MAC_SIZE; + + // Generate input block for CMAC + unsigned char* input_block = nullptr; + uint32_t input_block_length = 0; + + int result = generate_input_block(count, bearer, direction, payload, payload_length * 8, &input_block, &input_block_length); + if (result != 0) { + loggers::get_instance().error("ia2_128::mac: Failed to generate block for CMAC"); + return -1; + } + + // Compute CMAC using OpenSSL + // Note: CMAC functions are deprecated in OpenSSL 3.0+, but we use them for compatibility + // with older versions. For OpenSSL 3.0+, consider using EVP_MAC API instead. + + // CMAC for AES-128 produces 16 bytes, but we need only 4 bytes (32 bits) for 128-EIA2 + unsigned char cmac_output[16]; + size_t cmac_len = sizeof(cmac_output); + + // Use deprecated CMAC API for compatibility with OpenSSL 1.x + CMAC_CTX* ctx = CMAC_CTX_new(); + if (!ctx) { + loggers::get_instance().error("ia2_128::mac: Failed to intialize CMAC context"); + std::free(input_block); + return -1; + } + + result = -1; + + // Initialize CMAC context with AES-128 + if (CMAC_Init(ctx, knas_int, KEY_SIZE, EVP_aes_128_cbc(), nullptr) != 1) { + loggers::get_instance().error("ia2_128::mac: CMAC_Init failure"); + goto cleanup; + } + + // Update CMAC with input block + if (CMAC_Update(ctx, input_block, input_block_length) != 1) { + loggers::get_instance().error("ia2_128::mac: CMAC_Update failure"); + goto cleanup; + } - // TODO: Implement AES CMAC computation according to 3GPP TS 33.401 + // Finalize CMAC - get the MAC (16 bytes for AES-128) + if (CMAC_Final(ctx, cmac_output, &cmac_len) != 1) { + loggers::get_instance().error("ia2_128::mac: CMAC_Final failure"); + goto cleanup; + } + #pragma GCC diagnostic pop + // 128-EIA2 produces 32-bit (4-byte) MAC + // Truncate CMAC output to 4 bytes (take the first 4 bytes) + std::memcpy(*mac, cmac_output, MAC_SIZE); loggers::get_instance().log_to_hexa("ia2_128::mac: mac: ", *mac, *mac_length); - loggers::get_instance().log("<<< ia2_128::mac: ret: 0"); + cleanup: + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + CMAC_CTX_free(ctx); + #pragma GCC diagnostic pop + std::free(input_block); + + loggers::get_instance().log("<<< ia2_128::mac: result: 0"); return 0; } // ETSI TS 133 401 V18.3.0 (2025-04) Annex B.1.3 128-EEA2 void ia2_128::generate_counter_block(const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - unsigned char* counter_block) { - std::memset(counter_block, 0, COUNTER_SIZE); - counter_block[0] = static_cast((count >> 24) & 0xFF); - counter_block[1] = static_cast((count >> 16) & 0xFF); - counter_block[2] = static_cast((count >> 8) & 0xFF); - counter_block[3] = static_cast(count & 0xFF); - counter_block[4] = static_cast((bearer & 0x1F) << 3 | ((direction & 0x01) << 2)); - // Remaining bytes are zero + const uint8_t bearer, + const uint8_t direction, + unsigned char* counter_block) { + std::memset(counter_block, 0, COUNTER_SIZE); + counter_block[0] = static_cast((count >> 24) & 0xFF); + counter_block[1] = static_cast((count >> 16) & 0xFF); + counter_block[2] = static_cast((count >> 8) & 0xFF); + counter_block[3] = static_cast(count & 0xFF); + counter_block[4] = static_cast((bearer & 0x1F) << 3 | ((direction & 0x01) << 2)); + // Remaining bytes are zero +} + +int ia2_128::generate_input_block(const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** input_block, + uint32_t* input_block_length) { + loggers::get_instance().log(">>> ia2_128::generate_input_block: count: %u", count); + loggers::get_instance().log(">>> ia2_128::generate_input_block: bearer: %d", bearer); + loggers::get_instance().log(">>> ia2_128::generate_input_block: direction: %d", direction); + loggers::get_instance().log(">>> ia2_128::generate_input_block: payload_length: %d", payload_length); + loggers::get_instance().log_to_hexa(">>> ia2_128::generate_input_block: payload", payload, payload_length / 8); + + if (!payload || !input_block || !input_block_length) { + loggers::get_instance().error("ia2_128::generate_input_block: Wrong input parameters"); + return -1; + } + + // 3GPP TS 33.401 Section 5.1.4.2: + // Input block = COUNT || (BEARER || DIRECTION || 0^26) || MESSAGE + // COUNT: 4 bytes + // BEARER + DIRECTION + padding: 4 bytes (32 bits total) + // MESSAGE: (payload_length + 7) / 8 bytes (convert bits to bytes, round up) + uint32_t payload_bytes = (payload_length + 7) / 8; + uint32_t total_length = 4 + 4 + payload_bytes; + loggers::get_instance().log("ia2_128::generate_input_block: payload_bytes: %u", payload_bytes); + loggers::get_instance().log("ia2_128::generate_input_block: total_length: %u", total_length); + + // Allocate input block + *input_block = static_cast(std::malloc(total_length)); + if (!*input_block) { + loggers::get_instance().error("ia2_128::mac: Failed to allocate memory"); + return -1; + } + + // Set COUNT (bytes 0-3, big-endian) + unsigned char* ptr = *input_block; + ptr[0] = static_cast((count >> 24) & 0xFF); + ptr[1] = static_cast((count >> 16) & 0xFF); + ptr[2] = static_cast((count >> 8) & 0xFF); + ptr[3] = static_cast(count & 0xFF); + ptr += 4; + // Set BEARER and DIRECTION (byte 4) + // Bits 0-4: BEARER (5 bits), Bit 5: DIRECTION (1 bit), Bits 6-31: padding (26 bits) + ptr[0] = static_cast((bearer << 3) | (direction << 2)); + ptr[1] = 0; + ptr[2] = 0; + ptr[3] = 0; + ptr += 4; + // Copy payload + std::memcpy(ptr, payload, payload_bytes); + loggers::get_instance().log_to_hexa("ia2_128::generate_input_block: ptr", ptr, total_length); + + // Handle partial bytes if payload_length is not a multiple of 8 + if (payload_length % 8 != 0) { + // Clear the unused bits in the last byte + uint32_t unused_bits = 8 - (payload_length % 8); + uint8_t mask = static_cast(0xFF << unused_bits); + ptr[payload_bytes - 1] &= ~mask; + } + + loggers::get_instance().log("ia2_128::generate_input_block: *input_block_length: %d", *input_block_length); + *input_block_length = total_length; + loggers::get_instance().log_to_hexa("<<< ia2_128::generate_input_block: ptr", static_cast(*input_block), *input_block_length * sizeof(uint32_t)); + return 0; } diff --git a/ccsrc/Externals/ia2_128.hh b/ccsrc/Externals/ia2_128.hh index f4f6ea6..e418530 100644 --- a/ccsrc/Externals/ia2_128.hh +++ b/ccsrc/Externals/ia2_128.hh @@ -8,8 +8,7 @@ * as specified in 3GPP TS 33.401 for NAS encryption/decryption. */ -#ifndef IA2_128_H -#define IA2_128_H +#pragma once #include #include @@ -25,139 +24,161 @@ */ class ia2_128 { public: - /** - * @brief Default constructor - */ - ia2_128() = default; - - /** - * @brief Destructor - */ - ~ia2_128() = default; + /** + * @brief Default constructor + */ + ia2_128() = default; - /** - * @brief Copy constructor (deleted) - */ - ia2_128(const ia2_128&) = delete; + /** + * @brief Destructor + */ + ~ia2_128() = default; - /** - * @brief Copy assignment operator (deleted) - */ - ia2_128& operator=(const ia2_128&) = delete; + /** + * @brief Copy constructor (deleted) + */ + ia2_128(const ia2_128&) = delete; - /** - * @brief Move constructor (deleted) - */ - ia2_128(ia2_128&&) = delete; + /** + * @brief Copy assignment operator (deleted) + */ + ia2_128& operator=(const ia2_128&) = delete; - /** - * @brief Move assignment operator (deleted) - */ - ia2_128& operator=(ia2_128&&) = delete; + /** + * @brief Move constructor (deleted) + */ + ia2_128(ia2_128&&) = delete; - /** - * @brief Encrypts plaintext using AES-128 CTR mode - * - * This method encrypts the given payload using AES-128 in CTR mode. - * The counter block is generated based on the NAS encryption key (knas_enc), - * count, bearer, and direction parameters according to 3GPP TS 33.401. - * - * @param algo_id Algorithm identifier (should be 2 for AES-128 CTR) - * @param knas_enc Pointer to the 16-byte NAS encryption key - * @param count 32-bit NAS count value - * @param bearer 5-bit bearer identifier (only lower 5 bits are used) - * @param direction Direction bit (0 = uplink, 1 = downlink) - * @param payload Pointer to the plaintext data to encrypt - * @param payload_length Length of the plaintext data in bytes - * @param cyphered Pointer to pointer that will receive the encrypted data (caller must free) - * @param cyphered_length Pointer to variable that will receive the encrypted data length - * @return 0 on success, negative value on error - * - * @note The caller is responsible for freeing the memory allocated for cyphered - * @note cyphered_length will be equal to payload_length for CTR mode - */ - int encrypt(const uint8_t algo_id, - const unsigned char* knas_enc, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** cyphered, - uint32_t* cyphered_length); + /** + * @brief Move assignment operator (deleted) + */ + ia2_128& operator=(ia2_128&&) = delete; - /** - * @brief Decrypts ciphertext using AES-128 CTR mode - * - * This method decrypts the given ciphertext using AES-128 in CTR mode. - * Decryption is identical to encryption for CTR mode. - * - * @param algo_id Algorithm identifier (should be 2 for AES-128 CTR) - * @param knas_enc Pointer to the 16-byte NAS encryption key - * @param count 32-bit NAS count value - * @param bearer 5-bit bearer identifier (only lower 5 bits are used) - * @param direction Direction bit (0 = uplink, 1 = downlink) - * @param cyphered Pointer to the ciphertext data to decrypt - * @param cyphered_length Length of the ciphertext data in bytes - * @param payload Pointer to pointer that will receive the decrypted data (caller must free) - * @param payload_length Pointer to variable that will receive the decrypted data length - * @return 0 on success, negative value on error - * - * @note The caller is responsible for freeing the memory allocated for payload - * @note payload_length will be equal to cyphered_length for CTR mode - */ - int decrypt(const uint8_t algo_id, - const unsigned char* knas_enc, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* cyphered, - const uint32_t cyphered_length, - unsigned char** payload, - uint32_t* payload_length); + /** + * @brief Encrypts plaintext using AES-128 CTR mode + * + * This method encrypts the given payload using AES-128 in CTR mode. + * The counter block is generated based on the NAS encryption key (knas_enc), + * count, bearer, and direction parameters according to 3GPP TS 33.401. + * + * @param algo_id Algorithm identifier (should be 2 for AES-128 CTR) + * @param knas_enc Pointer to the 16-byte NAS encryption key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to the plaintext data to encrypt + * @param payload_length Length of the plaintext data in bytes + * @param cyphered Pointer to pointer that will receive the encrypted data (caller must free) + * @param cyphered_length Pointer to variable that will receive the encrypted data length + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for cyphered + * @note cyphered_length will be equal to payload_length for CTR mode + */ + int encrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length); /** - * @brief Compute NAS integrity protection using AES 128 CRT algorithm + * @brief Decrypts ciphertext using AES-128 CTR mode * - * This method computes the integrity protection using the AES 128 CRT algorithm. + * This method decrypts the given ciphertext using AES-128 in CTR mode. + * Decryption is identical to encryption for CTR mode. * - * @param algo_id Algorithm identifier (should be 3 for AES 128 CRT) - * @param knas_int Pointer to the 16-byte NAS integrity key + * @param algo_id Algorithm identifier (should be 2 for AES-128 CTR) + * @param knas_enc Pointer to the 16-byte NAS encryption key * @param count 32-bit NAS count value * @param bearer 5-bit bearer identifier (only lower 5 bits are used) * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param cyphered Pointer to the ciphertext data to decrypt + * @param cyphered_length Length of the ciphertext data in bytes * @param payload Pointer to pointer that will receive the decrypted data (caller must free) * @param payload_length Pointer to variable that will receive the decrypted data length - * @param mac Pointer to the mac to decrypt - * @param mac_length Length of the mac in bytes * @return 0 on success, negative value on error * * @note The caller is responsible for freeing the memory allocated for payload - * @note payload_length will be equal to cyphered_length for stream ciphers + * @note payload_length will be equal to cyphered_length for CTR mode */ - int mac(const uint8_t algo_id, - const unsigned char* knas_int, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** mac, - uint32_t* mac_length); -private: - /** - * @brief Generates the initial counter block for AES-CTR - * - * @param count NAS count - * @param bearer Bearer identifier - * @param direction Direction bit - * @param counter_block Output buffer for 16-byte counter block - */ - void generate_counter_block(const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - unsigned char* counter_block); -}; + int decrypt(const uint8_t algo_id, + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length); -#endif // IA2_128_H +/** + * @brief Compute NAS integrity protection using AES 128 CRT algorithm + * + * This method computes the integrity protection using the AES 128 CRT algorithm. + * + * @param algo_id Algorithm identifier (should be 3 for AES 128 CRT) + * @param knas_int Pointer to the 16-byte NAS integrity key + * @param count 32-bit NAS count value + * @param bearer 5-bit bearer identifier (only lower 5 bits are used) + * @param direction Direction bit (0 = uplink, 1 = downlink) + * @param payload Pointer to pointer that will receive the decrypted data (caller must free) + * @param payload_length Pointer to variable that will receive the decrypted data length + * @param mac Pointer to the mac to decrypt + * @param mac_length Length of the mac in bytes + * @return 0 on success, negative value on error + * + * @note The caller is responsible for freeing the memory allocated for payload + * @note payload_length will be equal to cyphered_length for stream ciphers + */ +int mac(const uint8_t algo_id, + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length); +private: + /** + * @brief Generates the initial counter block for AES-CTR + * + * @param count NAS count + * @param bearer Bearer identifier + * @param direction Direction bit + * @param counter_block Output buffer for 16-byte counter block + */ + void generate_counter_block(const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + unsigned char* counter_block); + /** + * @brief Generates the input block for CMAC computation + * + * According to 3GPP TS 33.401, the input to CMAC consists of: + * - COUNT (32 bits, big-endian) + * - BEARER (5 bits) + DIRECTION (1 bit) + padding (26 bits) + * - MESSAGE (variable length, in bits) + * + * @param count NAS count + * @param bearer Bearer identifier + * @param direction Direction bit + * @param message Pointer to message data + * @param message_length Length of message in bits + * @param input_block Output buffer for the input block (will be allocated) + * @param input_block_length Output variable for the input block length in bytes + * @return 0 on success, negative on error + */ + int generate_input_block(const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* message, + const uint32_t message_length, + unsigned char** input_block, + uint32_t* input_block_length); +}; diff --git a/ccsrc/Externals/ia3_128.cc b/ccsrc/Externals/ia3_128.cc index 92dff41..3c93800 100644 --- a/ccsrc/Externals/ia3_128.cc +++ b/ccsrc/Externals/ia3_128.cc @@ -14,8 +14,6 @@ #include #include -#include "zuc.hh" - #include "loggers.hh" namespace { @@ -23,28 +21,6 @@ namespace { constexpr size_t IV_SIZE = 16; // Initialization vector size } -// uint32_t ia3_128::lfsr_s0 = 0; -// uint32_t ia3_128::lfsr_s1 = 0; -// uint32_t ia3_128::lfsr_s2 = 0; -// uint32_t ia3_128::lfsr_s3 = 0; -// uint32_t ia3_128::lfsr_s4 = 0; -// uint32_t ia3_128::lfsr_s5 = 0; -// uint32_t ia3_128::lfsr_s6 = 0; -// uint32_t ia3_128::lfsr_s7 = 0; -// uint32_t ia3_128::lfsr_s8 = 0; -// uint32_t ia3_128::lfsr_s9 = 0; -// uint32_t ia3_128::lfsr_s10 = 0; -// uint32_t ia3_128::lfsr_s11 = 0; -// uint32_t ia3_128::lfsr_s12 = 0; -// uint32_t ia3_128::lfsr_s13 = 0; -// uint32_t ia3_128::lfsr_s14 = 0; -// uint32_t ia3_128::lfsr_s15 = 0; -// uint32_t ia3_128::f_r1 = 0; -// uint32_t ia3_128::f_r2 = 0; -// uint32_t ia3_128::brc_x0 = 0; -// uint32_t ia3_128::brc_x1 = 0; -// uint32_t ia3_128::brc_x2 = 0; -// uint32_t ia3_128::brc_x3 = 0; void ia3_128::reset() { lfsr_s0 = 0; lfsr_s1 = 0; diff --git a/ccsrc/Externals/module.mk b/ccsrc/Externals/module.mk index 7626f8c..271e6d1 100644 --- a/ccsrc/Externals/module.mk +++ b/ccsrc/Externals/module.mk @@ -6,5 +6,4 @@ sources := \ ia2_128.cc \ ia3_128.cc \ - includes := . diff --git a/config.mk b/config.mk index 957ec1a..01f4dc7 100644 --- a/config.mk +++ b/config.mk @@ -1,7 +1,7 @@ # Do not use -X if -H is not used #TTCN3_COMPILER_OPTIONS := -d -e -f -g -j -H -l -L -R -U none -x -X TTCN3_COMPILER_OPTIONS := -b -d -e -f -g -j -l -L -O -P NGAP-PDU-Descriptions.NGAP-PDU -R -U none -x -TTCN3_DIR := $(HOME)/frameworks/titan-11.0.0/Install +#TTCN3_DIR := $(HOME)/frameworks/titan-11.0.0/Install #TTCN3_DIR := $(HOME)/tmp/ttcn3-9.0.0 #ASN1C_PATH := $(HOME)/frameworks/asn1c.denis #ASN1C_PATH := /home/ubuntu/bin/asn1c.denis/ diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index d6cdf54..ceb768f 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -144,21 +144,22 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_03 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_17_04 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_18_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_19_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_20_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01 NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 [GROUPS] diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index c81ba4c..d0615a3 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2932,23 +2932,22 @@ module NG_NAS_TestCases { setverdict(pass) - } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 /** * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI1 (SNOW 3G) - * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture - * @see ETSI TS 133 401 V18.3.0 (2025-04) C.4.2 Test Set 2 + * @see open5gs/tests/uint/security-test.c, security-test4 */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { - var O16_Type v_ik := '7e5e94431e11d73828d739cc6ced4573'O; // Integrity key - var NasCount_Type v_nas_count := '36af6144'O; // NAS Count + var O16_Type v_ik := '2bd6459f82c5b300952c49104881ff48'O; // Integrity key + var NasCount_Type v_nas_count := '38a6f056'O; // NAS Count var bitstring v_nas_enc_alg := '0001'B ; // 128-NEA3 128-bit ZUC algorithm - var B5_Type v_bearer_id := '11000'B; // Bearer ID (Signalling) - var octetstring v_plain_text := 'b3d3c9170a4e1632f60f861013d22d84b726b6a278d802d1eeaf1321ba5929'O; - var O4_Type v_mac_text := 'e3259f6f'O; // Expected mac text + var B5_Type v_bearer_id := '11111'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '3332346263393861373479'O; + var O4_Type v_mac_text := '731f1165'O; // Expected mac text - var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 1) + var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 0) if (not(match(v_mac_text_computed, v_mac_text))) { log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); setverdict(fail); @@ -2962,7 +2961,8 @@ module NG_NAS_TestCases { /** * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI1 (SNOW 3G) - * @see open5gs/tests/uint/security-test.c, security-test4 + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.4.1 Test Set 1 */ testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { @@ -2985,6 +2985,34 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 + /** + * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI2 (AES 128 CTR) + * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture + * @see ETSI TS 133 401 V18.3.0 (2025-04) C.2.2 Test Set 2 + * @see RFC4493 + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var O16_Type v_ik := 'd3c5d592327fb11c4035c6680af8c6d1'O; // Integrity key + var NasCount_Type v_nas_count := '398a59b4'O; // NAS Count + var bitstring v_nas_enc_alg := '0010'B ; // 128-NEA3 128-bit AES algorithm + var B5_Type v_bearer_id := '11010'B; // Bearer ID (Signalling) + var octetstring v_plain_text := '484583d5afe082ae'O; + var O4_Type v_mac_text := 'b93787e6'O; // Expected mac text + + var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 1) + if (not(match(v_mac_text_computed, v_mac_text))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01 + + /** * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI3 (ZUC) * @see ETSI TS 133 401 V18.3.0 (2025-04) Security architecture -- GitLab From 0543adf88a0397df44687a6d75d11a1ac8d3627f Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 14 Jan 2026 10:02:09 +0100 Subject: [PATCH 033/151] Validate CMAC calculation and checks --- etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 9 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 27 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 4 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 122 +++--- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 106 +++-- .../NG_NAS/NG_NAS_SecurityFunctions.ttcn | 8 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 26 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 86 ++++- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 3 + ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 2 + .../lib/Lib_NG_NAS_Security_Functions.ttcn | 364 +++++++++++++----- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 17 + .../lib_system/Lib_NG_NAS_Functions.ttcn | 29 +- 13 files changed, 579 insertions(+), 224 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ index a0b6bb5..f646138 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ @@ -29,7 +29,9 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B +Parameters.px_IMSI_Def := '696d73692d3939393730303030303030'H; // imsi-99970000000 NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] @@ -54,6 +56,9 @@ LogEventTypes:= Yes system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" +#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" + #system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" #system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" @@ -96,11 +101,11 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed #NGAP_TestCases.TC_NGAP_AMF_CMP_01 # Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID -NGAP_TestCases.TC_NGAP_AMF_CMP_02 +#NGAP_TestCases.TC_NGAP_AMF_CMP_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs -#NGAP_TestCases.TC_NGAP_AMF_CMP_04 +NGAP_TestCases.TC_NGAP_AMF_CMP_04 # Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs #NGAP_TestCases.TC_NGAP_AMF_CMP_05 # Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index ceb768f..29f552f 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -22,7 +22,8 @@ Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := '00000000000000000000000 Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B -Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O +Lib_NG_NAS_Pixits.PX_BEARER_ID := '11010'B NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) @@ -74,7 +75,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI -#################NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure @@ -86,7 +87,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration -#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 @@ -151,16 +152,16 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_21_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_22_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_23_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_24_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_01_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_02_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_25_03_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index c8972ef..bd75582 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -298,7 +298,7 @@ module NGAP_Steps { } log("f_NGAP_gnb_UE_Register: f_send_NGSetupRequest_await_NGSetupRespone done"); f_await_registration_request(); - log("f_NGAP_gnb_UE_Register: f_await_registration_request done"); + log("<<< f_NGAP_gnb_UE_Register"); } // End of function f_NGAP_gnb_UE_Register /** @@ -311,6 +311,7 @@ module NGAP_Steps { } else { // Await authentication request and send response f_await_authentication_request_send_authentication_response(); } + log("<<< f_NGAP_gnb_UE_Authentication"); } // End of function f_NGAP_gnb_UE_Authentication /** @@ -323,6 +324,7 @@ module NGAP_Steps { } else { // Await security mode and send response f_await_securitymode_command_send_securitymode_complete(); } + log("<<< f_NGAP_gnb_UE_SecurityMode"); } // End of function f_NGAP_gnb_UE_SecurityMode /** diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 3abc450..7d8d106 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -1510,10 +1510,11 @@ module NGAP_TCFunctions { */ function f_TC_NGAP_GNB_CMP_07() runs on aMFNGAPComponent { - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_gnb_UE_InitialContextSetup(); + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1550,43 +1551,43 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_08 */ - function f_TC_NGAP_GNB_CMP_08() runs on aMFNGAPComponent { - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_gnb_UE_InitialContextSetup(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + function f_TC_NGAP_GNB_CMP_08() runs on aMFNGAPComponent { + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UEContextReleaseCommand - ( - m_uE_NGAP_IDs_uE_NGAP_ID_pair - ( - m_uE_NGAP_ID_pair - ), - - - ))); + // Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextReleaseCommand + ( + m_uE_NGAP_IDs_uE_NGAP_ID_pair + ( + m_uE_NGAP_ID_pair + ), + - + ))); - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_UEContextReleaseComplete - )); + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete + )); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_GNB_CMP_08 + } // End of function f_TC_NGAP_GNB_CMP_08 /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_09 @@ -1597,6 +1598,7 @@ module NGAP_TCFunctions { f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1729,6 +1731,7 @@ module NGAP_TCFunctions { f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1772,6 +1775,7 @@ module NGAP_TCFunctions { f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1880,6 +1884,7 @@ module NGAP_TCFunctions { f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1929,8 +1934,7 @@ module NGAP_TCFunctions { f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); - - + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4447,9 +4451,10 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body action("Trigger a UE context release command!"); @@ -4487,6 +4492,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4494,24 +4500,24 @@ module NGAP_TCFunctions { // Body action("Trigger a UE context release command!"); - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UEContextReleaseCommand( - mw_uE_NGAP_IDs_uE_NGAP_ID_pair( - mw_uE_NGAP_ID_pair ( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - * - )), - mw_cause_radioNetwork(PX_UE_CONTEXT_RELEASE_COMMAND_CAUSE) - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand( + mw_uE_NGAP_IDs_uE_NGAP_ID_pair( + mw_uE_NGAP_ID_pair ( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + * + )), + mw_cause_radioNetwork(PX_UE_CONTEXT_RELEASE_COMMAND_CAUSE) + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_AMF_CMP_03 @@ -4533,6 +4539,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete // TODO: hasEstablishedInitialContext if (not(f_NGAP_gnb_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly @@ -4584,6 +4591,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4626,6 +4634,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4670,6 +4679,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4723,6 +4733,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4773,6 +4784,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_NGAP_gnb_UE_HasPendingDataTransmission(); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index e1d579b..a03f748 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -88,6 +88,8 @@ module NG_NAS_TCFunctions { ?, // Authentication_parameter_RAND ? // Authentication_parameter_AUTN ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); @@ -131,7 +133,7 @@ module NG_NAS_TCFunctions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); setverdict(fail); } else { @@ -196,7 +198,7 @@ module NG_NAS_TCFunctions { f_NGAPPDU_Get(v_PDU) f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST, v_message) == true) { + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == true) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } @@ -260,6 +262,8 @@ module NG_NAS_TCFunctions { mw_NG_AUTHENTICATION_REQUEST( '111'B // Identity type ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); @@ -330,6 +334,8 @@ module NG_NAS_TCFunctions { mw_NG_AUTHENTICATION_REQUEST( complement(ngKSI) ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); @@ -395,6 +401,8 @@ module NG_NAS_TCFunctions { mw_NG_IDENTITY_REQUEST( // TODO ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); @@ -445,6 +453,8 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMMAND ***"); @@ -472,10 +482,12 @@ module NG_NAS_TCFunctions { // Preamble f_NGAP_gnb_init2(); - f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); + f_await_initial_context_setup_request_send_initial_context_setup_resonse(); + f_send_NGUERadioCApabilityInfoIndication(); + f_await_registration_accept(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -483,7 +495,7 @@ module NG_NAS_TCFunctions { // Await next command (InitialContextSetupRequest) with NAS encrypted payload f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_InitialContextSetupRequest_withPDUSessionList( + mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( ?,//PX_AMF_UE_NGAP_ID, PX_RAN_UE_NGAP_ID, ? // Security mode command @@ -504,7 +516,7 @@ module NG_NAS_TCFunctions { // Terminate call with rejection f_send_NasAuthenticationFailure(); f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_SEC_ACC_01 @@ -568,7 +580,7 @@ module NG_NAS_TCFunctions { f_send_NGSetupRequest_await_NGSetupRespone(); f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_await_NGInitialContextSetupRequest_send_NGInitialContextSetupRespone(); + f_await_initial_context_setup_request_await_initial_context_setup_resonse(); f_send_NGUERadioCApabilityInfoIndication(); f_await_registration_accept(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -604,6 +616,8 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { setverdict(fail); @@ -715,22 +729,24 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - -, - ?, - mw_PLMN_List( - -, -, - { - *, - PX_PLMN_IDENTITY, - * - } - ), - -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - v_message) == false) { + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT( + -, + ?, + mw_PLMN_List( + -, -, + { + *, + PX_PLMN_IDENTITY, + * + } + ), + -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + ? + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message) == false) { setverdict(fail); } else { setverdict(pass); @@ -851,6 +867,8 @@ module NG_NAS_TCFunctions { ?/*TAIList*/,-,-,-,-,-,-,-,-,-,-,-,?/*GPRSTimer3512*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, ? ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); @@ -975,6 +993,8 @@ module NG_NAS_TCFunctions { ?/*TAIList*/,-,-,-,-,-,-,-,-,-,-,-,?/*GPRSTimer3512*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, ? ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); @@ -1095,6 +1115,8 @@ module NG_NAS_TCFunctions { -,?/*AllowedNSSAI*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, ? ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); @@ -1215,6 +1237,8 @@ module NG_NAS_TCFunctions { -,-,?/*RejectedNSSAI*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, ? ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); @@ -1342,7 +1366,10 @@ module NG_NAS_TCFunctions { template GPRS_Timer3 p_LowerBoundTimerValue := *, template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := **/ - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); setverdict(fail); @@ -1499,7 +1526,10 @@ module NG_NAS_TCFunctions { template GPRS_Timer3 p_LowerBoundTimerValue := *, template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := **/ - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); setverdict(fail); @@ -1568,7 +1598,9 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, - mw_NG_DEREGISTRATION_ACCEPT_MO + mw_NG_DEREGISTRATION_ACCEPT_MO, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); @@ -1634,7 +1666,9 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, - mw_NG_DEREGISTRATION_ACCEPT_MO + mw_NG_DEREGISTRATION_ACCEPT_MO, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); @@ -1698,7 +1732,10 @@ module NG_NAS_TCFunctions { //template GPRS_Timer3 p_LowerBoundTimerValue := *, //template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); setverdict(fail); @@ -1753,7 +1790,10 @@ module NG_NAS_TCFunctions { //template GPRS_Timer3 p_LowerBoundTimerValue := *, //template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); setverdict(fail); @@ -1788,7 +1828,10 @@ module NG_NAS_TCFunctions { //template GPRS_Timer3 p_LowerBoundTimerValue := *, //template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); setverdict(fail); @@ -1845,7 +1888,10 @@ module NG_NAS_TCFunctions { //template GPRS_Timer3 p_LowerBoundTimerValue := *, //template NG_TrackingAreaIdList p_ForbidTAIList_Roaming := *, //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); setverdict(fail); diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn index aee6dfc..d631a71 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_SecurityFunctions.ttcn @@ -509,11 +509,17 @@ module NG_NAS_SecurityFunctions { octetstring p_ABBA, KDF_Type p_KDF_Type) return B256_Type { + log(">>> f_NG_Authentication_A7: p_SUPI: ", p_SUPI); + log(">>> f_NG_Authentication_A7: p_ABBA: ", p_ABBA); + const octetstring const_S6D_FC :='6D'O; var octetstring v_S; var octetstring v_P0 := char2oct(p_SUPI); // @sic R5s190109 sic@ var octetstring v_P1 := p_ABBA; - + + log("f_NG_Authentication_A7: v_P0: ", v_P0); + log("f_NG_Authentication_A7: v_P1: ", v_P1); + // Generation of String v_S := const_S6D_FC; log("f_NG_Authentication_A7 (1): v_S=", v_S); diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index f6abb5f..90401ee 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1018,13 +1018,6 @@ module LibNGAP_Templates { criticality := reject, value_ := { InitialContextSetupRequest := { - - - - - - - protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -1379,6 +1372,25 @@ module LibNGAP_Templates { group Receive { + template (present) InitiatingMessage mw_n2_InitialContextSetupRequest_base_nas := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + InitialContextSetupRequest := { + protocolIEs := { + *, + { + id := id_NAS_PDU, + criticality := ?, + value_ := { NAS_PDU := ? } + }, + * + } + + } + } + } // End of template mw_n2_InitialContextSetupRequest_base_nas + /** * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.1 INITIAL CONTEXT SETUP REQUEST */ diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index f1f3708..fd0a8c0 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -2,6 +2,7 @@ module LibNGAP_Functions { // Lib3GPP import from CommonDefs all; + import from Parameters all; import from NAS_CommonTypeDefs all; import from NAS_CommonTemplates all; import from NAS_AuthenticationCommon all; @@ -146,8 +147,8 @@ module LibNGAP_Functions { *, mw_sliceSupportItem( mw_s_NSSAI( - PX_SST, - PX_SD + PX_SST/*, + PX_SD*/ )), * } @@ -287,6 +288,8 @@ module LibNGAP_Functions { mw_GMM_AuthRAND, mw_GSM_AUTN ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); @@ -298,7 +301,7 @@ module LibNGAP_Functions { log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -344,6 +347,8 @@ module LibNGAP_Functions { mw_GMM_AuthRAND, mw_GSM_AUTN ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_dl_message) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); @@ -355,7 +360,7 @@ module LibNGAP_Functions { log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -372,7 +377,10 @@ module LibNGAP_Functions { vc_recvNAS_PDU, mw_NG_AUTHENTICATION_RESPONSE( { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } - )) == false) { + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul + ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE ***"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE ***"); } @@ -409,7 +417,7 @@ module LibNGAP_Functions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); setverdict(fail); } else { @@ -418,6 +426,10 @@ module LibNGAP_Functions { } log("v_message: ", v_message); + f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type); + vc_previous_nas_count_ul := f_NasCountInit(); + vc_previous_nas_count_dl := f_NasCountInit(); + // Send response for SECURITY_MODE_COMPLETE vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, @@ -462,7 +474,7 @@ module LibNGAP_Functions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); setverdict(fail); } else { @@ -486,15 +498,19 @@ module LibNGAP_Functions { f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message( vc_recvNAS_PDU, - mw_NG_SECURITY_MODE_COMPLETE( - mw_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - mw_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - )) == false) { + mw_NG_SECURITY_MODE_COMPLETE_no_nonIMEISV_PEI( + -, //mw_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + - //{ iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul + ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE ***"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE ***"); } + // TODO Check plainNASMessage content + setverdict(pass); } @@ -533,12 +549,23 @@ module LibNGAP_Functions { ? */ ))); vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_ACCEPT ***"); + setverdict(pass); + } + log("v_message: ", v_message); // Await InitialContextSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes )); + log("<<< f_await_initial_context_setup_request_await_initial_context_setup_resonse"); } function f_await_initial_context_setup_request_send_initial_context_setup_resonse() runs on NGAPComponent { @@ -682,7 +709,7 @@ module LibNGAP_Functions { ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST) == false) { + if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch. ***"); setverdict(fail); } else { @@ -744,7 +771,7 @@ module LibNGAP_Functions { ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT) == false) { + if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -887,18 +914,18 @@ module LibNGAP_Functions { if (ischosen(p_PDU.initiatingMessage)) { // Nothing to do - if (match(vc_recvNGAP_PDU.initiatingMessage,mw_n2_NGSetupRequest_base)){ + if (match(vc_recvNGAP_PDU.initiatingMessage, mw_n2_NGSetupRequest_base)) { var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.NGSetupRequest.protocolIEs) //log("Number of IEs:",numOfIEs); for (var integer i:=0;i>> f_Check_5GAKA_NAS_DL_Message: ", p_nas_pdu); + log(">>> f_Check_5GAKA_NAS_DL_Message: p_nas_pdu: ", p_nas_pdu); + log(">>> f_Check_5GAKA_NAS_DL_Message: p_NasSecurityByRef: ", p_NasSecurityByRef); + log(">>> f_Check_5GAKA_NAS_DL_Message: p_previous_nas_count_dl: ", p_previous_nas_count_dl); var bitstring v_bs := oct2bit(p_nas_pdu); var NG_NAS_DL_Message_Type v_message; @@ -74,21 +81,83 @@ module Lib_NG_NAS_Security_Functions { log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); return false; } + log("f_Check_5GAKA_NAS_DL_Message: Raw v_message: ", v_message); + log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); if (ischosen(v_message.security_Protected_Nas_Message)) { - if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) - // NOthing to do, message is not cyphered - } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) - // TODO Cyphered message - // Decipher NAS container - // v_NonCleartextString := fx_NG_NasDeciphering(v_NonCleartextString, - // p_NasSecurityByRef.Ciphering.Algorithm, - // p_NasSecurityByRef.Ciphering.K_NAS, - // p_NasCount, - // p_NasSecurityByRef.BearerId); - //v_message.security_Protected_Nas_Message.plainNASMessage := v_NonCleartextString; - log("f_Check_5GAKA_NAS_DL_Message: TODO Cyphered message"); - setverdict(inconc); + log("f_Check_5GAKA_NAS_DL_Message: v_message.security_Protected_Nas_Message: ", v_message.security_Protected_Nas_Message); + if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_NoSecurityProtection) { + // Nothing to do + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_NewSecurityContext) { // Integrity & new context + var NG_SECURITY_MODE_COMMAND v_ng_security_mode_command; + var bitstring v_bs1 := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); + if (decvalue(v_bs1, v_ng_security_mode_command) != 0) { + log("f_Check_5GAKA_NAS_DL_Message: decvalue failure for NG_SECURITY_MODE_COMMAND"); + return false; + } + + // Set security algorithm + f_5g_security_context(v_ng_security_mode_command, p_NasSecurityByRef); + + // New context + p_previous_nas_count_dl := f_NasCountInit(); + + // Check integrity + var octetstring v_SequenceNumber := v_message.security_Protected_Nas_Message.sequenceNumber;//f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); + log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; + var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_NasSecurityByRef.NAS_Integrity.Algorithm, + p_NasSecurityByRef.NAS_Integrity.K_NAS, + f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_dl, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), + PX_BEARER_ID, + tsc_DirectionDL); + log("f_Check_5GAKA_NAS_DL_Message: v_CalculatedMac: ", v_CalculatedMac); + if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed"); + return false; + } + var integer v := oct2int(p_previous_nas_count_dl); + v := v + 1; + p_previous_nas_count_dl := int2oct(v, 4); + p_previous_nas_count_dl := p_previous_nas_count_dl & int2oct(0x00FFFFFF, 4); // Use 24bits only + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered) { + // Check integrity + var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); + log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; + var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_NasSecurityByRef.NAS_Integrity.Algorithm, + p_NasSecurityByRef.NAS_Integrity.K_NAS, + f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_dl, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), + PX_BEARER_ID, + tsc_DirectionDL); + log("f_Check_5GAKA_NAS_DL_Message: v_CalculatedMac: ", v_CalculatedMac); + if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed"); + return false; + } + var integer v := oct2int(p_previous_nas_count_dl); + v := v + 1; + p_previous_nas_count_dl := int2oct(v, 4); + p_previous_nas_count_dl := p_previous_nas_count_dl & int2oct(0x00FFFFFF, 4); // Use 24bits only + // Decyphering + var octetstring v_cleartextString; + v_cleartextString := fx_NG_NasDeciphering(v_message.security_Protected_Nas_Message.plainNASMessage, + p_NasSecurityByRef.NAS_Ciphering.Algorithm, + p_NasSecurityByRef.NAS_Ciphering.K_NAS, + v_message.security_Protected_Nas_Message.messageAuthenticationCode, + PX_BEARER_ID, + tsc_DirectionDL + ); + if (lengthof(v_cleartextString) == 0) { + log("f_Check_5GAKA_NAS_DL_Message: Deciphering failed"); + return false; + } + v_message.security_Protected_Nas_Message.plainNASMessage := v_cleartextString; + log("f_Check_5GAKA_NAS_DL_Message: v_message.security_Protected_Nas_Message.plainNASMessage: ", v_message.security_Protected_Nas_Message.plainNASMessage); + } else { + log("f_Check_5GAKA_NAS_DL_Message: Unsupported securityHeaderType: ", v_message.security_Protected_Nas_Message.securityHeaderType); return false; } // Message was decrypted properly @@ -97,7 +166,9 @@ module Lib_NG_NAS_Security_Functions { log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); return false; } - log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); + log("f_Check_5GAKA_NAS_DL_Message: Deciphered v_message: ", v_message); + } else { + log("f_Check_5GAKA_NAS_DL_Message: Message is not security protected"); } if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { log(match(v_message, p_NG_NAS_DL_Message_Type)); @@ -106,14 +177,19 @@ module Lib_NG_NAS_Security_Functions { p_message := v_message; log("f_Check_5GAKA_NAS_DL_Message: matching: p_message: ", p_message); + log("<<< f_Check_5GAKA_NAS_DL_Message: p_previous_nas_count_dl: ", p_previous_nas_count_dl); return true; } // End of function f_Check_5GAKA_NAS_DL_Message function f_Check_5GAKA_NAS_UL_Message( in NAS_PDU p_nas_pdu, - in template NG_NAS_UL_Message_Type p_NG_NAS_UL_Message_Type + in template NG_NAS_UL_Message_Type p_NG_NAS_UL_Message_Type, + in NG_NAS_SecurityParams_Type p_NasSecurityByRef, + inout NasCount_Type p_previous_nas_count_ul ) return boolean { - log(">>> f_Check_5GAKA_NAS_UL_Message: ", p_nas_pdu); + log(">>> f_Check_5GAKA_NAS_UL_Message: p_nas_pdu: ", p_nas_pdu); + log(">>> f_Check_5GAKA_NAS_UL_Message: p_NasSecurityByRef: ", p_NasSecurityByRef); + log(">>> f_Check_5GAKA_NAS_UL_Message: p_previous_nas_count_ul: ", p_previous_nas_count_ul); var bitstring v_bs := oct2bit(p_nas_pdu); var NG_NAS_UL_Message_Type v_message; @@ -121,31 +197,90 @@ module Lib_NG_NAS_Security_Functions { log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); return false; } - log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); + log("f_Check_5GAKA_NAS_DL_Message: Raw v_message: ", v_message); + if (ischosen(v_message.security_Protected_Nas_Message)) { - if (v_message.security_Protected_Nas_Message.securityHeaderType == '0000'B) { // Not protected (0) - // TODO - } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0001'B) { // Integrity protected (1) - // TODO - } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0011'B) { // Security header type: Integrity protected with new 5GS security context (3) - // Nothing to do, message is not cyphered - } else if (v_message.security_Protected_Nas_Message.securityHeaderType == '0100'B) { // .... 0100 = Security header type: Integrity protected and ciphered with new 5GS security context (4) - // TODO Cyphered message - // Decipher NAS container - // v_NonCleartextString := fx_NG_NasDeciphering(v_NonCleartextString, - // p_NasSecurityByRef.Ciphering.Algorithm, - // p_NasSecurityByRef.Ciphering.K_NAS, - // p_NasCount, - // p_NasSecurityByRef.BearerId); - //v_message.security_Protected_Nas_Message.plainNASMessage := v_NonCleartextString; - log("f_Check_5GAKA_NAS_UL_Message: TODO Cyphered message"); - setverdict(pass); - return true; + log("f_Check_5GAKA_NAS_UL_Message: v_message.security_Protected_Nas_Message: ", v_message.security_Protected_Nas_Message); + log("f_Check_5GAKA_NAS_UL_Message: v_message.security_Protected_Nas_Message.securityHeaderType: ", v_message.security_Protected_Nas_Message.securityHeaderType); + if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_NoSecurityProtection) { + // Nothing to do + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_NewSecurityContext) { // Integrity & new context + // New context + p_previous_nas_count_ul := f_NasCountInit(); + + // Check integrity + var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); + log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; + var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_NasSecurityByRef.NAS_Integrity.Algorithm, + p_NasSecurityByRef.NAS_Integrity.K_NAS, + f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_ul, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), + PX_BEARER_ID, + tsc_DirectionDL); + log("f_Check_5GAKA_NAS_UL_Message: v_CalculatedMac: ", v_CalculatedMac); + if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_UL_Message: Integrity check failed"); + return false; + } + var integer v := oct2int(p_previous_nas_count_ul); + v := v + 1; + p_previous_nas_count_ul := int2oct(v, 4); + p_previous_nas_count_ul := p_previous_nas_count_ul & int2oct(0x00FFFFFF, 4); // Use 24bits only + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected) { + // TODO Check integrity + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) { + // New context + p_previous_nas_count_ul := f_NasCountInit(); + + // Check integrity + var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); + log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; + var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_NasSecurityByRef.NAS_Integrity.Algorithm, + p_NasSecurityByRef.NAS_Integrity.K_NAS, + f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_ul, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), + PX_BEARER_ID, + tsc_DirectionUL); + log("f_Check_5GAKA_NAS_UL_Message: v_CalculatedMac: ", v_CalculatedMac); + if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_UL_Message: Integrity check failed"); + return false; + } + var integer v := oct2int(p_previous_nas_count_ul); + v := v + 1; + p_previous_nas_count_ul := int2oct(v, 4); + p_previous_nas_count_ul := p_previous_nas_count_ul & int2oct(0x00FFFFFF, 4); // Use 24bits only + } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered) { + // TODO Check integrity + var octetstring v_cleartextString; + if (ischosen(v_message.security_Protected_Nas_Message)) { + v_cleartextString := fx_NG_NasDeciphering(v_message.security_Protected_Nas_Message.plainNASMessage, + p_NasSecurityByRef.NAS_Ciphering.Algorithm, + p_NasSecurityByRef.NAS_Ciphering.K_NAS, + v_message.security_Protected_Nas_Message.messageAuthenticationCode, + PX_BEARER_ID, + tsc_DirectionUL + ); + } else { + log("f_Check_5GAKA_NAS_UL_Message: Unsupported variant of NAS UL Message"); + return false; + } + if (lengthof(v_cleartextString) == 0) { + log("f_Check_5GAKA_NAS_UL_Message: Deciphering failed"); + return false; + } + v_message.security_Protected_Nas_Message.plainNASMessage := v_cleartextString; + log("f_Check_5GAKA_NAS_UL_Message: v_message.security_Protected_Nas_Message.plainNASMessage: ", v_message.security_Protected_Nas_Message.plainNASMessage); + } else { + log("f_Check_5GAKA_NAS_UL_Message: Unsupported securityHeaderType: ", v_message.security_Protected_Nas_Message.securityHeaderType); + return false; } // Message was decrypted/verified properly v_bs := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); if (decvalue(v_bs, v_message) != 0) { - log("f_Check_5GAKA_NAS_DL_Message: decvalue failure"); + log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); return false; } } @@ -155,6 +290,9 @@ module Lib_NG_NAS_Security_Functions { } log("f_Check_5GAKA_NAS_UL_Message: matching"); + // TODO Return the message value + + log("<<< f_Check_5GAKA_NAS_UL_Message: p_previous_nas_count_ul: ", p_previous_nas_count_ul); return true; } // End of function f_Check_5GAKA_NAS_UL_Message @@ -192,6 +330,45 @@ module Lib_NG_NAS_Security_Functions { return true; } // End of function f_Check_5GAKA_NAS_UL_Message_is_encrypted + function f_NasCountInit() return NasCount_Type { + var integer v_CountValue := (65536 * 256) - 1; + log("f_NasCountInit: p_PrevCount: ", int2oct(v_CountValue, 4)); + return int2oct(v_CountValue, 4); + } + + function f_NG_NasSecurity_EstimateCOUNT(in NasCount_Type p_PrevCount, + in integer p_SequenceNumber + ) return NasCount_Type { + log(">>> f_NG_NasSecurity_EstimateCOUNT: p_PrevCount: ", p_PrevCount); + log(">>> f_NG_NasSecurity_EstimateCOUNT: p_SequenceNumber: ", p_SequenceNumber); + + var integer v_PrevCountValue := oct2int(p_PrevCount); + var integer v_CountValue; + var integer v_MaxSnPlus1; + var integer v_PrevSnValue; + var integer v_ReceivedSnValue; + var integer v_OverflowCounter; /* Note: for normal (long) SN this is the overflow counter as described in 24.301; + for 5 bit SN it includes the 3 most significant bits of the least significant octet (what normally is the SN) */ + v_ReceivedSnValue := p_SequenceNumber; + v_MaxSnPlus1 := 256; + v_OverflowCounter := v_PrevCountValue / v_MaxSnPlus1; + v_PrevSnValue := v_PrevCountValue mod v_MaxSnPlus1; + + if (v_ReceivedSnValue < v_PrevSnValue) { // => overflow + v_OverflowCounter := (v_OverflowCounter + 1) mod 65536; + } + v_CountValue := (v_OverflowCounter * v_MaxSnPlus1) + v_ReceivedSnValue; + + log("<<< f_NG_NasSecurity_EstimateCOUNT: ", int2oct(v_CountValue, 4)); + return int2oct(v_CountValue, 4); + }; + + function f_NasSecurity_ExtractSNfromCOUNT( + in NasCount_Type p_Count + ) return NAS_SequenceNumber { + return int2oct(oct2int(p_Count) mod 256, 1); + }; + /** * @see https://www.ericsson.com/en/blog/2021/9/authentication-and-key-agreements */ @@ -211,9 +388,12 @@ module Lib_NG_NAS_Security_Functions { in ABBA p_abba, in NAS_PlmnId p_PLMN, in template (omit) hexstring p_NID := omit, + in hexstring p_Identity := px_IMSI_Def, inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type ) return boolean { - log(">>> f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); + log(">>> f_5g_aka_compute_res_xres: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); + log(">>> f_5g_aka_compute_res_xres: p_Identity: ", p_Identity); + log(">>> f_5g_aka_compute_res_xres: p_Identity: ", hex2str(p_Identity)); p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); @@ -297,13 +477,13 @@ module Lib_NG_NAS_Security_Functions { ); log("f_5g_aka_compute_res_xres: KSEAF=", bit2oct(p_ng_nas_security_params_type.KSEAF)); - // TODO Generate KMAF - // p_ng_nas_security_params_type.KAMF := f_NG_Authentication_A7(p_Identity, - // p_ng_nas_security_params_type.KSEAF, - // p_ng_nas_security_params_type.ABBA, - // p_ng_nas_security_params_type.KDF - // ); - //log("f_5g_aka_compute_res_xres: KAMF=", p_ng_nas_security_params_type.KAMF); + // Generate KMAF + p_ng_nas_security_params_type.KAMF := f_NG_Authentication_A7(oct2char(hex2oct(p_Identity)), + p_ng_nas_security_params_type.KSEAF, + p_ng_nas_security_params_type.ABBA, + p_ng_nas_security_params_type.KDF + ); + log("f_5g_aka_compute_res_xres: KAMF=", bit2oct(p_ng_nas_security_params_type.KAMF)); log("<<< f_5g_aka_compute_res_xres: ", p_ng_nas_security_params_type); return true; @@ -319,58 +499,56 @@ module Lib_NG_NAS_Security_Functions { p_ng_nas_security_params_type.NAS_Integrity.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.integrityType); p_ng_nas_security_params_type.NAS_Ciphering.Algorithm := valueof(p_ng_security_mode_command.nasSecurityAlgorithms.cipheringType); + // Derive KNASenc key + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS := f_NG_Authentication_A8(tsc_NAS_Enc_Alg, + valueof(p_ng_security_mode_command.nasSecurityAlgorithms.cipheringType), + valueof(p_ng_nas_security_params_type.KAMF), + valueof(p_ng_nas_security_params_type.KDF) + ); + // Derive KNASint key + p_ng_nas_security_params_type.NAS_Integrity.K_NAS := f_NG_Authentication_A8(tsc_NAS_Int_Alg, + valueof(p_ng_security_mode_command.nasSecurityAlgorithms.integrityType), + valueof(p_ng_nas_security_params_type.KAMF), + valueof(p_ng_nas_security_params_type.KDF) + ); + log("<<< f_5g_security_context: ", p_ng_nas_security_params_type); return true; } // End of function f_5g_security_context - - - - //-------------------------------------------------------------------------- - /* - * @desc HRES* and HXRES* derivation function - * As per annex A.5 of 33.501 - * @param p_AuthParams - * @param p_KAUSF - * @param p_KDF_Type - * @param p_NID (default value: omit) - * @return B256_Type - */ - function f_NG_Authentication_A5( - in B128_Type p_RAND, - in B64_Type p_XRESstar, - KDF_Type p_KDF_Type, - B256_Type p_Key - ) return B128_Type - { - const octetstring const_S6C_FC :='6C'O; - var octetstring v_S; - var octetstring v_P0; - var octetstring v_P1; - - log(">>> f_NG_Authentication_A5: p_RAND=", bit2oct(p_RAND)); - log(">>> f_NG_Authentication_A5: p_XRESstar=", bit2oct(p_XRESstar)); - log(">>> f_NG_Authentication_A5: p_KDF=", p_KDF_Type); - log(">>> f_NG_Authentication_A5: p_Key=", bit2oct(p_Key)); - - v_S := bit2oct(p_RAND) & bit2oct(p_XRESstar); - log("f_NG_Authentication_A5: v_S=", v_S); - - //return substr(fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S), 128, 128); - return substr(fx_sha256(v_S), 128, 128); - }; - - - - - - - - - - - - + //-------------------------------------------------------------------------- + /* + * @desc HRES* and HXRES* derivation function + * As per annex A.5 of 33.501 + * @param p_AuthParams + * @param p_KAUSF + * @param p_KDF_Type + * @param p_NID (default value: omit) + * @return B256_Type + */ + function f_NG_Authentication_A5( + in B128_Type p_RAND, + in B64_Type p_XRESstar, + KDF_Type p_KDF_Type, + B256_Type p_Key + ) return B128_Type + { + const octetstring const_S6C_FC :='6C'O; + var octetstring v_S; + var octetstring v_P0; + var octetstring v_P1; + + log(">>> f_NG_Authentication_A5: p_RAND=", bit2oct(p_RAND)); + log(">>> f_NG_Authentication_A5: p_XRESstar=", bit2oct(p_XRESstar)); + log(">>> f_NG_Authentication_A5: p_KDF=", p_KDF_Type); + log(">>> f_NG_Authentication_A5: p_Key=", bit2oct(p_Key)); + + v_S := bit2oct(p_RAND) & bit2oct(p_XRESstar); + log("f_NG_Authentication_A5: v_S=", v_S); + + //return substr(fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S), 128, 128); + return substr(fx_sha256(v_S), 128, 128); + }; diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index c11f982..2b5bd2c 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -777,6 +777,23 @@ module Lib_NG_NAS_Templates { } } // End of template mw_NG_SECURITY_MODE_COMPLETE + template (present) NG_NAS_UL_Message_Type mw_NG_SECURITY_MODE_COMPLETE_no_nonIMEISV_PEI( + template (present) NG_MobileIdentity p_IMEISV := ?, + template (present) ReplayedNASMessageContainer p_NASMsg := ?, + template NG_MobileIdentity p_NonIMEISV_PEI := * + ) := { /* 24.501 cl. 8.2.26 */ + /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ + security_Mode_Complete := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_SecurityModeComplete, /* cl. 9.7 M V 1 */ + imeisv := p_IMEISV, /* cl. 9.11.3.4 O TLV 11 IEI=2C */ + nasMsg := p_NASMsg, /* cl. 9.11.3.33 O TLV-E 3-n IEI=7D */ + nonIMEISV_PEI := p_NonIMEISV_PEI /* cl. 9.11.3.4 O TLV-E 7-n IEI=78 Sep20 @sic R5s201387 Baseline Moving sic@ */ + } + } // End of template mw_NG_SECURITY_MODE_COMPLETE_no_nonIMEISV_PEI + template (value) NG_NAS_UL_Message_Type m_NG_SECURITY_MODE_REJECT( in template (value) GMM_GSM_Cause p_Cause ) := { /* @status APPROVED (NR5GC) */ diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index fa712e0..eb8f37b 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -11,6 +11,7 @@ module Lib_NG_NAS_Functions { // Lib3GPP import from CommonDefs all; + import from Parameters all; import from NG_NAS_MsgContainers all; import from NAS_CommonTypeDefs all; import from NAS_CommonTemplates all; @@ -107,6 +108,8 @@ module Lib_NG_NAS_Functions { -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, ? ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message) == false) { setverdict(fail); return; @@ -137,6 +140,8 @@ module Lib_NG_NAS_Functions { mw_GMM_AuthRAND, mw_GSM_AUTN ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { setverdict(fail); @@ -149,7 +154,7 @@ module Lib_NG_NAS_Functions { log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -215,6 +220,8 @@ module Lib_NG_NAS_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { setverdict(fail); @@ -225,6 +232,8 @@ module Lib_NG_NAS_Functions { setverdict(fail); return; } + vc_previous_nas_count_ul := f_NasCountInit(); + vc_previous_nas_count_dl := f_NasCountInit(); setverdict(pass); } @@ -243,6 +252,8 @@ module Lib_NG_NAS_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message ) == false) { setverdict(fail); @@ -255,6 +266,8 @@ module Lib_NG_NAS_Functions { setverdict(fail); return; } + vc_previous_nas_count_ul := f_NasCountInit(); + vc_previous_nas_count_dl := f_NasCountInit(); // Send SecurityModeComplete vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( @@ -300,6 +313,20 @@ module Lib_NG_NAS_Functions { mw_n2_InitialContextSetupRequest_withPDUSessionList( // FIXME FSCOM How to deal with it? ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + setverdict(fail); + return; + } + + setverdict(pass); f_send_NGAP_PDU( m_ngap_succMsg( m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes -- GitLab From 982dcafe30e59f98c1ae2371bda4bf0b9e0294c8 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 14 Jan 2026 10:03:18 +0100 Subject: [PATCH 034/151] Add configuration file for Open5GS --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 210 +++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ new file mode 100644 index 0000000..9044351 --- /dev/null +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -0,0 +1,210 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +NGAP_Pics.PICS_OFFLINE_MODE := true +NGAP_Pics.PICS_NGAP_AMF_IUT := true + +# 5GRegAuthSec_deReg.pcap +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v128 + +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O + +# OP +Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O +# OPc +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E88E6183CA'O +Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true + +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B +# https://www.binaryhexconverter.com/hex-to-binary-converter +Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B + +Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/AtsNGAP/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. + +# Open5GS AMF IP and port +#system.NGAP_gNB_1.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" + +#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" + +system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" + +#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +# Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_01 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_03 +# Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_04 +# Verify that the AMF node processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for not successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_05 + +# Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed +#NGAP_TestCases.TC_NGAP_AMF_CMP_01 +# Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID +#NGAP_TestCases.TC_NGAP_AMF_CMP_02 +# Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons +#NGAP_TestCases.TC_NGAP_AMF_CMP_03 +# Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs +NGAP_TestCases.TC_NGAP_AMF_CMP_04 +# Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_05 +# Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_06 +# Verify that the IUT can successfully request UE information from the AMF +#NGAP_TestCases.TC_NGAP_AMF_CMP_07 +# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_08 +# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension +#NGAP_TestCases.TC_NGAP_AMF_CMP_09 +# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_10 +# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_11 + + + +# Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER COMMAND with successfully handover. +#NGAP_TestCases.TC_NGAP_AMF_MMP_01 +# Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER PREPARATION FAILURE because the UE is not longer available. +#NGAP_TestCases.TC_NGAP_AMF_MMP_02 +# Verify that the AMF node successfully sends a HANDOVER REQUEST message that contains mandatory IEs to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_MMP_03 +# Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and answers with PATH SWITCH REQUEST ACKNOWLEDGE to acknowledge the path switch. +#NGAP_TestCases.TC_NGAP_AMF_MMP_04 +# Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and two PDU Sessions with same ID and answers with PATH SWITCH REQUEST FAILURE. +#NGAP_TestCases.TC_NGAP_AMF_MMP_05 +# Verify that the AMF node successfully processes a HANDOVER CANCEL message that contains mandatory IEs and answers with HANDOVER CANCEL ACKNOWLEDGE to confirm that the ongoing handover was cancelled. +#NGAP_TestCases.TC_NGAP_AMF_MMP_06 +# Verify that the AMF node successfully sends a DOWNLINK RAN STATUS TRANSFER message that contains mandatory IEs. +#NGAP_TestCases.TC_NGAP_AMF_MMP_07 +# Verify that the NG-RAN node successfully sends a Handover Success message to the AMF. +#NGAP_TestCases.TC_NGAP_AMF_MMP_08 +# Verify that the AMF node successfully sends a DOWNLINK RAN EARLY STATUS TRANSFER message that contains mandatory IEs. +#NGAP_TestCases.TC_NGAP_AMF_MMP_09 + +# Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. +#NGAP_TestCases.TC_NGAP_AMF_NAS_01 +# Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF. +#NGAP_TestCases.TC_NGAP_AMF_NAS_02 + +# Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_01 +# Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_02 +# Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_03 +# Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_04 +# Verify that the AMF node successfully processes a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update. +#NGAP_TestCases.TC_NGAP_AMF_IMP_05 +# Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request. +#NGAP_TestCases.TC_NGAP_AMF_IMP_06 +# Verify that the IUT can send a AMF CONFIGURATION UPDATE message to the AMF. +#NGAP_TestCases.TC_NGAP_AMF_IMP_07 +# Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset. +#NGAP_TestCases.TC_NGAP_AMF_IMP_08 +# Verify that the AMF can send a ERROR INDICATION to the GNB when a error occurs. +#NGAP_TestCases.TC_NGAP_AMF_IMP_09 +# Verify that the AMF can send a AMF STATUS INDICATION to the GNB when a error occurs. +#NGAP_TestCases.TC_NGAP_AMF_IMP_10 +# Verify that the AMF can send a OVERLOAD START to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_IMP_11 +# Verify that the AMF can send a OVERLOAD STOP to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_IMP_12 + +# Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_AMF_WTP_01 +#Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_AMF_WTP_02 + +# Verify that the IUT can send a TRACE_START to initiate a trace session for a UE. +#NGAP_TestCases.TC_NGAP_AMF_TRP_01 +# Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE. +#NGAP_TestCases.TC_NGAP_AMF_TRP_02 + +# Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure. +#NGAP_TestCases.TC_NGAP_AMF_UBP_01 +# Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping. +#NGAP_TestCases.TC_NGAP_AMF_URP_02 + +# Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER. +#NGAP_TestCases.TC_NGAP_AMF_RIP_01 + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 -- GitLab From 78e3d703e2ebe64e0c44b1a616a7b1e214d04812 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 14 Jan 2026 12:10:55 +0100 Subject: [PATCH 035/151] Minor bug fixed --- titan-test-system-framework | 2 +- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/titan-test-system-framework b/titan-test-system-framework index 5babbea..3f542e0 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit 5babbea3f94b54c322ba8fba42e6b6c6a16270be +Subproject commit 3f542e05e054a605c110d0b0b62908057c7203b2 diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index ccb6fbc..286ed3c 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -120,7 +120,7 @@ module Lib_NG_NAS_Security_Functions { var integer v := oct2int(p_previous_nas_count_dl); v := v + 1; p_previous_nas_count_dl := int2oct(v, 4); - p_previous_nas_count_dl := p_previous_nas_count_dl & int2oct(0x00FFFFFF, 4); // Use 24bits only + p_previous_nas_count_dl := bit2oct(oct2bit(p_previous_nas_count_dl) and4b oct2bit('00FFFFFF'O)); // Use 24bits only } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered) { // Check integrity var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); @@ -140,7 +140,7 @@ module Lib_NG_NAS_Security_Functions { var integer v := oct2int(p_previous_nas_count_dl); v := v + 1; p_previous_nas_count_dl := int2oct(v, 4); - p_previous_nas_count_dl := p_previous_nas_count_dl & int2oct(0x00FFFFFF, 4); // Use 24bits only + p_previous_nas_count_dl := bit2oct(oct2bit(p_previous_nas_count_dl) and4b oct2bit('00FFFFFF'O)); // Use 24bits only // Decyphering var octetstring v_cleartextString; v_cleartextString := fx_NG_NasDeciphering(v_message.security_Protected_Nas_Message.plainNASMessage, @@ -226,7 +226,7 @@ module Lib_NG_NAS_Security_Functions { var integer v := oct2int(p_previous_nas_count_ul); v := v + 1; p_previous_nas_count_ul := int2oct(v, 4); - p_previous_nas_count_ul := p_previous_nas_count_ul & int2oct(0x00FFFFFF, 4); // Use 24bits only + p_previous_nas_count_ul := bit2oct(oct2bit(p_previous_nas_count_ul) and4b oct2bit('00FFFFFF'O)); // Use 24bits only } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected) { // TODO Check integrity } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) { @@ -251,7 +251,7 @@ module Lib_NG_NAS_Security_Functions { var integer v := oct2int(p_previous_nas_count_ul); v := v + 1; p_previous_nas_count_ul := int2oct(v, 4); - p_previous_nas_count_ul := p_previous_nas_count_ul & int2oct(0x00FFFFFF, 4); // Use 24bits only + p_previous_nas_count_ul := bit2oct(oct2bit(p_previous_nas_count_ul) and4b oct2bit('00FFFFFF'O)); // Use 24bits only } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered) { // TODO Check integrity var octetstring v_cleartextString; -- GitLab From d5c420aa46d38ed6e69eebb7d804518912b8ba88 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 15 Jan 2026 09:59:05 +0100 Subject: [PATCH 036/151] Review components dependencies --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 1 + etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 15 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 152 +++-- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 578 +++++++++--------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 392 ++++++------ ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn | 10 +- ttcn/AtsNGAP/NGAP_TestSystem.ttcn | 12 +- ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn | 51 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 50 +- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 14 +- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 41 +- .../lib_system/Lib_NG_NAS_Interface.ttcn | 16 - 12 files changed, 698 insertions(+), 634 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 9044351..a8b8bd4 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -3,6 +3,7 @@ NGAP_Pics.PICS_OFFLINE_MODE := true NGAP_Pics.PICS_NGAP_AMF_IUT := true +NGAP_Pics.PICS_NGAP_GNB_IUT := false # 5GRegAuthSec_deReg.pcap LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ index 64cc365..9ad3599 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -1,6 +1,7 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. +NGAP_Pics.PICS_OFFLINE_MODE := true NGAP_Pics.PICS_NGAP_GNB_IUT := true NGAP_Pics.PICS_NGAP_AMF_IUT := false @@ -20,7 +21,19 @@ LogEventTypes:= Yes [TESTPORT_PARAMETERS] # In this section you can specify parameters that are passed to Test Ports. -aMFNGAPComponent.N2_gNBaMF_P.params := "NGAP/ETH/PCAP_FILE(file=../captures/free5gc.pcap)" + +# Open5GS AMF IP and port +#system.NGAP_gNB_1.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" + +#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" + +system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" + +#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" [DEFINE] # In this section you can create macro definitions, diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index bd75582..512ffac 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -17,7 +17,7 @@ module NGAP_Steps { import from NGAP_IEs language "ASN.1:1997" all; import from LibNGAP_Steps all; - import from LibNGAP_Interface all; + import from NGAP_TestSystem all; import from LibNGAP_Templates all; import from LibNGAP_Functions all; import from LibNGAP_Pixits all; @@ -33,7 +33,7 @@ module NGAP_Steps { * This procedure will be use when the Test System acts as AMF (SUT is gNB) */ function f_NGAP_amf_init() - runs on NGAPComponent { + runs on aMFNGAPComponent { // Defaults vc_default_ngap := activate (a_defaultNGAP()); @@ -53,7 +53,7 @@ module NGAP_Steps { * This procedure will be use when the Test System acts as gNB (SUT is AMF) */ function f_NGAP_gnb_init() - runs on NGAPComponent { + runs on gNBNGAPComponent { // Defaults vc_default_ngap := activate (a_defaultNGAP()); @@ -72,7 +72,7 @@ module NGAP_Steps { * @desc This is a test step that init global variables */ function f_NGAP_gnb_init2() - runs on NGAPComponent { + runs on gNBNGAPComponent { // Defaults vc_default_ngap := activate (a_defaultNGAP()); @@ -94,7 +94,7 @@ module NGAP_Steps { /** * @desc */ - function f_preamble_NGAP_AMF() runs on NGAPComponent { + function f_preamble_NGAP_AMF() runs on aMFNGAPComponent { var default v_def_ngap_; f_NGAP_amf_init(); @@ -104,7 +104,7 @@ module NGAP_Steps { /** * @desc */ - function f_preamble_NGAP_gNB() runs on NGAPComponent { + function f_preamble_NGAP_gNB() runs on gNBNGAPComponent { var default v_def_ngap_; f_NGAP_gnb_init(); @@ -114,7 +114,7 @@ module NGAP_Steps { /** * @desc */ - function f_preamble_NGAP_gNB2() runs on NGAPComponent { + function f_preamble_NGAP_gNB2() runs on gNBNGAPComponent { var default v_def_ngap_; f_NGAP_gnb_init2(); @@ -128,7 +128,7 @@ module NGAP_Steps { /** * @desc */ - function f_postamble_NGAP_AMF() runs on NGAPComponent { + function f_postamble_NGAP_AMF() runs on aMFNGAPComponent { f_postambleNGAP_AMF(); // Deactivate defaults @@ -140,7 +140,7 @@ module NGAP_Steps { */ function f_postamble_NGAP_gNB( in template (value) Cause p_Cause := m_cause_nas(authentication_failure) - ) runs on NGAPComponent { + ) runs on gNBNGAPComponent { if (not(PICS_OFFLINE_MODE)) { f_postambleNGAP_gNB(p_Cause); } @@ -154,7 +154,7 @@ module NGAP_Steps { */ function f_postamble_NGAP_gNB2( in template (value) Cause p_Cause := m_cause_nas(authentication_failure) - ) runs on NGAPComponent { + ) runs on gNBNGAPComponent { if (not(PICS_OFFLINE_MODE)) { f_postambleNGAP_gNB(p_Cause); } @@ -178,7 +178,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_amf_UE_Register() runs on NGAPComponent { + function f_NGAP_amf_UE_Register() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_Register"); f_await_NGSetupRequest_send_NGSetupRespone(); f_await_registration_request(); @@ -187,7 +187,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_amf_UE_Authentication() runs on NGAPComponent { + function f_NGAP_amf_UE_Authentication() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_Authentication"); f_send_authentication_request_await_authentication_response(); } // End of function f_NGAP_amf_UE_Authentication @@ -195,7 +195,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_amf_UE_SecurityMode() runs on NGAPComponent { + function f_NGAP_amf_UE_SecurityMode() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_SecurityMode"); f_send_securitymode_command_await_securitymode_complete(); } // End of function f_NGAP_amf_UE_SecurityMode @@ -203,84 +203,84 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_amf_UE_PDU_ResourceSetup() runs on NGAPComponent { + function f_NGAP_amf_UE_PDU_ResourceSetup() runs on aMFNGAPComponent { //FIXME: Implementation of PDU session resource setup } // End of function f_NGAP_amf_UE_PDU_ResourceSetup /** * @desc */ - function f_NGAP_amf_UE_NoLongerAvailable() runs on NGAPComponent { - //FIXME: Implementation of PDU not longer available + function f_NGAP_amf_UE_NoLongerAvailable() runs on aMFNGAPComponent { + //FIXME: Implementation of PDU not longer available } // End of function f_NGAP_amf_UE_NoLongerAvailable /** * @desc The IUT entity indicate the initiation "of a Handover Required procedure" */ - function f_NGAP_amf_UE_MMP_Initiate_Handover() runs on NGAPComponent { + function f_NGAP_amf_UE_MMP_Initiate_Handover() runs on aMFNGAPComponent { //FIXME: Implementation of Handover init } // End of function f_NGAP_amf_UE_MMP_Initiate_Handover /** * @desc */ - function f_NGAP_amf_UE_MMP_Initiate_Handover_Completed() runs on NGAPComponent { + function f_NGAP_amf_UE_MMP_Initiate_Handover_Completed() runs on aMFNGAPComponent { //FIXME: Implementation of Handover init completed } // End of function f_NGAP_amf_UE_MMP_Initiate_Handover_Completed /** * @desc */ - function f_NGAP_amf_UE_MMP_Handover_Completed() runs on NGAPComponent { + function f_NGAP_amf_UE_MMP_Handover_Completed() runs on aMFNGAPComponent { //FIXME: Implementation of Handover completed } // End of function f_NGAP_amf_UE_MMP_Handover_Completed /** * @desc */ - function f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover() runs on NGAPComponent { + function f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover() runs on aMFNGAPComponent { //FIXME: Implementation of Handover init cancelled } // End of function f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover /** * @desc */ - function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer() runs on NGAPComponent { + function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer() runs on aMFNGAPComponent { //FIXME: Implementation of initiate uplink RAN xfer } // End of function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer /** * @desc */ - function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer() runs on NGAPComponent { + function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer() runs on aMFNGAPComponent { //FIXME: Implementation of initiate an early uplink RAN xfer } // End of function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer /** * @desc */ - function f_NGAP_amf_UE_NAS_Initiate() runs on NGAPComponent { + function f_NGAP_amf_UE_NAS_Initiate() runs on aMFNGAPComponent { //FIXME: Implementation of a NAS procedure } // End of function f_NGAP_amf_UE_NAS_Initiate /** * @desc */ - function f_NGAP_amf_UE_RRC_UL_Message() runs on NGAPComponent { + function f_NGAP_amf_UE_RRC_UL_Message() runs on aMFNGAPComponent { //FIXME: Implementation of an RRC UL message delivery } // End of function f_NGAP_amf_UE_RRC_UL_Message /** * @desc */ - function f_NGAP_amf_UE_RRC_UL_Message_Failure() runs on NGAPComponent { + function f_NGAP_amf_UE_RRC_UL_Message_Failure() runs on aMFNGAPComponent { //FIXME: Implementation of an RRC UL message delivery failure } // End of function f_NGAP_amf_UE_RRC_UL_Message_Failure /** * @desc */ - function f_NGAP_amf_isTransitioningTo_RRC_INACTIVE() runs on NGAPComponent { + function f_NGAP_amf_isTransitioningTo_RRC_INACTIVE() runs on aMFNGAPComponent { //FIXME: Implementation of an UE transitioning into the RRC_INACTIVE state } // End of function f_NGAP_amf_isTransitioningTo_RRC_INACTIVE @@ -289,7 +289,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_Register() runs on NGAPComponent { + function f_NGAP_gnb_UE_Register() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_Register"); if (PICS_OFFLINE_MODE) { f_await_NGSetupRequest_await_NGSetupRespone(); @@ -304,7 +304,13 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_Authentication() runs on NGAPComponent { + function f_NGAP_gnb_UE_NAS_Initiate() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_NAS_Initiate + + /** + * @desc + */ + function f_NGAP_gnb_UE_Authentication() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_Authentication"); if (PICS_OFFLINE_MODE) { f_await_authentication_request_await_authentication_response(); @@ -317,7 +323,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_SecurityMode() runs on NGAPComponent { + function f_NGAP_gnb_UE_SecurityMode() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_SecurityMode"); if (PICS_OFFLINE_MODE) { f_await_securitymode_command_await_securitymode_complete(); @@ -330,21 +336,28 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_Not_Available() runs on NGAPComponent { + function f_NGAP_gnb_UE_Not_Available() runs on gNBNGAPComponent { //FIXME: Implementation of UE not available } // End of function f_NGAP_gnb_UE_Not_Available /** * @desc */ - function f_NGAP_gnb_UE_Handover_Required() runs on NGAPComponent { + function f_NGAP_gnb_UE_Handover_Required() runs on gNBNGAPComponent { //FIXME: Implementation of UE handover required } // End of function f_NGAP_gnb_UE_Handover_Required /** * @desc */ - function f_NGAP_gnb_UE_InitialContextSetup() runs on NGAPComponent { + function f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed() runs on gNBNGAPComponent { + //FIXME: Implementation of UE handover completed + } // End of function f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed + + /** + * @desc + */ + function f_NGAP_gnb_UE_InitialContextSetup() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_InitialContextSetup"); if (PICS_OFFLINE_MODE) { f_await_initial_context_setup_request_await_initial_context_setup_resonse(); @@ -353,7 +366,7 @@ module NGAP_Steps { } } // End of function f_NGAP_gnb_UE_InitialContextSetup - function f_NGAP_gnb_RegistrationComplete() runs on NGAPComponent { + function f_NGAP_gnb_RegistrationComplete() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_RegistrationComplete"); if (PICS_OFFLINE_MODE) { f_await_registration_complete(); @@ -365,7 +378,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_Has_EstablishedContextInproperly() runs on NGAPComponent return boolean { + function f_NGAP_gnb_UE_Has_EstablishedContextInproperly() runs on gNBNGAPComponent return boolean { if (not(isbound(vc_initialContextSetupRequest))) { log("f_NGAP_gnb_UE_Has_EstablishedContextInproperly: vc_initialContextSetupRequest is not bound"); return false; @@ -378,7 +391,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_HasPendingDataTransmission() runs on NGAPComponent return boolean { + function f_NGAP_gnb_UE_HasPendingDataTransmission() runs on gNBNGAPComponent return boolean { //FIXME: Implementation of UE has pending data transmission leading to failed context suspension return false; } // End of function f_NGAP_gnb_UE_HasPendingDataTransmission @@ -386,7 +399,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest() runs on NGAPComponent { + function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest"); if (PICS_OFFLINE_MODE) { f_await_session_establishment_request(); @@ -398,7 +411,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_PDU_SessionEstablishmentAccept() runs on NGAPComponent { + function f_NGAP_gnb_UE_PDU_SessionEstablishmentAccept() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_PDU_SessionEstablishmentAccept"); if (PICS_OFFLINE_MODE) { f_await_session_establishment_accept(); @@ -407,7 +420,7 @@ module NGAP_Steps { } } // End of function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest - function f_NGAP_gnb_UE_PDU_SessionResourceSetup() runs on NGAPComponent { + function f_NGAP_gnb_UE_PDU_SessionResourceSetup() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_PDU_SessionResourceSetup"); if (PICS_OFFLINE_MODE) { f_await_session_resource_setup_request_await_session_resource_setup_response(); @@ -421,14 +434,14 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_PDU_ResourceSetup() runs on NGAPComponent { + function f_NGAP_gnb_UE_PDU_ResourceSetup() runs on gNBNGAPComponent { //FIXME: Implementation of PDU session resource setup } // End of function f_NGAP_gnb_UE_PDU_ResourceSetup /** * @desc */ - function f_NGAP_gnb_UE_Has_Suspended_Context() runs on NGAPComponent return boolean { + function f_NGAP_gnb_UE_Has_Suspended_Context() runs on gNBNGAPComponent return boolean { //FIXME: Implementation of UE has suspended context return false; } // End of function f_NGAP_amf_UE_hasSuspendedContext @@ -436,10 +449,65 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_gnb_UE_alreadyPreparedHandover() runs on NGAPComponent { - //FIXME: Implementation of UE halready prepared Handover + function f_NGAP_gnb_UE_alreadyPreparedHandover() runs on gNBNGAPComponent { + //FIXME: Implementation of UE already prepared Handover } // End of function f_NGAP_amf_UE_hasSuspendedContext + /** + * @desc + */ + function f_NGAP_gnb_UE_NoLongerAvailable() runs on gNBNGAPComponent { + //FIXME: Implementation of UE already prepared Handover + } // End of function f_NGAP_gnb_UE_NoLongerAvailable + + /** + * @desc + */ + function f_NGAP_gnb_UE_MMP_Handover_Completed() runs on gNBNGAPComponent { + //FIXME: Implementation of UE handover completed + } // End of function f_NGAP_gnb_UE_MMP_Handover_Completed + + /** + * @desc + */ + function f_NGAP_gnb_isTransitioningTo_RRC_INACTIVE() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_isTransitioningTo_RRC_INACTIVE + + /** + * @desc + */ + function f_NGAP_gnb_UE_MMP_Initiate_Handover() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_MMP_Initiate_Handover + + /** + * @desc + */ + function f_NGAP_gnb_UE_MMP_Cancel_Initiated_Handover() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_MMP_Cancel_Initiated_Handover + + /** + * @desc + */ + function f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer + + /** + * @desc + */ + function f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer + + /** + * @desc + */ + function f_NGAP_gnb_UE_RRC_UL_Message() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_RRC_UL_Message + + /** + * @desc + */ + function f_NGAP_gnb_UE_RRC_UL_Message_Failure() runs on gNBNGAPComponent { + } // End of function f_NGAP_gnb_UE_RRC_UL_Message_Failure }//end group BehaviorFunctions diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 7d8d106..8148110 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -35,7 +35,7 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_or_aMF_functionName_01 */ - function f_TC_NGAP_gNB_or_aMF_functionName_01() runs on NGAPComponent { + function f_TC_NGAP_gNB_or_aMF_functionName_01() runs on gNBNGAPComponent { // Local variables // Preamble @@ -68,12 +68,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_01 */ - function f_TC_NGAP_GNB_PDU_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -155,12 +155,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_02 */ - function f_TC_NGAP_GNB_PDU_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -267,12 +267,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_03 */ - function f_TC_NGAP_GNB_PDU_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); //f_await_NGSetupRequest_send_NGSetupRespone + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); //f_await_NGSetupRequest_send_NGSetupRespone f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -413,12 +413,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_04 */ - function f_TC_NGAP_GNB_PDU_04() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_04() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -501,13 +501,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_05 */ - function f_TC_NGAP_GNB_PDU_05() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_05() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -570,13 +570,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_06 */ - function f_TC_NGAP_GNB_PDU_06() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_06() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -653,13 +653,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_07 */ - function f_TC_NGAP_GNB_PDU_07() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_07() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -759,13 +759,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_10 */ - function f_TC_NGAP_GNB_PDU_10() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_10() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -842,13 +842,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_08 */ - function f_TC_NGAP_GNB_PDU_08() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_08() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -888,13 +888,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_PDU_09 */ - function f_TC_NGAP_GNB_PDU_09() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_PDU_09() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -945,12 +945,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_01 */ - function f_TC_NGAP_GNB_CMP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_01() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1038,12 +1038,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_02 */ - function f_TC_NGAP_GNB_CMP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_02() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1087,12 +1087,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_03 */ - function f_TC_NGAP_GNB_CMP_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_03() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1186,12 +1186,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_04 */ - function f_TC_NGAP_GNB_CMP_04() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_04() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1281,11 +1281,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_05 */ - function f_TC_NGAP_GNB_CMP_05() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_05() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1409,12 +1409,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_06 */ - function f_TC_NGAP_GNB_CMP_06() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_06() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_gnb_UE_Has_EstablishedContextInproperly(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + if (not(f_NGAP_gnb_UE_Has_EstablishedContextInproperly())) { + f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + log("*** " & __SCOPE__ & ": INFO: Preamble failure. ***"); + } else { + f_selfOrClientSyncAndVerdict(c_prDone, e_success); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + } f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1508,11 +1514,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_GNB_CMP_07 */ - function f_TC_NGAP_GNB_CMP_07() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_07() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1551,11 +1557,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_GNB_CMP_08 */ - function f_TC_NGAP_GNB_CMP_08() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_08() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1592,11 +1598,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_09 */ - function f_TC_NGAP_GNB_CMP_09() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_09() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1639,12 +1645,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_10 */ - function f_TC_NGAP_GNB_CMP_10() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_10() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_NoLongerAvailable(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_NoLongerAvailable(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1683,13 +1689,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_11 */ - function f_TC_NGAP_GNB_CMP_11() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_11() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_UE_alreadyPreparedHandover(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1725,11 +1731,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_12 */ - function f_TC_NGAP_GNB_CMP_12() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_12() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete @@ -1769,11 +1775,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_13 */ - function f_TC_NGAP_GNB_CMP_13() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_13() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1828,12 +1834,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_14 */ - function f_TC_NGAP_GNB_CMP_14() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_14() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_isTransitioningTo_RRC_INACTIVE(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_isTransitioningTo_RRC_INACTIVE(); // TODO: isTransitioningTo the RRC_INACTIVE @@ -1878,11 +1884,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_15 */ - function f_TC_NGAP_GNB_CMP_15() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_15() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete @@ -1928,11 +1934,11 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_16 */ - function f_TC_NGAP_GNB_CMP_16() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_16() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -1968,16 +1974,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for f_TC_NGAP_GNB_CMP_17 */ - function f_TC_NGAP_GNB_CMP_17() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CMP_17() runs on gNBNGAPComponent { // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_gnb_UE_Has_Suspended_Context(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + if (not(f_NGAP_gnb_UE_Has_Suspended_Context())) { + f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + log("*** " & __SCOPE__ & ": INFO: Preamble failure. ***"); + } else { + f_selfOrClientSyncAndVerdict(c_prDone, e_success); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + } // Body action("Trigger a UE context resume request"); @@ -2008,13 +2016,13 @@ module NGAP_TCFunctions { //8.4.1 group Handover_Preparation{ - function f_TC_NGAP_GNB_MMP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2050,13 +2058,13 @@ module NGAP_TCFunctions { //8.4.2 group Handover_Resource_Allocation{ - function f_TC_NGAP_GNB_MMP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2133,18 +2141,18 @@ module NGAP_TCFunctions { } // End of function f_TC_NGAP_GNB_MMP_02 - function f_TC_NGAP_GNB_MMP_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_NoLongerAvailable(); + f_NGAP_gnb_UE_NoLongerAvailable(); f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequest( @@ -2209,13 +2217,13 @@ module NGAP_TCFunctions { } // End of function f_TC_NGAP_GNB_MMP_03 - function f_TC_NGAP_GNB_MMP_04() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_04() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2323,18 +2331,18 @@ module NGAP_TCFunctions { } // End of function f_TC_NGAP_GNB_MMP_04 - function f_TC_NGAP_GNB_MMP_05() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_05() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_NoLongerAvailable(); + f_NGAP_gnb_UE_NoLongerAvailable(); f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequest( @@ -2413,18 +2421,18 @@ module NGAP_TCFunctions { } // End of function f_TC_NGAP_GNB_MMP_05 - function f_TC_NGAP_GNB_MMP_06() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_06() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_NoLongerAvailable(); + f_NGAP_gnb_UE_NoLongerAvailable(); f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequest( @@ -2494,15 +2502,15 @@ module NGAP_TCFunctions { //8.4.3 group Handover_Notification{ - function f_TC_NGAP_GNB_MMP_07() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_07() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); - f_NGAP_amf_UE_MMP_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_gnb_UE_MMP_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2529,15 +2537,15 @@ module NGAP_TCFunctions { //8.4.4 group Path_Switch_Request{ - function f_TC_NGAP_GNB_MMP_08() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_08() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); - f_NGAP_amf_UE_MMP_Handover_Completed(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_gnb_UE_MMP_Handover_Completed(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2563,18 +2571,18 @@ module NGAP_TCFunctions { //8.4.5 group Handover_Cancellation{ - function f_TC_NGAP_GNB_MMP_09() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_09() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_Handover(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_Handover(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover(); + f_NGAP_gnb_UE_MMP_Cancel_Initiated_Handover(); f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_HandoverCancel( @@ -2597,18 +2605,18 @@ module NGAP_TCFunctions { //8.4.6 group Uplink_RAN_Status_Transfer{ - function f_TC_NGAP_GNB_MMP_10() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_10() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_MMP_Cancel_Initiated_Handover(); + f_NGAP_gnb_UE_MMP_Cancel_Initiated_Handover(); f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_UplinkRANStatusTransfer( @@ -2638,18 +2646,18 @@ module NGAP_TCFunctions { //8.4.9 group Uplink_RAN_Early_Status_Transfer{ - function f_TC_NGAP_GNB_MMP_11() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_MMP_11() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Status_Transfer(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer(); + f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer(); f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_UplinkRANEarlyStatusTransfer( @@ -2685,13 +2693,13 @@ module NGAP_TCFunctions { //8.6.1 group Initial_UE_Message{ - function f_TC_NGAP_GNB_NAS_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_NAS_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_NAS_Initiate(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_NAS_Initiate(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2719,17 +2727,17 @@ module NGAP_TCFunctions { //8.6.3 group Uplink_NAS_Transport{ - function f_TC_NGAP_GNB_NAS_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_NAS_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_RRC_UL_Message(); + f_NGAP_gnb_UE_RRC_UL_Message(); f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_UplinkNASTransport( @@ -2751,17 +2759,17 @@ module NGAP_TCFunctions { //8.6.4 group NAS_Non_Delivery_Indication{ - function f_TC_NGAP_GNB_NAS_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_NAS_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_amf_UE_RRC_UL_Message_Failure(); + f_NGAP_gnb_UE_RRC_UL_Message_Failure(); f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_NASNonDeliveryIndication( @@ -2792,12 +2800,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_IMP_01 */ - function f_TC_NGAP_GNB_IMP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_IMP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2845,12 +2853,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_IMP_02 */ - function f_TC_NGAP_GNB_IMP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_IMP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2895,12 +2903,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_IMP_03 */ - function f_TC_NGAP_GNB_IMP_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_IMP_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2986,12 +2994,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_IMP_04 */ - function f_TC_NGAP_GNB_IMP_04() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_IMP_04() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3081,12 +3089,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_IMP_05 */ - function f_TC_NGAP_GNB_IMP_05() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_IMP_05() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3126,12 +3134,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_IMP_06 */ - function f_TC_NGAP_GNB_IMP_06() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_IMP_06() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3174,12 +3182,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_CTP_01 */ - function f_TC_NGAP_GNB_CTP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_CTP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3230,7 +3238,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } @@ -3245,12 +3253,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_WTP_01 */ - function f_TC_NGAP_GNB_WTP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_WTP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3288,12 +3296,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_WTP_02 */ - function f_TC_NGAP_GNB_WTP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_WTP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3335,12 +3343,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_WTP_03 */ - function f_TC_NGAP_GNB_WTP_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_WTP_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3380,12 +3388,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_WTP_04 */ - function f_TC_NGAP_GNB_WTP_04() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_WTP_04() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + //f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3422,12 +3430,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_WTP_05 */ - function f_TC_NGAP_GNB_WTP_05() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_WTP_05() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3462,12 +3470,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_NTP_01 */ - function f_TC_NGAP_GNB_NTP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_NTP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3499,12 +3507,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_NTP_02 */ - function f_TC_NGAP_GNB_NTP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_NTP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3540,13 +3548,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_TRP_01 */ - function f_TC_NGAP_GNB_TRP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_TRP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3599,13 +3607,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_TRP_02 */ - function f_TC_NGAP_GNB_TRP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_TRP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3649,13 +3657,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_TRP_03 */ - function f_TC_NGAP_GNB_TRP_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_TRP_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3700,12 +3708,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_LRP_01 */ - function f_TC_NGAP_GNB_LRP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_LRP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3761,12 +3769,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_LRP_02 */ - function f_TC_NGAP_GNB_LRP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_LRP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3814,13 +3822,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_URP_01 */ - function f_TC_NGAP_GNB_URP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_URP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3855,13 +3863,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_URP_02 */ - function f_TC_NGAP_GNB_URP_02() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_URP_02() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3903,13 +3911,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_URP_03 */ - function f_TC_NGAP_GNB_URP_03() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_URP_03() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_bng_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3945,13 +3953,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_DRP_01 */ - function f_TC_NGAP_GNB_DRP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_DRP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -3989,13 +3997,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_gNB_RIP_01 */ - function f_TC_NGAP_GNB_RIP_01() runs on aMFNGAPComponent { + function f_TC_NGAP_GNB_RIP_01() runs on gNBNGAPComponent { // Local variables // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + f_NGAP_gnb_init(); + f_NGAP_gnb_UE_Register(); + //f_NGAP_gnb_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4078,7 +4086,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4128,7 +4136,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4176,7 +4184,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4269,7 +4277,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4355,7 +4363,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4976,7 +4984,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5029,7 +5037,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5058,7 +5066,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5090,7 +5098,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5115,7 +5123,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5153,7 +5161,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5202,7 +5210,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5236,7 +5244,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5286,7 +5294,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5332,7 +5340,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } @@ -5385,7 +5393,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5439,7 +5447,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5544,7 +5552,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5613,7 +5621,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5714,7 +5722,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5820,7 +5828,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5884,7 +5892,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5946,7 +5954,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6014,7 +6022,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6060,7 +6068,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6151,7 +6159,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6202,7 +6210,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6238,7 +6246,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6274,7 +6282,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6327,7 +6335,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6366,7 +6374,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6414,7 +6422,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6449,7 +6457,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6491,7 +6499,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6534,7 +6542,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6576,7 +6584,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6624,7 +6632,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6669,7 +6677,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6714,7 +6722,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6764,7 +6772,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 92e314e..578632b 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -48,10 +48,10 @@ module NGAP_TestCases { /** * @desc Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE SETUP REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE SETUP RESPONSE for successfully established PDU session */ - testcase TC_NGAP_GNB_PDU_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ @@ -60,7 +60,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_01()); @@ -75,10 +75,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value." */ - testcase TC_NGAP_GNB_PDU_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ @@ -87,7 +87,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_02()); @@ -102,10 +102,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP " */ - testcase TC_NGAP_GNB_PDU_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ @@ -114,7 +114,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_03()); @@ -129,10 +129,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a QoS Flow Setup Request List IE in the PDU Session Resource Setup Request Transfer IE including at least one Non-GBR QoS flow but the PDU Session Aggregate Maximum Bit Rate IE is not present. " */ - testcase TC_NGAP_GNB_PDU_04() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_04() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ @@ -141,7 +141,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_04()); @@ -161,10 +161,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND contains mandatory IEs and answers with PDU SESSION RESOURCE RELEASE RESPONSE to release PDU session." */ - testcase TC_NGAP_GNB_PDU_05() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_05() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ @@ -173,7 +173,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_05()); @@ -188,10 +188,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND containing multiple PDU Session ID IEs set to the same value and ignore the duplication." */ - testcase TC_NGAP_GNB_PDU_06() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_06() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ @@ -200,7 +200,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_06()); @@ -219,10 +219,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE MODIFY REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE MODIFY RESPONSE for successfully modified PDU session." */ - testcase TC_NGAP_GNB_PDU_07() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_07() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ @@ -231,7 +231,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_07()); @@ -246,10 +246,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node reports the modification of the corresponding PDU session as failed if a PDU SESSION RESOURCE MODIFY REQUEST contains several PDU Session ID IEs set to the same value." */ - testcase TC_NGAP_GNB_PDU_10() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_10() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ @@ -258,7 +258,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_10()); @@ -279,10 +279,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_NOTIFY that already established QoS flow or PDU session for given UE are release." */ - testcase TC_NGAP_GNB_PDU_08() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_08() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_4)){ @@ -291,7 +291,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_08()); @@ -310,10 +310,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_INDICATION to request modification of established PDU session." */ - testcase TC_NGAP_GNB_PDU_09() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_PDU_09() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_5)){ @@ -322,7 +322,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_PDU_09()); @@ -344,10 +344,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains optional PDU Session Resource Setup Request List field mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." */ - testcase TC_NGAP_GNB_CMP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ @@ -356,7 +356,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_01()); @@ -371,10 +371,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." */ - testcase TC_NGAP_GNB_CMP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ @@ -383,7 +383,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_02()); @@ -398,10 +398,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Trace Activation and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." */ - testcase TC_NGAP_GNB_CMP_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ @@ -410,7 +410,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_03()); @@ -425,10 +425,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Mobility Restriction List and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." */ - testcase TC_NGAP_GNB_CMP_04() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_04() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ @@ -437,7 +437,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_04()); @@ -452,10 +452,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with different optional fields and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." */ - testcase TC_NGAP_GNB_CMP_05() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_05() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ @@ -464,7 +464,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_05()); @@ -479,10 +479,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with failed PDU session." */ - testcase TC_NGAP_GNB_CMP_06() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_06() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ @@ -491,7 +491,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_06()); @@ -510,10 +510,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully requests the AMF to release the UE-associated logical NG-connection." */ - testcase TC_NGAP_GNB_CMP_07() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_07() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_2)) { @@ -522,7 +522,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_07()); @@ -541,10 +541,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND that contains both the AMF UE NGAP ID IE and the RAN UE NGAP ID IE and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context."" */ - testcase TC_NGAP_GNB_CMP_08() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_08() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ @@ -553,7 +553,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_08()); @@ -568,10 +568,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND where only the AMF UE NGAP ID IE is available and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context." */ - testcase TC_NGAP_GNB_CMP_09() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_09() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ @@ -580,7 +580,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_09()); @@ -599,10 +599,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION FAILURE because the UE is no longer available." */ - testcase TC_NGAP_GNB_CMP_10() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_10() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ @@ -611,7 +611,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_10()); @@ -627,10 +627,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." */ - testcase TC_NGAP_GNB_CMP_11() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_11() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ @@ -639,7 +639,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_11()); @@ -655,10 +655,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains optional fields Security Key and Security Capabilities and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." */ - testcase TC_NGAP_GNB_CMP_12() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_12() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ @@ -667,7 +667,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_12()); @@ -683,10 +683,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains different optional fields and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." */ - testcase TC_NGAP_GNB_CMP_13() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_13() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ @@ -695,7 +695,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_13()); @@ -715,10 +715,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a RRC INACTIVE TRANSITION REPORT that contains mandatory IEs" */ - testcase TC_NGAP_GNB_CMP_14() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_14() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_5)){ @@ -727,7 +727,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_14()); @@ -752,10 +752,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a RAN CP Relocation Indication that contains mandatory IEs" */ - testcase TC_NGAP_GNB_CMP_15() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_15() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_8)){ @@ -764,7 +764,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_15()); @@ -789,10 +789,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a UE CONTEXT SUSPEND REQUEST contains mandatory IEs" */ - testcase TC_NGAP_GNB_CMP_16() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_16() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_11)){ @@ -801,7 +801,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_16()); @@ -819,10 +819,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a UE CONTEXT RESUME REQUEST contains mandatory IEs" */ - testcase TC_NGAP_GNB_CMP_17() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_17() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_12)){ @@ -831,7 +831,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CMP_17()); @@ -853,10 +853,10 @@ module NGAP_TestCases { /** * @desc Verify that the IUT can send a HANDOVER REQUIRED message containing mandatory IEs. */ - testcase TC_NGAP_GNB_MMP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ @@ -865,7 +865,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_01()); @@ -881,13 +881,13 @@ module NGAP_TestCases { //8.4.2 group Handover_Resource_Allocation{ - /** + /**sychronization * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. */ - testcase TC_NGAP_GNB_MMP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ @@ -896,7 +896,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_02()); @@ -911,10 +911,10 @@ module NGAP_TestCases { /** * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST FAILURE because the UE is not longer available. */ - testcase TC_NGAP_GNB_MMP_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ @@ -923,7 +923,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_03()); @@ -938,10 +938,10 @@ module NGAP_TestCases { /** * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. */ - testcase TC_NGAP_GNB_MMP_04() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_04() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ @@ -950,7 +950,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_04()); @@ -965,10 +965,10 @@ module NGAP_TestCases { /** * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs within the Handover Request Transfer IEs and answers with correct HANDOVER REQUEST ACKNOWLEDGE. */ - testcase TC_NGAP_GNB_MMP_05() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_05() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ @@ -977,7 +977,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_05()); @@ -992,10 +992,10 @@ module NGAP_TestCases { /** * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message for an intra-system handover and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. */ - testcase TC_NGAP_GNB_MMP_06() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_06() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ @@ -1004,7 +1004,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_06()); @@ -1023,10 +1023,10 @@ module NGAP_TestCases { /** * @desc Verify that the AMF node successfully sends a HANDOVER NOTIFICATION message that contains mandatory IEs to the AMF. */ - testcase TC_NGAP_GNB_MMP_07() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_07() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_3)){ @@ -1035,7 +1035,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_07()); @@ -1054,10 +1054,10 @@ module NGAP_TestCases { /** * @desc Verify that the AMF node successfully sends a PATH SWITCH REQUEST message that contains mandatory IEs to the AMF. */ - testcase TC_NGAP_GNB_MMP_08() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_08() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_4)){ @@ -1066,7 +1066,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_08()); @@ -1085,10 +1085,10 @@ module NGAP_TestCases { /** * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. */ - testcase TC_NGAP_GNB_MMP_09() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_09() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_5)){ @@ -1097,7 +1097,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_09()); @@ -1116,10 +1116,10 @@ module NGAP_TestCases { /** * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. */ - testcase TC_NGAP_GNB_MMP_10() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_10() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_6)){ @@ -1128,7 +1128,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_10()); @@ -1153,10 +1153,10 @@ module NGAP_TestCases { /** * @desc Verify that the NG-RAN node successfully sends a UPLINK RAN EARLY STATUS TRANSFER message to the AMF. */ - testcase TC_NGAP_GNB_MMP_11() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_MMP_11() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_9)){ @@ -1165,7 +1165,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_MMP_11()); @@ -1196,10 +1196,10 @@ module NGAP_TestCases { /** * @desc Verify that the IUT can send an INITIAL UE MESSAGE to indicate the initiation of a NAS Transport procedure. */ - testcase TC_NGAP_GNB_NAS_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_NAS_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ @@ -1208,7 +1208,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_NAS_01()); @@ -1230,10 +1230,10 @@ module NGAP_TestCases { /** * @desc Verify that the IUT can send an UPLINK NAS TRANSPORT message to the AMF. */ - testcase TC_NGAP_GNB_NAS_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_NAS_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ @@ -1242,7 +1242,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_NAS_02()); @@ -1261,10 +1261,10 @@ module NGAP_TestCases { /** * @desc Verify that the IUT can send a NAS NON DELIVERY INDICATION message to the AMF. */ - testcase TC_NGAP_GNB_NAS_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_NAS_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ @@ -1273,7 +1273,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_NAS_03()); @@ -1298,10 +1298,10 @@ module NGAP_TestCases { /** * @desc "Verify that the GNB node successfully sends a NG SETUP REQEST message to the AMF." */ - testcase TC_NGAP_GNB_IMP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_1)){ @@ -1310,7 +1310,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_IMP_01()); @@ -1329,10 +1329,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a RAN CONFIGURATION UPDATE message to the AMF." */ - testcase TC_NGAP_GNB_IMP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_2)){ @@ -1341,7 +1341,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_IMP_02()); @@ -1360,10 +1360,10 @@ module NGAP_TestCases { /** * @desc "Verify that the GNB node successfully processes a AMF CONFIGURATION UPDATE message with AMF CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update." */ - testcase TC_NGAP_GNB_IMP_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_3)){ @@ -1372,7 +1372,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_IMP_03()); @@ -1387,10 +1387,10 @@ module NGAP_TestCases { /** * @desc "Verify that the GNB node can send a AMF CONFIGURATION UPDATE FAILURE." */ - testcase TC_NGAP_GNB_IMP_04() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_04() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_3)){ @@ -1399,7 +1399,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_IMP_04()); @@ -1418,10 +1418,10 @@ module NGAP_TestCases { /** * @desc "Verify that the GNB node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset." */ - testcase TC_NGAP_GNB_IMP_05() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_05() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_4)){ @@ -1430,7 +1430,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_IMP_05()); @@ -1449,10 +1449,10 @@ module NGAP_TestCases { /** * @desc "Verify that the GNB can send a ERROR INDICATION to the AMF when a error occurs." */ - testcase TC_NGAP_GNB_IMP_06() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_06() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_5)){ @@ -1461,7 +1461,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_IMP_06()); @@ -1492,10 +1492,10 @@ module NGAP_TestCases { /** * @desc Verify that the IUT can send an Uplink RAN Configuration Transfer message to transfer RAN configuration information to the AMF. */ - testcase TC_NGAP_GNB_CTP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CTP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_7_1)){ @@ -1504,7 +1504,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_CTP_01()); @@ -1556,10 +1556,10 @@ module NGAP_TestCases { /** * @desc Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing mandatory IEs and answers with WRITE-REPLACE WARNING RESPONSE to start broadcasting of warning messages. */ - testcase TC_NGAP_GNB_WTP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_WTP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ @@ -1568,7 +1568,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_WTP_01()); @@ -1583,10 +1583,10 @@ module NGAP_TestCases { /** * @desc "Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing Message Identifier IE and/or Serial Number IE different from those in the warning message being broadcast and if Concurent Warning Message Indicator is not present then IUT node answers with WRITE-REPLACE WARNING RESPONSE and replaces the warning message being broadcast with newly received one for that area." */ - testcase TC_NGAP_GNB_WTP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_WTP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ @@ -1595,7 +1595,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_WTP_02()); @@ -1614,10 +1614,10 @@ module NGAP_TestCases { /** * @desc "Verify that the NG-RAN node successfully processes a PWS CANCEL REQUEST containing mandatory IEs and answers with PWS CANCEL RESPONSE to cancel an already ongoing broadcast warning messages in all of the cells in the NG-RAN." */ - testcase TC_NGAP_GNB_WTP_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_WTP_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_2)){ @@ -1626,7 +1626,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_WTP_03()); @@ -1645,10 +1645,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PWS RESTART INDICATION to inform AMF that PWS information for some or all cells may be reloaded from the CBC if needed." */ - testcase TC_NGAP_GNB_WTP_04() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_WTP_04() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_3)){ @@ -1657,7 +1657,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_WTP_04()); @@ -1676,10 +1676,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PWS FAILURE INDICATION to inform AMF that ongoing PWS operation for one or more cells has failed." */ - testcase TC_NGAP_GNB_WTP_05() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_WTP_05() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_4)){ @@ -1688,7 +1688,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_WTP_05()); @@ -1709,10 +1709,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UPLINK_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." */ - testcase TC_NGAP_GNB_NTP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_NTP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ @@ -1721,7 +1721,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_NTP_01()); @@ -1736,10 +1736,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UPLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." */ - testcase TC_NGAP_GNB_NTP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_NTP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ @@ -1748,7 +1748,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_NTP_02()); @@ -1769,10 +1769,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that Trace Start procedure has failed due to an interaction with handover procedure." */ - testcase TC_NGAP_GNB_TRP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_TRP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_1) and (not PICS_A3_10_2)){ @@ -1781,7 +1781,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_TRP_01()); @@ -1803,10 +1803,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that a Deactivate Trace procedure has failed due to an interaction with handover procedure." */ - testcase TC_NGAP_GNB_TRP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_TRP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_2) and (not PICS_A3_10_3)){ @@ -1815,7 +1815,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_TRP_02()); @@ -1834,10 +1834,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a CELL_TRAFFIC_TRACE to send the allocated Trace Recording Session Reference and Trace Reference to AMF." */ - testcase TC_NGAP_GNB_TRP_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_TRP_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_4)){ @@ -1846,7 +1846,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_TRP_03()); @@ -1871,10 +1871,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a LOCATION REPORTING FAILURE INDICATION message after that contains mandatory IEs receiving a LOCATION REPORTING CONTROL message with two identical Location Reporting Reference IDs." */ - testcase TC_NGAP_GNB_LRP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_LRP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ @@ -1883,7 +1883,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_LRP_01()); @@ -1902,10 +1902,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a LOCATION REPORT message that contains mandatory IEs to provide the UE's current location." */ - testcase TC_NGAP_GNB_LRP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_LRP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ @@ -1914,7 +1914,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_LRP_02()); @@ -1942,10 +1942,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a UE_RADIO_CAPABILITY_INFO_INDICATION." */ - testcase TC_NGAP_GNB_URP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_URP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_1)){ @@ -1954,7 +1954,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_URP_01()); @@ -1973,10 +1973,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY CHECK RESPONSE message that contains mandatory IEs to provide the UE radio capabilities." */ - testcase TC_NGAP_GNB_URP_02() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_URP_02() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_2)){ @@ -1985,7 +1985,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_URP_02()); @@ -2004,10 +2004,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING REQUEST." */ - testcase TC_NGAP_GNB_URP_03() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_URP_03() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_3)){ @@ -2016,7 +2016,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_URP_03()); @@ -2038,10 +2038,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a SECONDARY RAT DATA USAGE REPORT." */ - testcase TC_NGAP_GNB_DRP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_DRP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_14_1)){ @@ -2050,7 +2050,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_DRP_01()); @@ -2072,10 +2072,10 @@ module NGAP_TestCases { /** * @desc Test objective "Verify that the IUT can send a UPLINK RIM INFORMATION TRANSFER." */ - testcase TC_NGAP_GNB_RIP_01() runs on aMFNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_RIP_01() runs on gNBNGAPComponent system TestAdapter { // Local variables - var aMFNGAPComponent v_ngap_amf; + var gNBNGAPComponent v_ngap_amf; // Test control if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_15_1)){ @@ -2084,7 +2084,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_amf); + f_cf_NGAP_gNB_Up(v_ngap_amf); // Start v_ngap_amf.start(f_TC_NGAP_GNB_RIP_01()); diff --git a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn index ec32877..e7adcec 100644 --- a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn @@ -23,12 +23,12 @@ module NGAP_TestConfiguration { group cfUp { /** - * @desc Creates test configuration of cf_NGAP_AMF - gNB is SUT + * @desc Creates test configuration of cf_NGAP_AMF - aMF is SUT * @param p_NGAPComponent_mme */ function f_cf_NGAP_aMF_Up( - out aMFNGAPComponent p_NGAPComponent_amf - ) runs on aMFNGAPComponent system TestAdapter { + out aMFNGAPComponent p_NGAPComponent_amf + ) runs on aMFNGAPComponent system TestAdapter { //Variables var FncRetCode v_ret := e_success; @@ -48,7 +48,7 @@ module NGAP_TestConfiguration { } // End of function f_cf_NGAP_AMF_Up /** - * @desc Creates test configuration of cf_NGAP_gNB - AMF is SUT + * @desc Creates test configuration of cf_NGAP_gNB - gNB is SUT * @param p_NGAPComponent_gnb */ function f_cf_NGAP_gNB_Up( @@ -110,7 +110,7 @@ module NGAP_TestConfiguration { * @desc Deletes configuration * @param */ - function f_cf_Down() runs on NGAPComponent system TestAdapter { + function f_cf_Down() runs on NGNASComponent system TestAdapter { // Deactivate all deactivate; // Unmap all diff --git a/ttcn/AtsNGAP/NGAP_TestSystem.ttcn b/ttcn/AtsNGAP/NGAP_TestSystem.ttcn index b435c17..1d42e80 100644 --- a/ttcn/AtsNGAP/NGAP_TestSystem.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestSystem.ttcn @@ -36,15 +36,21 @@ module NGAP_TestSystem { } // End of group TestSystemInterfaces - type component gNBNGAPComponent extends ServerSyncComp, NGAPComponent { + /** + * @desc The NGAP AMF component, gNodeB is SUT + */ + type component gNBNGAPComponent extends ServerSyncComp, NGNASComponent { //component variables } // End of type component gNBNGAPComponent - type component aMFNGAPComponent extends ServerSyncComp, NGAPComponent { + /** + * @desc The AMF NGAP component, ANF is SUT + */ + type component aMFNGAPComponent extends ServerSyncComp, NGNASComponent { //component variables } // End of type component aMFNGAPComponent - //type component NGAP extends ServerSyncComp, NGAPComponent { + //type component NGAP extends ServerSyncComp, NGNASComponent { // //component variables //} // End of component NGAP diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn index 62cbd00..e713ec6 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn @@ -14,9 +14,6 @@ module NG_NAS_TestSystem { // LibCommon import from LibCommon_Sync all; - // LibNGAP - //import from LibNGAP_Interface all; - // Lib_NG_NAS import from Lib_NG_NAS_Interface all; @@ -24,39 +21,21 @@ module NG_NAS_TestSystem { group TestComponents { - // group TestSystemInterfaces { - - // /** - // * @desc The test system interface - // */ - // type component TestAdapter { - - // port - // NGAPPort NGAP_AMF, - // NGAP_gNB_1, - // NGAP_gNB_2 - // } // End of type TestAdapter - - // } // End of group TestSystemInterfaces - - type component gNB_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { - //component variables - } // End of type component gNBNGAPComponent - - type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { - //component variables - } // End of type component gNBNGAPComponent - - //Not defined because tests implemented for network side - //type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { - // //component variables - //} // End of type component aMFNGAPComponent - - //type component NGAP extends ServerSyncComp, NGAPComponent { - // //component variables - //} // End of component NGAP - - } // End of group TestComponents + /** + * @desc The NGAP AMF component, AMF is SUT + */ + type component gNB_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { + //component variables + } // End of type component gNBNGAPComponent + + /** + * @desc The NGAP AMF component, gNodeB is SUT + */ + type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { + //component variables + } // End of type component gNBNGAPComponent + + } // End of group TestComponents } // End of group SystemConfiguration diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index fd0a8c0..afb40fe 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -28,7 +28,7 @@ module LibNGAP_Functions { /** * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ - function f_await_NGSetupRequest_send_NGSetupRespone() runs on NGAPComponent { + function f_await_NGSetupRequest_send_NGSetupRespone() runs on NGNASComponent { log(">>> f_await_NGSetupRequest_send_NGSetupRespone"); f_recv_NGAP_PDU( @@ -74,7 +74,7 @@ module LibNGAP_Functions { /** * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ - function f_send_NGSetupRequest_await_NGSetupRespone() runs on NGAPComponent { + function f_send_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGSetupRequest( @@ -125,7 +125,7 @@ module LibNGAP_Functions { /** * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ - function f_await_NGSetupRequest_await_NGSetupRespone() runs on NGAPComponent { + function f_await_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_NGSetupRequest( @@ -178,7 +178,7 @@ module LibNGAP_Functions { /** * @desc Function to send NAS NGSetupResponse message */ - function f_send_registration_request() runs on NGAPComponent { + function f_send_registration_request() runs on NGNASComponent { log(">>> f_send_registration_request"); // Send request for REGISTRATION_REQUEST @@ -208,7 +208,7 @@ module LibNGAP_Functions { /** * @desc Function to await NAS NGSetupResponse message */ - function f_await_registration_request() runs on NGAPComponent { + function f_await_registration_request() runs on NGNASComponent { log(">>> f_await_registration_request"); // Await request for REGISTRATION_REQUEST @@ -229,7 +229,7 @@ module LibNGAP_Functions { } } - function f_send_registration_complete() runs on NGAPComponent { + function f_send_registration_complete() runs on NGNASComponent { log(">>> f_send_registration_complete"); // Send request for REGISTRATION_COMPLETE @@ -250,7 +250,7 @@ module LibNGAP_Functions { ))); } - function f_await_registration_complete() runs on NGAPComponent { + function f_await_registration_complete() runs on NGNASComponent { log(">>> f_await_registration_complete"); // Await request for REGISTRATION_COMPLETE @@ -267,7 +267,7 @@ module LibNGAP_Functions { } } - function f_await_authentication_request_send_authentication_response() runs on NGAPComponent { + function f_await_authentication_request_send_authentication_response() runs on NGNASComponent { log(">>> f_await_authentication_request_send_authentication_response"); // Await request for DOWNLINK_NAS_TRANSPORT @@ -326,7 +326,7 @@ module LibNGAP_Functions { setverdict(pass); } - function f_await_authentication_request_await_authentication_response() runs on NGAPComponent { + function f_await_authentication_request_await_authentication_response() runs on NGNASComponent { log(">>> f_await_authentication_request_await_authentication_response"); // Await request for DOWNLINK_NAS_TRANSPORT @@ -388,7 +388,7 @@ module LibNGAP_Functions { setverdict(pass); } - function f_send_authentication_request_await_authentication_response() runs on NGAPComponent { + function f_send_authentication_request_await_authentication_response() runs on NGNASComponent { log(">>> f_send_authentication_request_await_authentication_response"); // TODO Prepare security context @@ -398,13 +398,13 @@ module LibNGAP_Functions { // TODO Await response for AUTHENTICATION_RESPONSE } - function f_send_securitymode_command_await_securitymode_complete() runs on NGAPComponent { + function f_send_securitymode_command_await_securitymode_complete() runs on NGNASComponent { // TODO Send request for SECURITY_MODE_COMMAND // TODO Receive response for SECURITY_MODE_COMPLETE } - function f_await_securitymode_command_send_securitymode_complete() runs on NGAPComponent { + function f_await_securitymode_command_send_securitymode_complete() runs on NGNASComponent { log(">>> f_await_securitymode_command_send_securitymode_complete"); // Await request for SECURITY_MODE_COMMAND @@ -461,7 +461,7 @@ module LibNGAP_Functions { setverdict(pass); } - function f_await_securitymode_command_await_securitymode_complete() runs on NGAPComponent { + function f_await_securitymode_command_await_securitymode_complete() runs on NGNASComponent { log(">>> f_await_securitymode_command_await_securitymode_complete"); // Await request for SECURITY_MODE_COMMAND @@ -514,7 +514,7 @@ module LibNGAP_Functions { setverdict(pass); } - function f_await_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGAPComponent { + function f_await_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent { log(">>> f_await_initial_context_setup_request_await_initial_context_setup_resonse"); // Await InitialContextSetupRequest @@ -568,7 +568,7 @@ module LibNGAP_Functions { log("<<< f_await_initial_context_setup_request_await_initial_context_setup_resonse"); } - function f_await_initial_context_setup_request_send_initial_context_setup_resonse() runs on NGAPComponent { + function f_await_initial_context_setup_request_send_initial_context_setup_resonse() runs on NGNASComponent { log(">>> f_await_initial_context_setup_request_send_initial_context_setup_resonse"); // Await InitialContextSetupRequest @@ -611,7 +611,7 @@ module LibNGAP_Functions { ))); } - function f_await_retrieve_ue_information_await_ue_information_transfer() runs on NGAPComponent { + function f_await_retrieve_ue_information_await_ue_information_transfer() runs on NGNASComponent { log(">>> f_await_retrieve_ue_information_await_ue_information_transfer"); // Await RetrieveUEInformation @@ -634,7 +634,7 @@ module LibNGAP_Functions { )))); } - function f_send_retrieve_ue_information_await_ue_information_transfer() runs on NGAPComponent { + function f_send_retrieve_ue_information_await_ue_information_transfer() runs on NGNASComponent { log(">>> f_send_retrieve_ue_information_await_ue_information_transfer"); // Send RetrieveUEInformation @@ -658,7 +658,7 @@ module LibNGAP_Functions { )))); } - function f_send_session_establishment_request() runs on NGAPComponent { + function f_send_session_establishment_request() runs on NGNASComponent { log(">>> f_send_session_establishment_request"); // Send PDUSessionEstablishmentRequest @@ -697,7 +697,7 @@ module LibNGAP_Functions { ))))); } - function f_await_session_establishment_request() runs on NGAPComponent { + function f_await_session_establishment_request() runs on NGNASComponent { log(">>> f_await_session_establishment_request"); // Await PDUSessionEstablishmentRequest @@ -718,7 +718,7 @@ module LibNGAP_Functions { } } - function f_send_session_establishment_accept() runs on NGAPComponent { + function f_send_session_establishment_accept() runs on NGNASComponent { log(">>> f_send_session_establishment_accept"); // Send PDUSessionEstablishmentRequest @@ -759,7 +759,7 @@ module LibNGAP_Functions { } - function f_await_session_establishment_accept() runs on NGAPComponent { + function f_await_session_establishment_accept() runs on NGNASComponent { log(">>> f_await_session_establishment_accept"); // Await PDUSessionEstablishmentRequest @@ -780,7 +780,7 @@ module LibNGAP_Functions { } } - function f_await_session_resource_setup_request_send_session_resource_setup_response() runs on NGAPComponent { + function f_await_session_resource_setup_request_send_session_resource_setup_response() runs on NGNASComponent { log(">>> f_await_session_resource_setup_request_send_session_resource_setup_response"); // Await PDUSessionEstablishmentRequest @@ -836,7 +836,7 @@ module LibNGAP_Functions { )));*/ } - function f_await_session_resource_setup_request_await_session_resource_setup_response() runs on NGAPComponent { + function f_await_session_resource_setup_request_await_session_resource_setup_response() runs on NGNASComponent { log(">>> f_await_session_resource_setup_request_await_session_resource_setup_response"); // Await PDUSessionEstablishmentRequest @@ -887,7 +887,7 @@ module LibNGAP_Functions { function f_send_ue_context_release_request_await_ue_context_release_response( in template (value) Cause p_Cause - ) runs on NGAPComponent { + ) runs on NGNASComponent { log(">>> f_send_ue_context_release_request_await_ue_context_release_response"); // Send UEContextReleaseRequest @@ -908,7 +908,7 @@ module LibNGAP_Functions { } - function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGAPComponent { + function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGNASComponent { vc_recvNGAP_PDU := p_PDU; diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index aa88fac..e1aed28 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -38,11 +38,14 @@ module LibNGAP_Interface { } // End of group portDefinitions group interfacePorts { - type component NGAPComponent extends SelfSyncComp { + /** + * @desc The NGAP component interface with NAS security support + * This is the main component type to be used to exted NGAP & NAS test components + */ + type component NGNASComponent extends SelfSyncComp { // Port port NGAPPort N2_gNBaMF_P; - // Global variables // Global variables var template NG_NAS_UL_Message_Type vt_NgNasUl_Msg := omit; var template NG_NAS_DL_Message_Type vt_NgNasDl_Msg := omit; @@ -62,12 +65,11 @@ module LibNGAP_Interface { var charstring vc_SUT_address := ""; //defined in init var integer vc_SUT_port := 3868; //defined in init - var NGAP_PDU vc_sendNGAP_PDU ; var NGAP_PDU vc_recvNGAP_PDU ; var NasCount_Type vc_previous_nas_count_ul; var NasCount_Type vc_previous_nas_count_dl; - var InitialContextSetupRequest vc_initialContextSetupRequest; + var InitialContextSetupRequest vc_initialContextSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupRequest vc_pDUSessionResourceSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupResponse vc_pDUSessionResourceSetupResponse; // TODO Could be useless at the end of the day var NGAP_PDU vc_recvNGAP_PDUDefault ; //global variable defined to save Dimeter message received within default altstep @@ -87,8 +89,10 @@ module LibNGAP_Interface { // Variables for storing default references var default vc_default_ngap; var default vc_def_catchSyncStop_ngap; + var default vc_default_nas; + var default vc_def_catchSyncStop_nas; - } // End of type component NGAPComponent + } // End of type component NGNASComponent } // End of group interfacePorts diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index ab7b0b6..b847b5f 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -23,6 +23,7 @@ module LibNGAP_Steps { import from LibNGAP_TypesAndValues all; import from LibNGAP_Interface all; + import from NGAP_TestSystem all; import from LibNGAP_Pixits all; import from LibNGAP_Templates all; import from LibNGAP_Functions all; @@ -45,7 +46,7 @@ module LibNGAP_Steps { */ function f_NGAPPDU_Get( inout NGAP_PDU p_PDU - ) runs on NGAPComponent { + ) runs on NGNASComponent { vc_recvNGAP_PDU := p_PDU; @@ -66,7 +67,7 @@ module LibNGAP_Steps { */ function f_recv_NGAP_PDU( in template NGAP_PDU p_PDU - ) runs on NGAPComponent { + ) runs on NGNASComponent { var NGAP_PDU v_PDU; log(">>> f_recv_NGAP_PDU", p_PDU); @@ -93,7 +94,7 @@ module LibNGAP_Steps { */ function f_recv_NGAP_initiatingMessage( template (present) InitiatingMessage p_initiatingMessage := ? - ) runs on NGAPComponent { + ) runs on NGNASComponent { f_recv_NGAP_PDU( { initiatingMessage := p_initiatingMessage }) } // End of function f_recv_NGAP_initiatingMessage @@ -103,7 +104,7 @@ module LibNGAP_Steps { */ function f_recv_NGAP_successfulOutcome( template (present) SuccessfulOutcome p_successfulOutcome := ? - ) runs on NGAPComponent { + ) runs on NGNASComponent { f_recv_NGAP_PDU( {successfulOutcome := p_successfulOutcome}) } // End of f_recv_NGAP_successfulOutcome @@ -113,7 +114,7 @@ module LibNGAP_Steps { */ function f_recv_NGAP_unsuccessfulOutcome( template (present) UnsuccessfulOutcome p_unsuccessfulOutcome := ? - ) runs on NGAPComponent { + ) runs on NGNASComponent { f_recv_NGAP_PDU( {unsuccessfulOutcome := p_unsuccessfulOutcome}) } // End of function f_recv_NGAP_unsuccessfulOutcome @@ -131,7 +132,7 @@ module LibNGAP_Steps { */ function f_NGAPPDU_Set( inout template (value) NGAP_PDU p_PDU - ) runs on NGAPComponent { + ) runs on NGNASComponent { if (ischosen(p_PDU.initiatingMessage)) { vc_sendNGAP_PDU:=valueof(p_PDU); @@ -151,7 +152,7 @@ module LibNGAP_Steps { */ function f_send_NGAP_PDU( in template (value) NGAP_PDU p_PDU - ) runs on NGAPComponent { + ) runs on NGNASComponent { log(">>> f_send_NGAP_PDU: ", p_PDU) f_NGAPPDU_Set(p_PDU); log("f_send_NGAP_PDU: vc_sendNGAP_PDU: ", vc_sendNGAP_PDU); @@ -165,7 +166,7 @@ module LibNGAP_Steps { function f_send_NGAP_initiatingMessage( in template (value) InitiatingMessage p_initiatingMessage, in template (value) Criticality p_criticality := reject - ) runs on NGAPComponent { + ) runs on NGNASComponent { f_send_NGAP_PDU( {initiatingMessage := p_initiatingMessage}) } // End of function f_send_NGAP_initiatingMessage @@ -175,7 +176,7 @@ module LibNGAP_Steps { */ function f_send_NGAP_successfulOutcome( in template (value) SuccessfulOutcome p_successfulOutcome - ) runs on NGAPComponent { + ) runs on NGNASComponent { f_send_NGAP_PDU( {successfulOutcome := p_successfulOutcome}) } // End of function f_send_NGAP_successfulOutcome @@ -185,7 +186,7 @@ module LibNGAP_Steps { */ function f_send_NGAP_unsuccessfulOutcome( in template (value) UnsuccessfulOutcome p_unsuccessfulOutcome - ) runs on NGAPComponent { + ) runs on NGNASComponent { f_send_NGAP_PDU( {unsuccessfulOutcome := p_unsuccessfulOutcome}) } // End of function f_send_NGAP_unsuccessfulOutcome @@ -210,7 +211,7 @@ module LibNGAP_Steps { * @verdict */ function f_preambleNGAP_MME() - runs on NGAPComponent { + runs on NGNASComponent { // Nothing to do } // End of function f_preambleNGAP_MME @@ -219,7 +220,7 @@ module LibNGAP_Steps { * @verdict */ function f_preambleNGAP_eNB() - runs on NGAPComponent { + runs on NGNASComponent { // Nothing to do } // End of function f_preambleNGAP_eNB @@ -237,7 +238,7 @@ module LibNGAP_Steps { */ function f_postambleNGAP_gNB( in template (value) Cause p_Cause - ) runs on NGAPComponent { + ) runs on gNBNGAPComponent { f_send_ue_context_release_request_await_ue_context_release_response(p_Cause); } // End of function f_postambleNGAP_gNB @@ -246,7 +247,7 @@ module LibNGAP_Steps { * @verdict */ function f_postambleNGAP_AMF() - runs on NGAPComponent { + runs on aMFNGAPComponent { // Nothing to do } // End of function f_postambleNGAP_AMF @@ -263,7 +264,7 @@ module LibNGAP_Steps { * @desc This is a test step that init NGAP component */ function f_NGAP_Init_Component() - runs on NGAPComponent { + runs on NGNASComponent { // Nothing to do } // End of function f_NGAP_Init_Component @@ -271,7 +272,7 @@ module LibNGAP_Steps { * @desc Component termination */ function f_NGAP_terminate_component() - runs on NGAPComponent { + runs on NGNASComponent { log("component terminated - forced!"); deactivate; @@ -282,7 +283,7 @@ module LibNGAP_Steps { * @desc Component termination */ function f_componentStop() - runs on NGAPComponent { + runs on NGNASComponent { syncPort.send(m_syncClientStop); N2_gNBaMF_P.clear; @@ -314,7 +315,7 @@ module LibNGAP_Steps { * @verdict */ altstep a_defaultNGAP() - runs on NGAPComponent { + runs on NGNASComponent { [] any timer.timeout { all timer.stop; if (vc_serverStop==false) { @@ -358,7 +359,7 @@ module LibNGAP_Steps { } // End of altstep a_defaultNGAP altstep a_defaultNGAP_MME() - runs on NGAPComponent { + runs on NGNASComponent { [] any timer.timeout { all timer.stop; if (vc_serverStop==false) { @@ -372,7 +373,7 @@ module LibNGAP_Steps { } // End of altstep a_defaultNGAP_MME altstep a_defaultNGAP_eNB() - runs on NGAPComponent { + runs on NGNASComponent { [] any timer.timeout { all timer.stop; if (vc_serverStop==false) { diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn index 8a4baf8..1948676 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Interface.ttcn @@ -25,22 +25,6 @@ module Lib_NG_NAS_Interface { } // End of group portDefinitions group interfacePorts { - type component NGNASComponent extends NGAPComponent {//extends SelfSyncComp { - // Port - //port NGAPPort N2_gNBaMF_P; - - // Init of values at component started - - // General timers - //timer tc_wait := PX_NGAP_TWAIT; - //timer tc_delay := 0.3; // delay next Request - - // Variables for storing default references - var default vc_default_nas; - var default vc_def_catchSyncStop_nas; - - } // End of type component NASComponent - } // End of group interfacePorts } // End of module Lib_NG_NAS_Interface -- GitLab From 5adac94c32638a57a2fe2d23426e3f5f2addd363 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 15 Jan 2026 10:04:39 +0100 Subject: [PATCH 037/151] Editorial changes --- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 286ed3c..afc4bfd 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -106,14 +106,14 @@ module Lib_NG_NAS_Security_Functions { var octetstring v_SequenceNumber := v_message.security_Protected_Nas_Message.sequenceNumber;//f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_SequenceNumber); var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_dl, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), PX_BEARER_ID, tsc_DirectionDL); - log("f_Check_5GAKA_NAS_DL_Message: v_CalculatedMac: ", v_CalculatedMac); - if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_DL_Message: v_calculated_mac: ", v_calculated_mac); + if (v_calculated_mac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed"); return false; } @@ -126,14 +126,14 @@ module Lib_NG_NAS_Security_Functions { var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_SequenceNumber); var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_dl, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), PX_BEARER_ID, tsc_DirectionDL); - log("f_Check_5GAKA_NAS_DL_Message: v_CalculatedMac: ", v_CalculatedMac); - if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_DL_Message: v_calculated_mac: ", v_calculated_mac); + if (v_calculated_mac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed"); return false; } @@ -212,14 +212,14 @@ module Lib_NG_NAS_Security_Functions { var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_SequenceNumber); var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_ul, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), PX_BEARER_ID, tsc_DirectionDL); - log("f_Check_5GAKA_NAS_UL_Message: v_CalculatedMac: ", v_CalculatedMac); - if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_UL_Message: v_calculated_mac: ", v_calculated_mac); + if (v_calculated_mac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { log("f_Check_5GAKA_NAS_UL_Message: Integrity check failed"); return false; } @@ -237,14 +237,14 @@ module Lib_NG_NAS_Security_Functions { var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_SequenceNumber); var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_CalculatedMac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_ul, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), PX_BEARER_ID, tsc_DirectionUL); - log("f_Check_5GAKA_NAS_UL_Message: v_CalculatedMac: ", v_CalculatedMac); - if (v_CalculatedMac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { + log("f_Check_5GAKA_NAS_UL_Message: v_calculated_mac: ", v_calculated_mac); + if (v_calculated_mac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { log("f_Check_5GAKA_NAS_UL_Message: Integrity check failed"); return false; } @@ -393,7 +393,6 @@ module Lib_NG_NAS_Security_Functions { ) return boolean { log(">>> f_5g_aka_compute_res_xres: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); log(">>> f_5g_aka_compute_res_xres: p_Identity: ", p_Identity); - log(">>> f_5g_aka_compute_res_xres: p_Identity: ", hex2str(p_Identity)); p_ng_nas_security_params_type := valueof(cs_NG_NAS_SecurityParamsInit); log("f_5g_aka_compute_res_xres: KDF=", p_ng_nas_security_params_type.KDF); -- GitLab From 93434400b1cc3e0e5022b809938daed3cf6580c3 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 16 Jan 2026 08:04:58 +0100 Subject: [PATCH 038/151] Review functions namimg; Enforce component dependencies --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 17 +- etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 6 - test_purposes/References.txt | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 223 +++++-- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 582 +++++++++--------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 306 ++++----- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 263 ++++++-- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 24 +- 8 files changed, 830 insertions(+), 593 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index a8b8bd4..de4bd5b 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -56,17 +56,10 @@ LogEventTypes:= Yes # In this section you can specify parameters that are passed to Test Ports. # Open5GS AMF IP and port -#system.NGAP_gNB_1.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" -#system.N2_gNBaMF_P.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" +#system.NGAP_AMF.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" -#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" -#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" - -system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" -system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" - -#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" -#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" +# Open5GS pcap files +system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" [DEFINE] # In this section you can create macro definitions, @@ -105,13 +98,13 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 #NGAP_TestCases.TC_NGAP_AMF_PDU_05 # Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed -#NGAP_TestCases.TC_NGAP_AMF_CMP_01 +NGAP_TestCases.TC_NGAP_AMF_CMP_01 # Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID #NGAP_TestCases.TC_NGAP_AMF_CMP_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs -NGAP_TestCases.TC_NGAP_AMF_CMP_04 +###########################################NGAP_TestCases.TC_NGAP_AMF_CMP_04 # Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs #NGAP_TestCases.TC_NGAP_AMF_CMP_05 # Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ index 9ad3599..1b8d350 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -26,15 +26,9 @@ LogEventTypes:= Yes #system.NGAP_gNB_1.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" #system.N2_gNBaMF_P.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" -#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" -#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" - system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" -#system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" -#system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/LINUX_FRAME/PCAP_FILE(file=../captures/RegTrace4444333000_.pcapng)" - [DEFINE] # In this section you can create macro definitions, # that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. diff --git a/test_purposes/References.txt b/test_purposes/References.txt index 2161f8f..f0ac772 100644 --- a/test_purposes/References.txt +++ b/test_purposes/References.txt @@ -1 +1 @@ -[1] ETSI TS 124 501: "5G;Non-Access-Stratum (NAS) protocol for 5G System (5GS);Stage 3 (3GPP TS 24.501 version 16.14.1 Release 16)". +[1] ETSI TS 138 413: "5G;NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.12.0 Release 16)". diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 512ffac..6bf8594 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -180,16 +180,37 @@ module NGAP_Steps { */ function f_NGAP_amf_UE_Register() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_Register"); - f_await_NGSetupRequest_send_NGSetupRespone(); - f_await_registration_request(); + if (PICS_OFFLINE_MODE) { + f_await_NGSetupRequest_await_NGSetupRespone(); + } else { + f_send_NGSetupRequest_await_NGSetupRespone(); + } + log("f_NGAP_amf_UE_Register: f_send_registration_request done"); + if (PICS_OFFLINE_MODE) { + f_send_registration_request(); + } else { + f_await_registration_request(); + } + log("<<< f_NGAP_amf_UE_Register"); } // End of function f_NGAP_amf_UE_Register + /** + * @desc + */ + function f_NGAP_amf_UE_NAS_Initiate() runs on gNBNGAPComponent { + // FIXME + } // End of function f_NGAP_amf_UE_NAS_Initiate + /** * @desc */ function f_NGAP_amf_UE_Authentication() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_Authentication"); - f_send_authentication_request_await_authentication_response(); + if (PICS_OFFLINE_MODE) { + f_await_authentication_request_await_authentication_response(); + } else { + f_await_authentication_request_send_authentication_response(); + } } // End of function f_NGAP_amf_UE_Authentication /** @@ -197,14 +218,90 @@ module NGAP_Steps { */ function f_NGAP_amf_UE_SecurityMode() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_SecurityMode"); - f_send_securitymode_command_await_securitymode_complete(); + if (PICS_OFFLINE_MODE) { + f_await_securitymode_command_await_securitymode_complete(); + } else { // Await security mode and send response + f_await_securitymode_command_send_securitymode_complete(); + } + log("<<< f_NGAP_amf_UE_SecurityMode"); } // End of function f_NGAP_amf_UE_SecurityMode + /** + * @desc + */ + function f_NGAP_amf_UE_InitialContextSetup() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_InitialContextSetup"); + if (PICS_OFFLINE_MODE) { + f_await_initial_context_setup_request_await_initial_context_setup_resonse(); + } else { + f_await_initial_context_setup_request_send_initial_context_setup_resonse(); + } + } // End of function f_NGAP_amf_UE_InitialContextSetup + + function f_NGAP_amf_RegistrationComplete() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_RegistrationComplete"); + if (PICS_OFFLINE_MODE) { + f_await_registration_complete(); + } else { + f_send_registration_complete(); + } + } // End of function f_NGAP_amf_RegistrationComplete + + /** + * @desc + */ + function f_NGAP_amf_UE_Has_EstablishedContextInproperly() runs on aMFNGAPComponent return boolean { + if (not(isbound(vc_initialContextSetupRequest))) { + log("f_NGAP_amf_UE_Has_EstablishedContextInproperly: vc_initialContextSetupRequest is not bound"); + return false; + } else { + // TODO FSCOM To be enhanced + } + return true; + } // End of function f_NGAP_amf_UE_Has_EstablishedContextInproperly + + /** + * @desc + */ + function f_NGAP_amf_UE_PDU_SessionEstablishmentRequest() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_PDU_SessionEstablishmentRequest"); + if (PICS_OFFLINE_MODE) { + f_await_session_establishment_request(); + } else { + f_send_session_establishment_request(); + } + } // End of function f_NGAP_amf_UE_PDU_SessionEstablishmentRequest + + /** + * @desc + */ + function f_NGAP_amf_UE_PDU_SessionEstablishmentAccept() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_PDU_SessionEstablishmentAccept"); + f_await_session_establishment_accept(); + } // End of function f_NGAP_amf_UE_PDU_SessionEstablishmentAccept + + /** + * @desc + */ + function f_NGAP_amf_UE_PDU_SessionResourceSetup() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_PDU_SessionResourceSetup"); + f_await_pdu_session_resource_setup_request(); + } // End of function f_NGAP_amf_UE_PDU_SessionResourceSetup + + function f_NGAP_amf_UE_PDU_SessionResourceResponse() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_PDU_SessionResourceResponse"); + if (PICS_OFFLINE_MODE) { + f_await_pdu_session_resource_setup_response(); + } else { + f_send_pdu_session_resource_setup_response(); + } + } + /** * @desc */ function f_NGAP_amf_UE_PDU_ResourceSetup() runs on aMFNGAPComponent { - //FIXME: Implementation of PDU session resource setup + //FIXME } // End of function f_NGAP_amf_UE_PDU_ResourceSetup /** @@ -256,13 +353,6 @@ module NGAP_Steps { //FIXME: Implementation of initiate an early uplink RAN xfer } // End of function f_NGAP_amf_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer - /** - * @desc - */ - function f_NGAP_amf_UE_NAS_Initiate() runs on aMFNGAPComponent { - //FIXME: Implementation of a NAS procedure - } // End of function f_NGAP_amf_UE_NAS_Initiate - /** * @desc */ @@ -284,6 +374,23 @@ module NGAP_Steps { //FIXME: Implementation of an UE transitioning into the RRC_INACTIVE state } // End of function f_NGAP_amf_isTransitioningTo_RRC_INACTIVE + /** + * @desc + */ + function f_NGAP_amf_UE_Not_Available() runs on aMFNGAPComponent { + //FIXME: + } // End of function f_NGAP_amf_UE_Not_Available + + function f_NGAP_amf_UE_HasPendingDataTransmission() runs on aMFNGAPComponent return boolean { + //FIXME: + return false; + } // End of function f_NGAP_amf_UE_HasPendingDataTransmission + + function f_NGAP_amf_UE_Has_Suspended_Context() runs on aMFNGAPComponent return boolean { + //FIXME: + return false; + } // End of function f_NGAP_amf_UE_Has_Suspended_Context + /******************************************************************/ /** @@ -294,7 +401,7 @@ module NGAP_Steps { if (PICS_OFFLINE_MODE) { f_await_NGSetupRequest_await_NGSetupRespone(); } else { - f_send_NGSetupRequest_await_NGSetupRespone(); + f_await_NGSetupRequest_send_NGSetupRespone(); } log("f_NGAP_gnb_UE_Register: f_send_NGSetupRequest_await_NGSetupRespone done"); f_await_registration_request(); @@ -305,6 +412,7 @@ module NGAP_Steps { * @desc */ function f_NGAP_gnb_UE_NAS_Initiate() runs on gNBNGAPComponent { + // FIXME } // End of function f_NGAP_gnb_UE_NAS_Initiate /** @@ -314,8 +422,8 @@ module NGAP_Steps { log(">>> f_NGAP_gnb_UE_Authentication"); if (PICS_OFFLINE_MODE) { f_await_authentication_request_await_authentication_response(); - } else { // Await authentication request and send response - f_await_authentication_request_send_authentication_response(); + } else { + f_send_authentication_request_await_authentication_response(); } log("<<< f_NGAP_gnb_UE_Authentication"); } // End of function f_NGAP_gnb_UE_Authentication @@ -328,32 +436,11 @@ module NGAP_Steps { if (PICS_OFFLINE_MODE) { f_await_securitymode_command_await_securitymode_complete(); } else { // Await security mode and send response - f_await_securitymode_command_send_securitymode_complete(); + f_send_securitymode_command_await_securitymode_complete(); } log("<<< f_NGAP_gnb_UE_SecurityMode"); } // End of function f_NGAP_gnb_UE_SecurityMode - /** - * @desc - */ - function f_NGAP_gnb_UE_Not_Available() runs on gNBNGAPComponent { - //FIXME: Implementation of UE not available - } // End of function f_NGAP_gnb_UE_Not_Available - - /** - * @desc - */ - function f_NGAP_gnb_UE_Handover_Required() runs on gNBNGAPComponent { - //FIXME: Implementation of UE handover required - } // End of function f_NGAP_gnb_UE_Handover_Required - - /** - * @desc - */ - function f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed() runs on gNBNGAPComponent { - //FIXME: Implementation of UE handover completed - } // End of function f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed - /** * @desc */ @@ -362,17 +449,13 @@ module NGAP_Steps { if (PICS_OFFLINE_MODE) { f_await_initial_context_setup_request_await_initial_context_setup_resonse(); } else { - f_await_initial_context_setup_request_send_initial_context_setup_resonse(); + f_send_initial_context_setup_request_await_initial_context_setup_resonse(); } } // End of function f_NGAP_gnb_UE_InitialContextSetup function f_NGAP_gnb_RegistrationComplete() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_RegistrationComplete"); - if (PICS_OFFLINE_MODE) { - f_await_registration_complete(); - } else { - f_send_registration_complete(); - } + f_await_registration_complete(); } // End of function f_NGAP_gnb_RegistrationComplete /** @@ -388,24 +471,12 @@ module NGAP_Steps { return true; } // End of function f_NGAP_gnb_UE_Has_EstablishedContextInproperly - /** - * @desc - */ - function f_NGAP_gnb_UE_HasPendingDataTransmission() runs on gNBNGAPComponent return boolean { - //FIXME: Implementation of UE has pending data transmission leading to failed context suspension - return false; - } // End of function f_NGAP_gnb_UE_HasPendingDataTransmission - /** * @desc */ function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest"); - if (PICS_OFFLINE_MODE) { - f_await_session_establishment_request(); - } else { - f_send_session_establishment_request(); - } + f_await_session_establishment_request(); } // End of function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest /** @@ -423,14 +494,46 @@ module NGAP_Steps { function f_NGAP_gnb_UE_PDU_SessionResourceSetup() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_PDU_SessionResourceSetup"); if (PICS_OFFLINE_MODE) { - f_await_session_resource_setup_request_await_session_resource_setup_response(); + f_await_pdu_session_resource_setup_request(); } else { - f_await_session_resource_setup_request_send_session_resource_setup_response(); + f_send_pdu_session_resource_setup_request(); } - - // f_send_session_resource_setup_request_await_session_resource_setup_response } + function f_NGAP_gnb_UE_PDU_SessionResourceResponse() runs on gNBNGAPComponent { + log(">>> f_NGAP_gnb_UE_PDU_SessionResourceResponse"); + f_await_pdu_session_resource_setup_response(); + } + + /** + * @desc + */ + function f_NGAP_gnb_UE_Not_Available() runs on gNBNGAPComponent { + //FIXME: Implementation of UE not available + } // End of function f_NGAP_gnb_UE_Not_Available + + /** + * @desc + */ + function f_NGAP_gnb_UE_Handover_Required() runs on gNBNGAPComponent { + //FIXME: Implementation of UE handover required + } // End of function f_NGAP_gnb_UE_Handover_Required + + /** + * @desc + */ + function f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed() runs on gNBNGAPComponent { + //FIXME: Implementation of UE handover completed + } // End of function f_NGAP_gnb_UE_MMP_Initiate_Handover_Completed + + /** + * @desc + */ + function f_NGAP_gnb_UE_HasPendingDataTransmission() runs on gNBNGAPComponent return boolean { + //FIXME: Implementation of UE has pending data transmission leading to failed context suspension + return false; + } // End of function f_NGAP_gnb_UE_HasPendingDataTransmission + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 8148110..dc6da75 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4045,48 +4045,48 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_PDU_01 */ - function f_TC_NGAP_AMF_PDU_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_PDU_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - //action("Trigger PDU session resource SETUP!"); - f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_PDUSessionResourceSetupRequest( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - mw_pDUSessionResourceSetupItemSUReq( - PX_PDU_SESSION_ID, - mw_s_NSSAI( - PX_SST, - -,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - ) - }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq - ))); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // // Body + // //action("Trigger PDU session resource SETUP!"); + // f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request + + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_PDUSessionResourceSetupRequest( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID, + // { + // mw_pDUSessionResourceSetupItemSUReq( + // PX_PDU_SESSION_ID, + // mw_s_NSSAI( + // PX_SST, + // -,//in template (omit) SD p_sD := omit, + // -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + // ), + // ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + // -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + // -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + // ) + // }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + // ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4099,18 +4099,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_PDU_02 */ - function f_TC_NGAP_AMF_PDU_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_PDU_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request_await_session_establishment_response - f_NGAP_gnb_UE_PDU_SessionResourceSetup(); // f_await_session_resource_setup_request_send_session_resource_setup_response + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request_await_session_establishment_response + f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request_send_session_resource_setup_response f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4136,7 +4136,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4149,13 +4149,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_PDU_03 */ - function f_TC_NGAP_AMF_PDU_03() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_PDU_03() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); - f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4184,7 +4184,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4200,13 +4200,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_PDU_04 */ - function f_TC_NGAP_AMF_PDU_04() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_PDU_04() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); - f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4277,7 +4277,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4286,13 +4286,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_PDU_05 */ - function f_TC_NGAP_AMF_PDU_05() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_PDU_05() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); - f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4363,7 +4363,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4379,16 +4379,16 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_01 */ - function f_TC_NGAP_AMF_CMP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4427,12 +4427,13 @@ module NGAP_TCFunctions { ?, ? */ ))); + // TODO Check security f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4448,18 +4449,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_02 */ - function f_TC_NGAP_AMF_CMP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4481,7 +4482,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_AMF_CMP_02 @@ -4489,18 +4490,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_03 */ - function f_TC_NGAP_AMF_CMP_03() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_03() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4523,7 +4524,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4537,20 +4538,20 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_04 */ - function f_TC_NGAP_AMF_CMP_04() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_04() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete // TODO: hasEstablishedInitialContext - if (not(f_NGAP_gnb_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly + if (not(f_NGAP_amf_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); return; @@ -4571,7 +4572,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4588,18 +4589,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_05 */ - function f_TC_NGAP_AMF_CMP_05() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_05() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4618,7 +4619,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4632,17 +4633,17 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_06 */ - function f_TC_NGAP_AMF_CMP_06() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_06() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4661,7 +4662,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4677,17 +4678,17 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_07 */ - function f_TC_NGAP_AMF_CMP_07() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4716,7 +4717,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4731,17 +4732,17 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_08 */ - function f_TC_NGAP_AMF_CMP_08() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_08() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4773,7 +4774,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4782,22 +4783,25 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_09 */ - function f_TC_NGAP_AMF_CMP_09() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_09() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - f_NGAP_gnb_UE_HasPendingDataTransmission(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + if (not(f_NGAP_amf_UE_HasPendingDataTransmission())) { + log("*** " & __SCOPE__ & ": INFO: Preamble failed. ***"); + f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + } else { + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + f_selfOrClientSyncAndVerdict(c_prDone, e_success); + } // Body f_send_NGAP_PDU( @@ -4828,7 +4832,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4841,14 +4845,14 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_10 */ - function f_TC_NGAP_AMF_CMP_10() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_10() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); - if (not(f_NGAP_gnb_UE_Has_Suspended_Context())) { + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); return; @@ -4873,7 +4877,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4882,17 +4886,17 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_11 */ - function f_TC_NGAP_AMF_CMP_11() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_CMP_11() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - f_NGAP_gnb_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_gnb_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); - f_NGAP_gnb_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - if (not(f_NGAP_gnb_UE_Has_Suspended_Context())) { + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); return; @@ -4918,7 +4922,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4935,12 +4939,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_01 */ - function f_TC_NGAP_AMF_MMP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4984,7 +4988,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4993,18 +4997,18 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_02 */ - function f_TC_NGAP_AMF_MMP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_NGAP_gnb_UE_Not_Available(); + f_NGAP_amf_UE_Not_Available(); f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequired( @@ -5037,7 +5041,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5050,12 +5054,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_03 */ - function f_TC_NGAP_AMF_MMP_03() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_03() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5066,7 +5070,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5082,12 +5086,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_04 */ - function f_TC_NGAP_AMF_MMP_04() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_04() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5098,7 +5102,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5107,12 +5111,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_05 */ - function f_TC_NGAP_AMF_MMP_05() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_05() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5123,7 +5127,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5136,12 +5140,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_06 */ - function f_TC_NGAP_AMF_MMP_06() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_06() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5161,7 +5165,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5177,12 +5181,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_07 */ - function f_TC_NGAP_AMF_MMP_07() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_07() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5210,7 +5214,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5223,12 +5227,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_08 */ - function f_TC_NGAP_AMF_MMP_08() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_08() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5244,7 +5248,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5260,12 +5264,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_MMP_09 */ - function f_TC_NGAP_AMF_MMP_09() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_MMP_09() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5294,7 +5298,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5310,12 +5314,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_PAG_01 */ - function f_TC_NGAP_AMF_PAG_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_PAG_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5340,7 +5344,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } @@ -5358,12 +5362,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_NAS_01 */ - function f_TC_NGAP_AMF_NAS_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_NAS_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5393,7 +5397,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5412,12 +5416,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_NAS_02 */ - function f_TC_NGAP_AMF_NAS_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_NAS_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5447,7 +5451,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5462,13 +5466,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_01 */ - function f_TC_NGAP_AMF_IMP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5552,7 +5556,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5561,13 +5565,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMP_02 */ - function f_TC_NGAP_AMF_IMP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5621,7 +5625,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5630,13 +5634,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_03 */ - function f_TC_NGAP_AMF_IMP_03() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_03() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5722,7 +5726,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5731,13 +5735,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_04 */ - function f_TC_NGAP_AMF_IMP_04() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_04() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5828,7 +5832,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5841,13 +5845,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_05 */ - function f_TC_NGAP_AMF_IMP_05() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_05() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5892,7 +5896,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5901,13 +5905,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_06 */ - function f_TC_NGAP_AMF_IMP_06() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_06() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5954,7 +5958,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5967,13 +5971,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_07 */ - function f_TC_NGAP_AMF_IMP_07() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_07() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6022,7 +6026,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6035,13 +6039,13 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_08 */ - function f_TC_NGAP_AMF_IMP_08() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_08() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - //f_NGAP_gnb_UE_PDU_ResourceSetup(); + f_NGAP_amf_init(); + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6068,7 +6072,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6081,12 +6085,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_09 */ - function f_TC_NGAP_AMF_IMP_09() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_09() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -6159,7 +6163,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6172,12 +6176,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_10 */ - function f_TC_NGAP_AMF_IMP_10() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_10() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6210,7 +6214,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6223,12 +6227,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_11 */ - function f_TC_NGAP_AMF_IMP_11() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_11() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6246,7 +6250,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6259,12 +6263,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_12 */ - function f_TC_NGAP_AMF_IMP_12() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_IMP_12() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6282,7 +6286,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6307,12 +6311,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_WTP_01 */ - function f_TC_NGAP_AMF_WTP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_WTP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6335,7 +6339,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6348,12 +6352,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_WTP_02 */ - function f_TC_NGAP_AMF_WTP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_WTP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6374,7 +6378,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6394,12 +6398,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_NTP_01 */ - function f_TC_NGAP_AMF_NTP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_NTP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6422,7 +6426,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6431,12 +6435,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_NTP_02 */ - function f_TC_NGAP_AMF_NTP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_NTP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6457,7 +6461,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6472,12 +6476,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_TRP_01 */ - function f_TC_NGAP_AMF_TRP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_TRP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6499,7 +6503,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6515,12 +6519,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_TRP_02 */ - function f_TC_NGAP_AMF_TRP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_TRP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6542,7 +6546,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6561,12 +6565,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_LRP_01 */ - function f_TC_NGAP_AMF_LRP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_LRP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6584,7 +6588,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6606,12 +6610,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_UBP_01 */ - function f_TC_NGAP_AMF_UBP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_UBP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6632,7 +6636,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6651,12 +6655,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_URP_01 */ - function f_TC_NGAP_AMF_URP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_URP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6677,7 +6681,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6690,12 +6694,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_URP_02 */ - function f_TC_NGAP_AMF_URP_02() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_URP_02() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6722,7 +6726,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -6747,12 +6751,12 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_aMF_RIP_01 */ - function f_TC_NGAP_AMF_RIP_01() runs on gNBNGAPComponent { + function f_TC_NGAP_AMF_RIP_01() runs on aMFNGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -6772,7 +6776,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 578632b..7494500 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -2112,10 +2112,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session." */ - testcase TC_NGAP_AMF_PDU_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_PDU_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_1)){ @@ -2124,7 +2124,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_01()); @@ -2143,10 +2143,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session." */ - testcase TC_NGAP_AMF_PDU_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_PDU_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_2)){ @@ -2155,7 +2155,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_02()); @@ -2174,10 +2174,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session." */ - testcase TC_NGAP_AMF_PDU_03() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_PDU_03() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_3)){ @@ -2186,7 +2186,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_03()); @@ -2208,10 +2208,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session." */ - testcase TC_NGAP_AMF_PDU_04() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_PDU_04() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_5)){ @@ -2220,7 +2220,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_04()); @@ -2235,10 +2235,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for not successfully modified PDU session." */ - testcase TC_NGAP_AMF_PDU_05() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_PDU_05() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_5)){ @@ -2247,7 +2247,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_05()); @@ -2269,10 +2269,10 @@ module NGAP_TestCases { /** * @desc "Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed." */ - testcase TC_NGAP_AMF_CMP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_1)){ @@ -2281,7 +2281,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_01()); @@ -2303,10 +2303,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID." */ - testcase TC_NGAP_AMF_CMP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_3)){ @@ -2315,7 +2315,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_02()); @@ -2330,10 +2330,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons." */ - testcase TC_NGAP_AMF_CMP_03() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_03() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_3)){ @@ -2342,7 +2342,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_03()); @@ -2362,10 +2362,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs." */ - testcase TC_NGAP_AMF_CMP_04() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_04() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_4)){ @@ -2374,7 +2374,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_04()); @@ -2396,10 +2396,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs." */ - testcase TC_NGAP_AMF_CMP_05() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_05() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_6)){ @@ -2408,7 +2408,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_05()); @@ -2427,10 +2427,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs." */ - testcase TC_NGAP_AMF_CMP_06() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_06() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_7)){ @@ -2439,7 +2439,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_06()); @@ -2462,10 +2462,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can successfully request UE information from the AMF." */ - testcase TC_NGAP_AMF_CMP_07() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_10)){ @@ -2474,7 +2474,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_07()); @@ -2495,10 +2495,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST contains mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context." */ - testcase TC_NGAP_AMF_CMP_08() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_08() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ @@ -2507,7 +2507,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_08()); @@ -2522,10 +2522,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST contains mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension." */ - testcase TC_NGAP_AMF_CMP_09() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_09() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ @@ -2534,7 +2534,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_09()); @@ -2553,10 +2553,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context." */ - testcase TC_NGAP_AMF_CMP_10() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_10() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ @@ -2565,7 +2565,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_10()); @@ -2580,10 +2580,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context." */ - testcase TC_NGAP_AMF_CMP_11() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_CMP_11() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ @@ -2592,7 +2592,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_11()); @@ -2615,10 +2615,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER COMMAND with successfully handover." */ - testcase TC_NGAP_AMF_MMP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_1)){ @@ -2627,7 +2627,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_01()); @@ -2642,10 +2642,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER PREPARATION FAILURE because the UE is not longer available." */ - testcase TC_NGAP_AMF_MMP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_1)){ @@ -2654,7 +2654,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_02()); @@ -2673,10 +2673,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully sends a HANDOVER REQUEST message that contains mandatory IEs to the GNB." */ - testcase TC_NGAP_AMF_MMP_03() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_03() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_2)){ @@ -2685,7 +2685,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_03()); @@ -2707,10 +2707,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and answers with PATH SWITCH REQUEST ACKNOWLEDGE to acknowledge the path switch." */ - testcase TC_NGAP_AMF_MMP_04() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_04() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_4)){ @@ -2719,7 +2719,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_04()); @@ -2734,10 +2734,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and two PDU Sessions with same ID and answers with PATH SWITCH REQUEST FAILURE." */ - testcase TC_NGAP_AMF_MMP_05() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_05() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_4)){ @@ -2746,7 +2746,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_05()); @@ -2765,10 +2765,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a HANDOVER CANCEL message that contains mandatory IEs and answers with HANDOVER CANCEL ACKNOWLEDGE to confirm that the ongoing handover was cancelled." */ - testcase TC_NGAP_AMF_MMP_06() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_06() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_5)){ @@ -2777,7 +2777,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_06()); @@ -2799,10 +2799,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully sends a DOWNLINK RAN STATUS TRANSFER message that contains mandatory IEs." */ - testcase TC_NGAP_AMF_MMP_07() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_07() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_6)){ @@ -2811,7 +2811,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_07()); @@ -2830,10 +2830,10 @@ module NGAP_TestCases { /** * @desc "Verify that the NG-RAN node successfully sends a Handover Success message to the AMF." */ - testcase TC_NGAP_AMF_MMP_08() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_08() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A3_3_8)){ @@ -2842,7 +2842,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_08()); @@ -2864,10 +2864,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully sends a DOWNLINK RAN EARLY STATUS TRANSFER message that contains mandatory IEs." */ - testcase TC_NGAP_AMF_MMP_09() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_MMP_09() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_3_9)){ @@ -2876,7 +2876,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_MMP_09()); @@ -2899,10 +2899,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PAGING message to enable the AMF to page a UE." */ - testcase TC_NGAP_aMF_PAG_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_aMF_PAG_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_4_1)){ @@ -2911,7 +2911,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_PAG_01()); @@ -2935,10 +2935,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface." */ - testcase TC_NGAP_AMF_NAS_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_NAS_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_5_2)){ @@ -2947,7 +2947,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_NAS_01()); @@ -2973,10 +2973,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF." */ - testcase TC_NGAP_AMF_NAS_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_NAS_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_5_5)){ @@ -2985,7 +2985,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_NAS_02()); @@ -3007,10 +3007,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup." */ - testcase TC_NGAP_AMF_IMP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ @@ -3019,7 +3019,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_01()); @@ -3034,10 +3034,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully decline a NG RESET REQEST message and answers with NG SETUP FAILURE when the AMF is not able to handle the request." */ - testcase TC_NGAP_AMF_IMP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ @@ -3046,7 +3046,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_02()); @@ -3061,10 +3061,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup." */ - testcase TC_NGAP_AMF_IMP_03() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_03() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ @@ -3073,7 +3073,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_03()); @@ -3088,10 +3088,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup." */ - testcase TC_NGAP_AMF_IMP_04() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_04() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ @@ -3100,7 +3100,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_04()); @@ -3119,10 +3119,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update." */ - testcase TC_NGAP_AMF_IMP_05() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_05() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_2)){ @@ -3131,7 +3131,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_05()); @@ -3146,10 +3146,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request." */ - testcase TC_NGAP_AMF_IMP_06() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_06() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_2)){ @@ -3158,7 +3158,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_06()); @@ -3177,10 +3177,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a AMF CONFIGURATION UPDATE message to the AMF." */ - testcase TC_NGAP_AMF_IMP_07() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_07() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_3)){ @@ -3189,7 +3189,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_07()); @@ -3208,10 +3208,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset." */ - testcase TC_NGAP_AMF_IMP_08() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_08() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_4)){ @@ -3220,7 +3220,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_08()); @@ -3239,10 +3239,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF can send a ERROR INDICATION to the GNB when a error occurs." */ - testcase TC_NGAP_AMF_IMP_09() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_09() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_5)){ @@ -3251,7 +3251,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_09()); @@ -3270,10 +3270,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF can send a AMF STATUS INDICATION to the GNB when a error occurs." */ - testcase TC_NGAP_AMF_IMP_10() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_10() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_6)){ @@ -3282,7 +3282,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_10()); @@ -3301,10 +3301,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF can send a OVERLOAD START to the GNB." */ - testcase TC_NGAP_AMF_IMP_11() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_11() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_7)){ @@ -3313,7 +3313,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_11()); @@ -3332,10 +3332,10 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF can send a OVERLOAD STOP to the GNB." */ - testcase TC_NGAP_AMF_IMP_12() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_IMP_12() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_8)){ @@ -3344,7 +3344,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_12()); @@ -3375,10 +3375,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages." */ - testcase TC_NGAP_AMF_WTP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_WTP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_8_1)){ @@ -3387,7 +3387,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_WTP_01()); @@ -3406,10 +3406,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages." */ - testcase TC_NGAP_AMF_WTP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_WTP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_8_2)){ @@ -3418,7 +3418,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_WTP_02()); @@ -3444,10 +3444,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a DOWNLINK UE ASSOCIATED NRPPA TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." */ - testcase TC_NGAP_AMF_NTP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_NTP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_9_1)){ @@ -3456,7 +3456,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_NTP_01()); @@ -3471,10 +3471,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a DOWNLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." */ - testcase TC_NGAP_AMF_NTP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_NTP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_9_3)){ @@ -3483,7 +3483,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_NTP_02()); @@ -3504,10 +3504,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a TRACE_START to initiate a trace session for a UE." */ - testcase TC_NGAP_AMF_TRP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_TRP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_10_1)){ @@ -3516,7 +3516,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_TRP_01()); @@ -3538,10 +3538,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE." */ - testcase TC_NGAP_AMF_TRP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_TRP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_10_3)){ @@ -3550,7 +3550,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_TRP_02()); @@ -3575,10 +3575,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a LOCATION REPORTING CONTROL message that contains mandatory IEs to request a report of the UE's current location." */ - testcase TC_NGAP_AMF_LRP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_LRP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_11_1)){ @@ -3587,7 +3587,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_LRP_01()); @@ -3614,10 +3614,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure." */ - testcase TC_NGAP_AMF_UBP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_UBP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_12_1)){ @@ -3626,7 +3626,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_UBP_01()); @@ -3651,10 +3651,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UE RADIO CAPABILITY CHECK REQUEST to initiate UE Radio Capability Management procedure." */ - testcase TC_NGAP_AMF_URP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_URP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_13_2)){ @@ -3663,7 +3663,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_URP_01()); @@ -3682,10 +3682,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping." */ - testcase TC_NGAP_AMF_URP_02() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_URP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_13_3)){ @@ -3694,7 +3694,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_URP_02()); @@ -3725,10 +3725,10 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER." */ - testcase TC_NGAP_AMF_RIP_01() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_AMF_RIP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables - var gNBNGAPComponent v_ngap_gnb; + var aMFNGAPComponent v_ngap_gnb; // Test control if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_15_2)){ @@ -3737,7 +3737,7 @@ module NGAP_TestCases { } // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + f_cf_NGAP_aMF_Up(v_ngap_gnb); // Start v_ngap_gnb.start(f_TC_NGAP_AMF_RIP_01()); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index afb40fe..f851ab3 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -31,6 +31,7 @@ module LibNGAP_Functions { function f_await_NGSetupRequest_send_NGSetupRespone() runs on NGNASComponent { log(">>> f_await_NGSetupRequest_send_NGSetupRespone"); + // Await NGSetupRequest f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_NGSetupRequest( @@ -45,7 +46,8 @@ module LibNGAP_Functions { }, PX_PAGING_DRX ))); - //f_NGAPPDU_Get(vc_recvNGAP_PDU); + + // Send NGSetupResponse f_send_NGAP_PDU( m_ngap_succMsg( m_n2_NGSetupResponse( @@ -602,6 +604,18 @@ module LibNGAP_Functions { ?, ? */ ))); + vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_ACCEPT ***"); + setverdict(pass); + } + log("v_message: ", v_message); + // Send InitialContextSetupResponse f_send_NGAP_PDU( m_ngap_succMsg( @@ -611,6 +625,68 @@ module LibNGAP_Functions { ))); } + function f_send_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent { + log(">>> f_send_initial_context_setup_request_await_initial_context_setup_resonse"); + + // Send InitialContextSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_InitialContextSetupRequest/*_withPDUSessionList*/( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_gUAMI, + { + { + PX_PDU_SESSION_ID, + omit, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))) + ), + omit + } + + }, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities + ))); + + // Await InitialContextSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes + )); + log("<<< f_send_initial_context_setup_request_await_initial_context_setup_resonse"); + } + function f_await_retrieve_ue_information_await_ue_information_transfer() runs on NGNASComponent { log(">>> f_await_retrieve_ue_information_await_ue_information_transfer"); @@ -780,8 +856,51 @@ module LibNGAP_Functions { } } - function f_await_session_resource_setup_request_send_session_resource_setup_response() runs on NGNASComponent { - log(">>> f_await_session_resource_setup_request_send_session_resource_setup_response"); + function f_send_pdu_session_resource_setup_request() runs on NGNASComponent { + log(">>> f_send_pdu_session_resource_setup_request"); + + // Send PDUSessionResourceSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + -, + -, + { + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + bit2oct( + encvalue( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))))) + } + ))); + } + + function f_await_pdu_session_resource_setup_request() runs on NGNASComponent { + log(">>> f_await_pdu_session_resource_setup_request"); // Await PDUSessionEstablishmentRequest f_recv_NGAP_PDU( @@ -791,24 +910,28 @@ module LibNGAP_Functions { PX_RAN_UE_NGAP_ID, { mw_pDUSessionResourceSetupItemSUReq( - PX_PDU_SESSION_ID, - mw_s_NSSAI( - PX_SST, - PX_SD,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - ) + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST, + PX_SD,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); - vc_pDUSessionResourceSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.PDUSessionResourceSetupRequest; + // FIXME: Security + } + + function f_send_pdu_session_resource_setup_response() runs on NGNASComponent { + log(">>> f_send_pdu_session_resource_setup_response"); // Send PDUSessionEstablishmentResponse - /*f_send_NGAP_PDU( + f_send_NGAP_PDU( m_ngap_succMsg( - m_n2_PDUSessionResourceSetupResponse( + m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes/*( -, -, { @@ -816,52 +939,31 @@ module LibNGAP_Functions { PX_PDU_SESSION_ID, m_pDUSessionResourceSetupResponseTransfer( m_qosFlowPerTNLInformation( - m_qosFlowMappingItem( - PX_QOS_FLOW_IDENTIFIER, - m_transportLayerAddress( - PX_TUNNEL_ENDPOINT_ADDRESS - ), - m_gTP_TEID( - PX_GTP_TEID - ) - ), - omit,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, - omit,//template SecurityResult p_securityResult := *, - omit,//template QosFlowListWithCause p_qosFlowFailedToSetupList := *, - omit //template PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := * - ), + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel( + PX_TRANSPORT_LAYER_ADDRESS, + PX_GTP_TEID, + omit + )), + { + m_associatedQosFlowItem( + PX_QOS_FLOW_IDENTIFIER, + omit, + omit + ) + },//in template (value) AssociatedQosFlowList p_associatedQosFlowList, + omit//in template (omit) QosFlowPerTNLInformation.iE_Extensions p_iE_Extensions := omit + ), omit //template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * )) } - )));*/ + )*/)); } - function f_await_session_resource_setup_request_await_session_resource_setup_response() runs on NGNASComponent { - log(">>> f_await_session_resource_setup_request_await_session_resource_setup_response"); + function f_await_pdu_session_resource_setup_response() runs on NGNASComponent { + log(">>> f_await_pdu_session_resource_setup_response"); - // Await PDUSessionEstablishmentRequest - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_PDUSessionResourceSetupRequest( - vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, - { - mw_pDUSessionResourceSetupItemSUReq( - PX_PDU_SESSION_ID, - mw_s_NSSAI( - PX_SST, - PX_SD,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - ) - }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq - ))); - - - // Await PDUSessionEstablishmentResponse + // Await PDUSessionResourceSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_PDUSessionResourceSetupResponse( @@ -885,6 +987,55 @@ module LibNGAP_Functions { ))); } + // function f_await_pdu_session_resource_setup_request_await_session_resource_setup_response() runs on NGNASComponent { + // log(">>> f_await_pdu_session_resource_setup_request_await_session_resource_setup_response"); + + // // Await PDUSessionEstablishmentRequest + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_PDUSessionResourceSetupRequest( + // vc_AMF_UE_ID, + // PX_RAN_UE_NGAP_ID, + // { + // mw_pDUSessionResourceSetupItemSUReq( + // PX_PDU_SESSION_ID, + // mw_s_NSSAI( + // PX_SST, + // PX_SD,//in template (omit) SD p_sD := omit, + // -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + // ), + // ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + // -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + // -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + // ) + // }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + // ))); + + + // // Await PDUSessionEstablishmentResponse + // f_recv_NGAP_PDU( + // mw_ngap_succMsg( + // mw_n2_PDUSessionResourceSetupResponse( + // vc_AMF_UE_ID, + // -, + // { + // ( + // mw_pDUSessionResourceSetupItemSURes( + // ?,//template (present) PDUSessionID p_pDUSessionID, + // decmatch ( + // mw_pDUSessionResourceSetupResponseTransfer( + // ?,//template (present) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation := ?, + // *,//template QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := *, + // *,//template SecurityResult p_securityResult := *, + // *,//template QosFlowListWithCause p_qosFlowFailedToSetupList := *, + // *//template PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := * + // )),// Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupResponseTransfer + // *//template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * + // )) + // } + // ))); + // } + function f_send_ue_context_release_request_await_ue_context_release_response( in template (value) Cause p_Cause ) runs on NGNASComponent { diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index afc4bfd..8b74a8d 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -103,10 +103,8 @@ module Lib_NG_NAS_Security_Functions { p_previous_nas_count_dl := f_NasCountInit(); // Check integrity - var octetstring v_SequenceNumber := v_message.security_Protected_Nas_Message.sequenceNumber;//f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); - log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_SequenceNumber); - var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_message.security_Protected_Nas_Message.sequenceNumber); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_message.security_Protected_Nas_Message.sequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_dl, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), @@ -123,10 +121,8 @@ module Lib_NG_NAS_Security_Functions { p_previous_nas_count_dl := bit2oct(oct2bit(p_previous_nas_count_dl) and4b oct2bit('00FFFFFF'O)); // Use 24bits only } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_Ciphered) { // Check integrity - var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); - log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_SequenceNumber); - var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + log("f_Check_5GAKA_NAS_DL_Message: v_SequenceNumber: ", v_message.security_Protected_Nas_Message.sequenceNumber); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_message.security_Protected_Nas_Message.sequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_dl, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), @@ -209,10 +205,8 @@ module Lib_NG_NAS_Security_Functions { p_previous_nas_count_ul := f_NasCountInit(); // Check integrity - var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); - log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_SequenceNumber); - var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_message.security_Protected_Nas_Message.sequenceNumber); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_message.security_Protected_Nas_Message.sequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_ul, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), @@ -234,10 +228,8 @@ module Lib_NG_NAS_Security_Functions { p_previous_nas_count_ul := f_NasCountInit(); // Check integrity - var octetstring v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(v_message.security_Protected_Nas_Message.messageAuthenticationCode); - log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_SequenceNumber); - var octetstring v_Octet7toN := v_SequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage; - var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + log("f_Check_5GAKA_NAS_UL_Message: v_SequenceNumber: ", v_message.security_Protected_Nas_Message.sequenceNumber); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_message.security_Protected_Nas_Message.sequenceNumber & v_message.security_Protected_Nas_Message.plainNASMessage, p_NasSecurityByRef.NAS_Integrity.Algorithm, p_NasSecurityByRef.NAS_Integrity.K_NAS, f_NG_NasSecurity_EstimateCOUNT(p_previous_nas_count_ul, oct2int(v_message.security_Protected_Nas_Message.sequenceNumber)), -- GitLab From 4ad61eb5e122d35c5658515202e293ceff3371c4 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 19 Jan 2026 13:56:43 +0100 Subject: [PATCH 039/151] Editorial changes in functions naming --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 8 +-- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 24 ++++---- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 57 ++++++++++++++++--- 4 files changed, 66 insertions(+), 27 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index de4bd5b..ed92816 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -56,10 +56,10 @@ LogEventTypes:= Yes # In this section you can specify parameters that are passed to Test Ports. # Open5GS AMF IP and port -#system.NGAP_AMF.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" +system.NGAP_AMF.params := "NGAP/SCTP(server_mode=1,local_port=38412,debug=1)" # Open5GS pcap files -system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" [DEFINE] # In this section you can create macro definitions, diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 6bf8594..3c3d3d8 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -219,9 +219,9 @@ module NGAP_Steps { function f_NGAP_amf_UE_SecurityMode() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_SecurityMode"); if (PICS_OFFLINE_MODE) { - f_await_securitymode_command_await_securitymode_complete(); + f_await_security_mode_command_await_security_mode_complete(); } else { // Await security mode and send response - f_await_securitymode_command_send_securitymode_complete(); + f_await_security_mode_command_send_security_mode_complete(); } log("<<< f_NGAP_amf_UE_SecurityMode"); } // End of function f_NGAP_amf_UE_SecurityMode @@ -434,9 +434,9 @@ module NGAP_Steps { function f_NGAP_gnb_UE_SecurityMode() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_SecurityMode"); if (PICS_OFFLINE_MODE) { - f_await_securitymode_command_await_securitymode_complete(); + f_await_security_mode_command_await_security_mode_complete(); } else { // Await security mode and send response - f_send_securitymode_command_await_securitymode_complete(); + f_send_security_mode_command_await_security_mode_complete(); } log("<<< f_NGAP_gnb_UE_SecurityMode"); } // End of function f_NGAP_gnb_UE_SecurityMode diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index dc6da75..4ceea43 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4052,7 +4052,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - // f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse @@ -4106,7 +4106,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request_await_session_establishment_response @@ -4388,7 +4388,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4458,7 +4458,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4499,7 +4499,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4546,7 +4546,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4598,7 +4598,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4641,7 +4641,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4686,7 +4686,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4740,7 +4740,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4791,7 +4791,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete @@ -4894,7 +4894,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_securitymode_command_send_securitymode_complete(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index f851ab3..5401af8 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -77,6 +77,7 @@ module LibNGAP_Functions { * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ function f_send_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { + // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGSetupRequest( @@ -109,6 +110,8 @@ module LibNGAP_Functions { }, PX_PAGING_DRX ))); + + // Await NGSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_NGSetupResponse( @@ -128,6 +131,7 @@ module LibNGAP_Functions { * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ function f_await_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { + // Await NGSetupRequest f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_NGSetupRequest( @@ -162,6 +166,8 @@ module LibNGAP_Functions { }, PX_PAGING_DRX ))); + + // Await NGSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_NGSetupResponse( @@ -178,12 +184,12 @@ module LibNGAP_Functions { } /** - * @desc Function to send NAS NGSetupResponse message + * @desc Function to send NAS RegistrationRequest message */ function f_send_registration_request() runs on NGNASComponent { log(">>> f_send_registration_request"); - // Send request for REGISTRATION_REQUEST + // Send REGISTRATION_REQUEST var NG_NAS_UL_Message_Type v_nas_message := valueof( m_NG_REGISTRATION_REQUEST( cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), @@ -208,12 +214,12 @@ module LibNGAP_Functions { } /** - * @desc Function to await NAS NGSetupResponse message + * @desc Function to await NAS RegistrationRequest message */ function f_await_registration_request() runs on NGNASComponent { log(">>> f_await_registration_request"); - // Await request for REGISTRATION_REQUEST + // REGISTRATION_REQUEST f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_initialUeMessage @@ -231,6 +237,9 @@ module LibNGAP_Functions { } } + /** + * @desc Function to send NAS RegistrationComplete message + */ function f_send_registration_complete() runs on NGNASComponent { log(">>> f_send_registration_complete"); @@ -252,6 +261,9 @@ module LibNGAP_Functions { ))); } + /** + * @desc Function to await NAS RegistrationComplete message + */ function f_await_registration_complete() runs on NGNASComponent { log(">>> f_await_registration_complete"); @@ -269,6 +281,9 @@ module LibNGAP_Functions { } } + /** + * @desc Function to await NAS AuthenticationRequest message and send for AuthenticationResponse message + */ function f_await_authentication_request_send_authentication_response() runs on NGNASComponent { log(">>> f_await_authentication_request_send_authentication_response"); @@ -328,6 +343,9 @@ module LibNGAP_Functions { setverdict(pass); } + /** + * @desc Function to await NAS AuthenticationRequest message and await for AuthenticationResponse message + */ function f_await_authentication_request_await_authentication_response() runs on NGNASComponent { log(">>> f_await_authentication_request_await_authentication_response"); @@ -390,6 +408,9 @@ module LibNGAP_Functions { setverdict(pass); } + /** + * @desc Function to send NAS AuthenticationRequest message and await for AuthenticationResponse message + */ function f_send_authentication_request_await_authentication_response() runs on NGNASComponent { log(">>> f_send_authentication_request_await_authentication_response"); @@ -400,14 +421,20 @@ module LibNGAP_Functions { // TODO Await response for AUTHENTICATION_RESPONSE } - function f_send_securitymode_command_await_securitymode_complete() runs on NGNASComponent { + /** + * @desc Function to send NAS SecurityModeCommand message and await for SecurityModeComplete message + */ + function f_send_security_mode_command_await_security_mode_complete() runs on NGNASComponent { // TODO Send request for SECURITY_MODE_COMMAND // TODO Receive response for SECURITY_MODE_COMPLETE } - function f_await_securitymode_command_send_securitymode_complete() runs on NGNASComponent { - log(">>> f_await_securitymode_command_send_securitymode_complete"); + /** + * @desc Function to await NAS SecurityModeCommand message and send for SecurityModeComplete message + */ + function f_await_security_mode_command_send_security_mode_complete() runs on NGNASComponent { + log(">>> f_await_security_mode_command_send_security_mode_complete"); // Await request for SECURITY_MODE_COMMAND f_recv_NGAP_PDU( @@ -463,8 +490,11 @@ module LibNGAP_Functions { setverdict(pass); } - function f_await_securitymode_command_await_securitymode_complete() runs on NGNASComponent { - log(">>> f_await_securitymode_command_await_securitymode_complete"); + /** + * @desc Function to await NAS SecurityModeCommand message and await for SecurityModeComplete message + */ + function f_await_security_mode_command_await_security_mode_complete() runs on NGNASComponent { + log(">>> f_await_security_mode_command_await_security_mode_complete"); // Await request for SECURITY_MODE_COMMAND f_recv_NGAP_PDU( @@ -516,6 +546,9 @@ module LibNGAP_Functions { setverdict(pass); } + /** + * @desc Function to await NAS InitialContextSetupRequest message and await for InitialContextSetupResonse message + */ function f_await_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent { log(">>> f_await_initial_context_setup_request_await_initial_context_setup_resonse"); @@ -570,6 +603,9 @@ module LibNGAP_Functions { log("<<< f_await_initial_context_setup_request_await_initial_context_setup_resonse"); } + /** + * @desc Function to await NAS InitialContextSetupRequest message and send for InitialContextSetupResonse message + */ function f_await_initial_context_setup_request_send_initial_context_setup_resonse() runs on NGNASComponent { log(">>> f_await_initial_context_setup_request_send_initial_context_setup_resonse"); @@ -625,6 +661,9 @@ module LibNGAP_Functions { ))); } + /** + * @desc Function to send NAS InitialContextSetupRequest message and await for InitialContextSetupResonse message + */ function f_send_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent { log(">>> f_send_initial_context_setup_request_await_initial_context_setup_resonse"); -- GitLab From fbb76d9c001693a7377dfe94065d4cbb66da4b06 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 20 Jan 2026 16:37:40 +0100 Subject: [PATCH 040/151] Bug fixed in Ats_NG_NAS after compenents reorganisation --- etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 8 +- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 13 +- etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 46 ++- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 46 ++- ttcn/AtsNGAP/NGAP_Pics.ttcn | 2 - ttcn/AtsNGAP/NGAP_Steps.ttcn | 8 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 67 ++-- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 21 +- ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn | 5 +- ttcn/AtsNGAP/NGAP_TestSystem.ttcn | 14 - ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn | 100 +++++ ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 308 +++++++-------- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 159 ++++---- ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn | 25 -- ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn | 11 +- ttcn/Ats_NG_NAS/module.mk | 25 +- ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn | 5 + .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 13 + ttcn/LibNGAP/module.mk | 1 + .../lib_system/Lib_NG_NAS_Functions.ttcn | 360 +++++++++--------- .../Abstract_Socket.cc.patch | 75 +++- 21 files changed, 740 insertions(+), 572 deletions(-) create mode 100644 ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn create mode 100644 ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn diff --git a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ index f646138..a7894f7 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ @@ -1,8 +1,12 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. -NGAP_Pics.PICS_OFFLINE_MODE := true -NGAP_Pics.PICS_NGAP_AMF_IUT := true +NG_NAS_Pics.PICS_NGNAS := true + +NGAP_Pics.PICS_NGAP_AMF_IUT := true +NGAP_Pics.PICS_NGAP_GNB_IUT := false + +LibNGAP_Pics.PICS_OFFLINE_MODE := true # 5GRegAuthSec_deReg.pcap LibNGAP_Pixits.PX_AMF_NAME := "Kontron5G-amf" diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index ed92816..c770531 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -1,9 +1,10 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. -NGAP_Pics.PICS_OFFLINE_MODE := true -NGAP_Pics.PICS_NGAP_AMF_IUT := true -NGAP_Pics.PICS_NGAP_GNB_IUT := false +NGAP_Pics.PICS_NGAP_AMF_IUT := true +NGAP_Pics.PICS_NGAP_GNB_IUT := false + +LibNGAP_Pics.PICS_OFFLINE_MODE := true # 5GRegAuthSec_deReg.pcap LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" @@ -55,11 +56,11 @@ LogEventTypes:= Yes [TESTPORT_PARAMETERS] # In this section you can specify parameters that are passed to Test Ports. -# Open5GS AMF IP and port -system.NGAP_AMF.params := "NGAP/SCTP(server_mode=1,local_port=38412,debug=1)" +# Open5GS AMF IP and port as listener +#system.NGAP_AMF.params := "NGAP/SCTP(server_mode=1,local_port=38412,debug=1)" # Open5GS pcap files -#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" [DEFINE] # In this section you can create macro definitions, diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ index 1b8d350..ffad9bd 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -1,9 +1,43 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. -NGAP_Pics.PICS_OFFLINE_MODE := true -NGAP_Pics.PICS_NGAP_GNB_IUT := true -NGAP_Pics.PICS_NGAP_AMF_IUT := false +NGAP_Pics.PICS_NGAP_GNB_IUT := true +NGAP_Pics.PICS_NGAP_AMF_IUT := false + +LibNGAP_Pics.PICS_OFFLINE_MODE := true + +# 5GRegAuthSec_deReg.pcap +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v128 + +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O + +# OP +Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O +# OPc +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E88E6183CA'O +Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true + +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B +# https://www.binaryhexconverter.com/hex-to-binary-converter +Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B + +Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] # In this section you can specify the name of the log file and the classes of events @@ -23,8 +57,8 @@ LogEventTypes:= Yes # In this section you can specify parameters that are passed to Test Ports. # Open5GS AMF IP and port -#system.NGAP_gNB_1.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" -#system.N2_gNBaMF_P.params := "NGAP/SCTP(server=192.168.1.21,port=4444,debug=1)" +#system.NGAP_gNB_1.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" +#system.N2_gNBaMF_P.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" @@ -54,7 +88,7 @@ system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0 # In this section you can specify what parts of your test suite you want to execute. #AtsImsIot_TestControl.control -# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE SETUP REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE SETUP RESPONSE for successfully established PDU session. +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE SETUP REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE SETUP RESPONSE for successfully established PDU session. NGAP_TestCases.TC_NGAP_GNB_PDU_01 # Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value. #NGAP_TestCases.TC_NGAP_GNB_PDU_02 diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 29f552f..6a929a2 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -1,31 +1,45 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. -#NAS_Pics.PICS_NAS_AMF_IUT := false -#NAS_Pics.PICS_NAS_AMF_IUT := true -NG_NAS_Pics.PICS_NGNAS := true +NG_NAS_Pics.PICS_NGNAS := true + +NGAP_Pics.PICS_NGAP_AMF_IUT := true +NGAP_Pics.PICS_NGAP_GNB_IUT := false + +LibNGAP_Pics.PICS_OFFLINE_MODE := true # 5GRegAuthSec_deReg.pcap -LibNGAP_Pixits.PX_AMF_NAME := "Kontron5G-amf" -LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 0 -LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 -LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O -LibNGAP_Pixits.PX_GNB_ID := '0000000000000001001110'B +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v128 Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O + # OP Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O # OPc -Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := '00000000000000000000000000000000'O +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E88E6183CA'O Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true -Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B -Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O -Lib_NG_NAS_Pixits.PX_BEARER_ID := '11010'B +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B +# https://www.binaryhexconverter.com/hex-to-binary-converter +Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B -NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) +Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] # In this section you can specify the name of the log file and the classes of events @@ -43,9 +57,9 @@ LogEventTypes:= Yes [TESTPORT_PARAMETERS] # In this section you can specify parameters that are passed to Test Ports. -system.NGAP_gNB_1.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" -system.N2_gNBaMF_P.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/5GRegAuthSec_deReg.pcap)" -#aMFNASComponent.N2_gNBaMF_P.params := "NAS/SCTP_FILE/IP_FILE/ETH/PCAP_FILE(file=../captures/free5gc.pcap)" + +# Open5GS pcap files +system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" [DEFINE] # In this section you can create macro definitions, diff --git a/ttcn/AtsNGAP/NGAP_Pics.ttcn b/ttcn/AtsNGAP/NGAP_Pics.ttcn index 636d3dc..4706723 100644 --- a/ttcn/AtsNGAP/NGAP_Pics.ttcn +++ b/ttcn/AtsNGAP/NGAP_Pics.ttcn @@ -140,6 +140,4 @@ module NGAP_Pics { modulepar boolean PICS_A4_15_2 := false; //AMF - RIM information Transfer procedure - DOWNLINK RIM INFORMATION TRANSFER } // End of group PICS_A4 - modulepar boolean PICS_OFFLINE_MODE := false; // If true, the test system runs in offline mode (no SUT connection) - } // End of module NGAP_Pics diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 3c3d3d8..9328005 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -17,12 +17,14 @@ module NGAP_Steps { import from NGAP_IEs language "ASN.1:1997" all; import from LibNGAP_Steps all; - import from NGAP_TestSystem all; import from LibNGAP_Templates all; import from LibNGAP_Functions all; import from LibNGAP_Pixits all; + import from LibNGAP_Pics all; + import from LibNGAP_Interface all; // AtsNGAP + import from NGAP_TestSystem all; import from NGAP_Pixits all; import from NGAP_Pics all; @@ -187,9 +189,9 @@ module NGAP_Steps { } log("f_NGAP_amf_UE_Register: f_send_registration_request done"); if (PICS_OFFLINE_MODE) { - f_send_registration_request(); - } else { f_await_registration_request(); + } else { + f_send_registration_request(); } log("<<< f_NGAP_amf_UE_Register"); } // End of function f_NGAP_amf_UE_Register diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 4ceea43..932ba1c 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -73,7 +73,10 @@ module NGAP_TCFunctions { // Preamble f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_await_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_send_authentication_request_await_authentication_response + f_NGAP_gnb_UE_SecurityMode(); // f_send_security_mode_command_await_security_mode_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4051,37 +4054,37 @@ module NGAP_TCFunctions { // Preamble f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); - // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - - // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // // Body - // //action("Trigger PDU session resource SETUP!"); - // f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request - - // f_recv_NGAP_PDU( - // mw_ngap_initMsg( - // mw_n2_PDUSessionResourceSetupRequest( - // PX_AMF_UE_NGAP_ID, - // PX_RAN_UE_NGAP_ID, - // { - // mw_pDUSessionResourceSetupItemSUReq( - // PX_PDU_SESSION_ID, - // mw_s_NSSAI( - // PX_SST, - // -,//in template (omit) SD p_sD := omit, - // -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - // ), - // ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - // -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - // -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - // ) - // }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq - // ))); + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + //action("Trigger PDU session resource SETUP!"); + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceSetupRequest( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceSetupItemSUReq( + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST, + -,//in template (omit) SD p_sD := omit, + -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) + }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 7494500..468774a 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -15,16 +15,17 @@ module NGAP_TestCases { import from LibCommon_Sync all ; // LibNGAP - import from NGAP_Constants language "ASN.1:2002" all; - import from NGAP_CommonDataTypes language "ASN.1:2002" all; - import from NGAP_IEs language "ASN.1:2002" all; - import from NGAP_PDU_Contents language "ASN.1:2002" all; - import from NGAP_PDU_Descriptions language "ASN.1:2002" all; - import from NGAP_Containers language "ASN.1:2002" all; - - import from LibNGAP_TypesAndValues all; - import from LibNGAP_Templates all; - import from LibNGAP_Pixits all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_CommonDataTypes language "ASN.1:2002" all; + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_PDU_Contents language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from NGAP_Containers language "ASN.1:2002" all; + + import from LibNGAP_TypesAndValues all; + import from LibNGAP_Templates all; + import from LibNGAP_Pixits all; + import from LibNGAP_Interface all; // AtsNGAP import from LibNGAP_TypesAndValues all; diff --git a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn index e7adcec..0a17cc8 100644 --- a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn @@ -15,11 +15,12 @@ module NGAP_TestConfiguration { import from LibCommon_Sync all; import from LibCommon_VerdictControl all; - // AtsNGAP - import from NGAP_TestSystem all; // LibNGAP import from LibNGAP_Interface all; + // AtsNGAP + import from NGAP_TestSystem all; + group cfUp { /** diff --git a/ttcn/AtsNGAP/NGAP_TestSystem.ttcn b/ttcn/AtsNGAP/NGAP_TestSystem.ttcn index 1d42e80..64d5436 100644 --- a/ttcn/AtsNGAP/NGAP_TestSystem.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestSystem.ttcn @@ -36,20 +36,6 @@ module NGAP_TestSystem { } // End of group TestSystemInterfaces - /** - * @desc The NGAP AMF component, gNodeB is SUT - */ - type component gNBNGAPComponent extends ServerSyncComp, NGNASComponent { - //component variables - } // End of type component gNBNGAPComponent - - /** - * @desc The AMF NGAP component, ANF is SUT - */ - type component aMFNGAPComponent extends ServerSyncComp, NGNASComponent { - //component variables - } // End of type component aMFNGAPComponent - //type component NGAP extends ServerSyncComp, NGNASComponent { // //component variables //} // End of component NGAP diff --git a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn new file mode 100644 index 0000000..5072585 --- /dev/null +++ b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn @@ -0,0 +1,100 @@ +module NG_NAS_Steps { + + // LibCommon + import from LibCommon_Sync all; + import from LibCommon_VerdictControl all; + import from LibCommon_Time all; + + // Lib_NG_NAS + import from Lib_NG_NAS_Templates all; + import from Lib_NG_NAS_Security_Functions all; + import from Lib_NG_NAS_Functions all; + import from Lib_NG_NAS_Pixits all; + + // Lib3GPP + import from NAS_CommonTypeDefs all; + import from NAS_CommonTemplates all; + import from NG_NAS_TypeDefs all; + import from NG_NAS_TestSystem all; + import from NG_NAS_Templates all; + import from NG_NAS_Templates all; + import from NG_NAS_MsgContainers all; + + // LibNGAP + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from LibNGAP_Pixits all; + import from LibNGAP_Pics all; + import from LibNGAP_Templates all; + import from LibNGAP_Interface all; + import from LibNGAP_Steps all; + import from LibNGAP_Functions all; + import from NGAP_TestSystem all; + + // LibFramwork + import from LibHelpers_Functions all; + + // AtsNGAP + // import from NGAP_Pixits all; + // import from NGAP_Steps all; + + group amf { + + function f_NG_NAS_amf_UE_Register() runs on aMF_NGNAS_NGAPComponent { + log(">>> f_NGAP_amf_UE_f_NG_NAS_amf_UE_RegisterRegister"); + if (PICS_OFFLINE_MODE) { + f_await_NGSetupRequest_await_NGSetupRespone(); + } else { + f_send_NGSetupRequest_await_NGSetupRespone(); + } + log("f_NGAP_amf_UE_Register: f_send_registration_request done"); + if (PICS_OFFLINE_MODE) { + f_await_registration_request(); + } else { + f_send_registration_request(); + } + log("<<< f_NGAP_amf_UE_Register"); + } // End of function f_NG_NAS_amf_UE_Register + + function f_NG_NAS_amf_UE_Authentication() runs on aMF_NGNAS_NGAPComponent { + log(">>> f_NG_NAS_amf_UE_Authentication"); + if (PICS_OFFLINE_MODE) { + f_await_authentication_request_await_authentication_response(); + } else { + f_await_authentication_request_send_authentication_response(); + } + } // End of function f_NG_NAS_amf_UE_Authentication + + function f_NG_NAS_amf_UE_SecurityMode() runs on aMFNGAPComponent { + log(">>> f_NG_NAS_amf_UE_SecurityMode"); + if (PICS_OFFLINE_MODE) { + f_await_security_mode_command_await_security_mode_complete(); + } else { // Await security mode and send response + f_await_security_mode_command_send_security_mode_complete(); + } + log("<<< f_NG_NAS_amf_UE_SecurityMode"); + } // End of function f_NG_NAS_amf_UE_SecurityMode + + function f_NG_NAS_amf_UE_InitialContextSetup() runs on aMFNGAPComponent { + log(">>> f_NG_NAS_amf_UE_InitialContextSetup"); + if (PICS_OFFLINE_MODE) { + f_await_initial_context_setup_request_await_initial_context_setup_resonse(); + } else { + f_await_initial_context_setup_request_send_initial_context_setup_resonse(); + } + } // End of function f_NG_NAS_amf_UE_InitialContextSetup + + function f_NG_NAS_amf_RegistrationComplete() runs on aMFNGAPComponent { + log(">>> f_NG_NAS_amf_RegistrationComplete"); + if (PICS_OFFLINE_MODE) { + f_await_registration_complete(); + } else { + f_send_registration_complete(); + } + } // End of function f_NG_NAS_amf_RegistrationComplete + + + } // End of group amf + +} // End of module NG_NAS_Steps \ No newline at end of file diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index a03f748..714e82b 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -18,10 +18,10 @@ module NG_NAS_TCFunctions { import from LibCommon_Time all; // Lib_NG_NAS - import from Lib_NG_NAS_Interface all; import from Lib_NG_NAS_Templates all; import from Lib_NG_NAS_Security_Functions all; import from Lib_NG_NAS_Functions all; + import from Lib_NG_NAS_Pixits all; // Lib3GPP import from NAS_CommonTypeDefs all; @@ -37,6 +37,7 @@ module NG_NAS_TCFunctions { import from NGAP_Constants language "ASN.1:2002" all; import from NGAP_PDU_Descriptions language "ASN.1:2002" all; import from LibNGAP_Pixits all; + import from LibNGAP_Pics all; import from LibNGAP_Templates all; import from LibNGAP_Interface all; import from LibNGAP_Steps all; @@ -45,10 +46,9 @@ module NG_NAS_TCFunctions { // LibFramwork import from LibHelpers_Functions all; - // AtsNGAP - import from NGAP_Pixits all; - import from NGAP_Steps all; - import from Lib_NG_NAS_Pixits all; + // Ats_NG_NAS + import from NG_NAS_Pics all; + import from NG_NAS_Steps all; // interface at AMF group TP_AMF_NGAP { @@ -60,13 +60,11 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_AUT_REQ_01 */ - function f_TC_5GNAS_AMF_AUT_REQ_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_AUT_REQ_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_send_NasRegistrationRequest(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -112,14 +110,13 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_AUT_REQ_02 */ - function f_TC_5GNAS_AMF_AUT_REQ_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_AUT_REQ_02() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); + f_NG_NAS_amf_UE_Authentication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -154,13 +151,12 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_AUT_REQ_03 */ - function f_TC_5GNAS_AMF_AUT_REQ_03() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_AUT_REQ_03() runs on aMF_NGNAS_NGAPComponent { // Local variables var NGAP_PDU v_PDU; var integer v_start_time_ms; // Preamble - f_NGAP_gnb_init2(); f_send_NGSetupRequest_await_NGSetupRespone(); f_send_NasRegistrationRequest(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -218,13 +214,11 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_AUT_REQ_04 */ - function f_TC_5GNAS_AMF_AUT_REQ_04() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_AUT_REQ_04() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_send_NasRegistrationRequest(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -286,15 +280,13 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_AUT_REQ_05 */ - function f_TC_5GNAS_AMF_AUT_REQ_05() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_AUT_REQ_05() runs on aMF_NGNAS_NGAPComponent { // Local variables var NG_NAS_DL_Message_Type v_NG_NAS_DL_Message_Type; var NAS_KsiValue ngKSI; // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_send_NasRegistrationRequest(); + f_NG_NAS_amf_UE_Register(); f_decode_5G_NAS_DL_Message(vc_recvNAS_PDU, v_NG_NAS_DL_Message_Type); ngKSI := v_NG_NAS_DL_Message_Type.authentication_Request.ngNasKeySetId.nasKeySetId; f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -357,13 +349,11 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_AUT_ABN_01 */ - function f_TC_5GNAS_AMF_AUT_ABN_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_AUT_ABN_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_send_NasRegistrationRequest(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -429,13 +419,12 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_NGNAS_AMF_AUT_SEQ_01 */ - function f_TC_NGNAS_AMF_AUT_SEQ_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_NGNAS_AMF_AUT_SEQ_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -477,17 +466,15 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_SEC_ACC_01 */ - function f_TC_5GNAS_AMF_SEC_ACC_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_SEC_ACC_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_await_initial_context_setup_request_send_initial_context_setup_resonse(); - f_send_NGUERadioCApabilityInfoIndication(); - f_await_registration_accept(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + f_NG_NAS_amf_RegistrationComplete(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -523,14 +510,12 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_SEC_REJ_01 */ - function f_TC_5GNAS_AMF_SEC_REJ_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_SEC_REJ_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); f_await_NasSecurityModeCommand(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -569,71 +554,70 @@ module NG_NAS_TCFunctions { group /*5_4_5_*/NAS_transport_procedure { - /** - * @desc Testcase function for TC_5GNAS_AMF_DLN_ACC_01 - */ - function f_TC_5GNAS_AMF_DLN_ACC_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { - // Local variables + /** + * @desc Testcase function for TC_5GNAS_AMF_DLN_ACC_01 + */ + function f_TC_5GNAS_AMF_DLN_ACC_01() runs on aMF_NGNAS_NGAPComponent { + // Local variables - // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_await_initial_context_setup_request_await_initial_context_setup_resonse(); - f_send_NGUERadioCApabilityInfoIndication(); - f_await_registration_accept(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Preamble + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + f_NG_NAS_amf_RegistrationComplete(); + f_NG_NAS_amf_UE_InitialContextSetup(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - vt_NgNasUl_Msg := m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( - cs_NG_PDU_SessionId, - tsc_PTI_1 - ); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - // Await PDU SESSION ESTABLISHMENT ACCEPT with NAS encrypted payload - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - ?,//PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // PDU SESSION ESTABLISHMENT ACCEPT - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message - ) == false) { - setverdict(fail); - return; - } else { - setverdict(pass); - } + // Body + vt_NgNasUl_Msg := m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( + cs_NG_PDU_SessionId, + tsc_PTI_1 + ); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + // Await PDU SESSION ESTABLISHMENT ACCEPT with NAS encrypted payload + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?,//PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + ? // PDU SESSION ESTABLISHMENT ACCEPT + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + setverdict(fail); + return; + } else { + setverdict(pass); + } - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - //TODO: f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_5GNAS_AMF_DLN_ACC_01 + // Postamble + //TODO: f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + } // End of function f_TC_5GNAS_AMF_DLN_ACC_01 } // End of group /*5__4_5_*/NAS_transport_procedure @@ -644,15 +628,14 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_REG_ACC_01 */ - function f_TC_5GNAS_AMF_REG_ACC_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_ACC_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_send_NGUERadioCApabilityInfoIndication(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -763,15 +746,14 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_REG_ACC_02 */ - function f_TC_5GNAS_AMF_REG_ACC_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_ACC_02() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_send_NGUERadioCApabilityInfoIndication(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -889,15 +871,14 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_REG_ACC_03 */ - function f_TC_5GNAS_AMF_REG_ACC_03() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_ACC_03() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_send_NGUERadioCApabilityInfoIndication(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1015,15 +996,14 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_REG_ACC_04 */ - function f_TC_5GNAS_AMF_REG_ACC_04() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_ACC_04() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_send_NGUERadioCApabilityInfoIndication(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1137,15 +1117,14 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_REG_ACC_05 */ - function f_TC_5GNAS_AMF_REG_ACC_05() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_ACC_05() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); - f_await_NasAuthenticationRequest_send_NasAuthenticationResponse(); - f_await_NasSecurityModeCommand_send_NasSecurityModeComplete(); - f_send_NGUERadioCApabilityInfoIndication(); + f_NG_NAS_amf_UE_Register(); + f_NG_NAS_amf_UE_Authentication(); + f_NG_NAS_amf_UE_SecurityMode(); + // FIXME Optional f_send_NGUERadioCApabilityInfoIndication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1259,12 +1238,15 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TP_5GNAS_AMF_REG_REJ_01 */ - function f_TC_5GNAS_AMF_REG_REJ_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_REJ_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + if (PICS_OFFLINE_MODE) { + f_await_NGSetupRequest_await_NGSetupRespone(); + } else { + f_send_NGSetupRequest_await_NGSetupRespone(); + } f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1430,12 +1412,15 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TP_5GNAS_AMF_REG_REJ_02 */ - function f_TC_5GNAS_AMF_REG_REJ_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_REG_REJ_02() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + if (PICS_OFFLINE_MODE) { + f_await_NGSetupRequest_await_NGSetupRespone(); + } else { + f_send_NGSetupRequest_await_NGSetupRespone(); + } f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1555,12 +1540,11 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_DRG_ACC_01 */ - function f_TC_5GNAS_AMF_DRG_ACC_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_DRG_ACC_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1623,12 +1607,11 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_DRG_ACC_02 */ - function f_TC_5GNAS_AMF_DRG_ACC_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_DRG_ACC_02() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1695,12 +1678,12 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_DRG_REQ_01 */ - function f_TC_5GNAS_AMF_DRG_REQ_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_DRG_REQ_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + f_NG_NAS_amf_UE_Register(); + // TODO f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); //USER REGISTRATION log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1757,12 +1740,12 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_DRG_REQ_02 */ - function f_TC_5GNAS_AMF_DRG_REQ_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_DRG_REQ_02() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + f_NG_NAS_amf_UE_Register(); + // TODO f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1852,12 +1835,12 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GNAS_AMF_DRG_REQ_03 */ - function f_TC_5GNAS_AMF_DRG_REQ_03() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GNAS_AMF_DRG_REQ_03() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); - f_send_NGSetupRequest_await_NGSetupRespone(); + f_NG_NAS_amf_UE_Register(); + // TODO f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1927,11 +1910,10 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GAP_ICS_01 */ - function f_TC_5GAP_ICS_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GAP_ICS_01() runs on gNB_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1950,11 +1932,10 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GAP_ICS_02 */ - function f_TC_5GAP_ICS_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GAP_ICS_02() runs on gNB_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1973,11 +1954,10 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GAP_DNA_01 */ - function f_TC_5GAP_DNA_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GAP_DNA_01() runs on gNB_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1996,11 +1976,10 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GAP_DNA_02 */ - function f_TC_5GAP_DNA_02() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GAP_DNA_02() runs on gNB_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -2019,11 +1998,10 @@ module NG_NAS_TCFunctions { /** * @desc Testcase function for TC_5GAP_PDU_01 */ - function f_TC_5GAP_PDU_01() runs on NGNASComponent /*gNB_NGNAS_NGAPComponent*/ { + function f_TC_5GAP_PDU_01() runs on gNB_NGNAS_NGAPComponent { // Local variables // Preamble - f_NGAP_gnb_init2(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index d0615a3..d6a2a10 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -35,34 +35,27 @@ module NG_NAS_TestCases { import from Lib_NG_NAS_Interface all; import from Lib_NG_NAS_Security_Functions all; import from Lib_NG_NAS_Functions all; - + // NG_NAS import from NG_NAS_TCFunctions all; import from NG_NAS_Pics all; import from NG_NAS_TestConfiguration all; import from NG_NAS_TestSystem all; + import from NG_NAS_TestConfiguration all; // LibNGAP - import from NGAP_Constants language "ASN.1:2002" all; - import from NGAP_CommonDataTypes language "ASN.1:2002" all; - import from NGAP_IEs language "ASN.1:2002" all; - import from NGAP_PDU_Contents language "ASN.1:2002" all; - import from NGAP_PDU_Descriptions language "ASN.1:2002" all; - import from NGAP_Containers language "ASN.1:2002" all; - - //import from LibNGAP_TypesAndValues all; - //import from LibNGAP_Templates all; - //import from LibNGAP_Pixits all; + import from NGAP_Constants language "ASN.1:2002" all; + import from NGAP_CommonDataTypes language "ASN.1:2002" all; + import from NGAP_IEs language "ASN.1:2002" all; + import from NGAP_PDU_Contents language "ASN.1:2002" all; + import from NGAP_PDU_Descriptions language "ASN.1:2002" all; + import from NGAP_Containers language "ASN.1:2002" all; + import from LibNGAP_Interface all; // AtsNGAP - //import from LibNGAP_TypesAndValues all; - //import from NGAP_TestConfiguration all; import from NGAP_TestSystem all; - //import from NGAP_TCFunctions all; - //import from NGAP_Pics all; - - group TC_AMF { + group TC_AMF { // AMF is the IUT group /*5_4_*/fiveGMM_Common_Procedures { @@ -72,10 +65,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1 */ - testcase TC_5GNAS_AMF_AUT_REQ_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_AUT_REQ_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -84,7 +77,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_AUT_REQ_01()); @@ -100,10 +93,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI * @see ETSI TS 124 501 [1], Clause 5.4.1.3.5 and 8.2.5 */ - testcase TC_5GNAS_AMF_AUT_REQ_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_AUT_REQ_02() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -112,7 +105,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_AUT_REQ_02()); @@ -128,10 +121,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1 */ - testcase TC_5GNAS_AMF_AUT_REQ_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_AUT_REQ_03() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -140,7 +133,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_AUT_REQ_03()); @@ -156,10 +149,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c) and 8.2.4 */ - testcase TC_5GNAS_AMF_AUT_REQ_04() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_AUT_REQ_04() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -168,7 +161,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_AUT_REQ_04()); @@ -184,10 +177,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a new AUTHENTICATION REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4 */ - testcase TC_5GNAS_AMF_AUT_REQ_05() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_AUT_REQ_05() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -196,7 +189,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_AUT_REQ_05()); @@ -212,10 +205,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a new IDENTITY REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 and 8.2.4 */ - testcase TC_5GNAS_AMF_AUT_ABN_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_AUT_ABN_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -224,7 +217,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_AUT_ABN_01()); @@ -244,10 +237,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE * @see ETSI TS 124 501 [1], Clause 5.4.1.2 */ - testcase TC_NGNAS_AMF_AUT_SEQ_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_NGNAS_AMF_AUT_SEQ_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -256,7 +249,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_NGNAS_AMF_AUT_SEQ_01()); @@ -272,10 +265,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration * @see ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25 */ - testcase TC_5GNAS_AMF_SEC_ACC_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_SEC_ACC_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -284,7 +277,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_SEC_ACC_01()); @@ -300,10 +293,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration * @see ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25 */ - testcase TC_5GNAS_AMF_SEC_REJ_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_SEC_REJ_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -312,7 +305,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_SEC_REJ_01()); @@ -332,10 +325,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT correctly handles a UL NAS transport message containing a PDU SESSION ESTABLISHMENT REQUEST from the UE and responds with a DL NAS transport message containing a PDU SESSION ESTABLISHMENT ACCEPT * @see ETSI TS 124 501 [1], Clause 5.4.5 and 8.2.10, 8.2.11 */ - testcase TC_5GNAS_AMF_DLN_ACC_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_DLN_ACC_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -344,7 +337,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_DLN_ACC_01()); @@ -366,10 +359,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a REGISTRATION ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 when initial registration is accepted by the network * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7 */ - testcase TC_5GNAS_AMF_REG_ACC_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_ACC_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -378,7 +371,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_ACC_01()); @@ -394,10 +387,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a REGISTRATION ACCEPT message indicating SMS over NAS allowed when initial registration with SMS over NAS is requested and network allows SMS service * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7 */ - testcase TC_5GNAS_AMF_REG_ACC_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_ACC_02() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -406,7 +399,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_ACC_02()); @@ -422,10 +415,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a REGISTRATION ACCEPT message indicating SMS over NAS not allowed when initial registration with SMS over NAS is requested and network does not support SMS service * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7 */ - testcase TC_5GNAS_AMF_REG_ACC_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_ACC_03() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -434,7 +427,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_ACC_03()); @@ -450,10 +443,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT includes the allowed NSSAI in the REGISTRATION ACCEPT message when the UE includes a requested NSSAI in the REGISTRATION REQUEST message and the network allows one or more S-NSSAIs from the requested NSSAI * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7 */ - testcase TC_5GNAS_AMF_REG_ACC_04() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_ACC_04() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -462,7 +455,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_ACC_04()); @@ -478,10 +471,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT optionally includes rejected NSSAI in the REGISTRATION ACCEPT message when the network rejects one or more S-NSSAIs from the requested NSSAI * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7 */ - testcase TC_5GNAS_AMF_REG_ACC_05() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_ACC_05() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -490,7 +483,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_ACC_05()); @@ -506,10 +499,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT rejects initial registration request due to general NAS level mobility management congestion control with 5GMM cause value #22 - congestion and assign a value for back-off timer T3346 * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9 */ - testcase TC_5GNAS_AMF_REG_REJ_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_REJ_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -518,7 +511,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_REJ_01()); @@ -534,10 +527,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT rejects initial registration request because all the S-NSSAI(s) included in the requested NSSAI are either rejected for current PLMN, rejected for the current registration area or rejected due to failed or revoked NSSAIs * @see ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9 */ - testcase TC_5GNAS_AMF_REG_REJ_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_REG_REJ_02() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -546,7 +539,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_REG_REJ_02()); @@ -566,10 +559,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT, upon receiving a DEREGISTRATION REQUEST message containing the De-registration type IE with Normal de-registration from the UE, sends a DEREGISTRATION ACCEPT message * @see ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13 */ - testcase TC_5GNAS_AMF_DRG_ACC_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_DRG_ACC_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -578,7 +571,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_DRG_ACC_01()); @@ -594,10 +587,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT, upon receiving a DEREGISTRATION REQUEST message containing the De-registration type IE with Switch-off from the UE, does not send a DEREGISTRATION ACCEPT message and IUT completes de-registration procedure * @see ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13 */ - testcase TC_5GNAS_AMF_DRG_ACC_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_DRG_ACC_02() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -606,7 +599,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_DRG_ACC_02()); @@ -626,10 +619,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT initiates network de-registration by sending a DEREGISTRATION REQUEST message containing De-registration type IE with re-registration not required and the access type based on the UE’s registration status (3GPP access only). **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE * @see ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14 */ - testcase TC_5GNAS_AMF_DRG_REQ_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_DRG_REQ_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -638,7 +631,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_DRG_REQ_01()); @@ -654,10 +647,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT initiates network de-registration by sending a DEREGISTRATION REQUEST message and if UE does not send DEREGISTRATION ACCEPT then IUT retransmits DEREGISTRATION REQUEST message after timer T3522 expiration. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration * @see ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14 */ - testcase TC_5GNAS_AMF_DRG_REQ_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_DRG_REQ_02() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -666,7 +659,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_DRG_REQ_02()); @@ -682,10 +675,10 @@ module NG_NAS_TestCases { * @desc Verify that the IUT initiates network de-registration by sending DEREGISTRATION REQUEST message containing De-registration type IE with re-registration required and the access type based on the UE’s registration status (3GPP access only). **NOTE 1:** UE sends DEREGISTRATION ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" * @see ETSI TS 124 501 [1], Clauses 5.5.2.3.1, 5.5.2.3.2 and 8.2.14 */ - testcase TC_5GNAS_AMF_DRG_REQ_03() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_DRG_REQ_03() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables - var gNB_NGNAS_NGAPComponent v_ngnas_ngap_gnb; + var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; // Test control if (not PICS_NGNAS) { @@ -694,7 +687,7 @@ module NG_NAS_TestCases { } // Test component configuration - f_cf_NGNAS_gNB_Up(v_ngnas_ngap_gnb); + f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_DRG_REQ_03()); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn index c8b48ac..470f5d4 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn @@ -27,31 +27,6 @@ module NG_NAS_TestConfiguration{ group cfUp { - /** - * @desc Creates test configuration of cf_NGAP_AMF - gNB is SUT - * @param p_NGAPComponent_mme - */ - /*function f_cf_NGAP_aMF_Up( - out aMFNGAPComponent p_NGAPComponent_amf - ) runs on aMFNGAPComponent system TestAdapter { - //Variables - var FncRetCode v_ret := e_success; - - //Create - p_NGAPComponent_amf := aMFNGAPComponent.create ; - - // Connect mtc sync port - connect(self:syncPort, self:syncPort); - // Connect client sync port - connect(p_NGAPComponent_amf:syncPort, self:syncPort) ; - //Map - map(p_NGAPComponent_amf:N2_gNBaMF_P, system:NGAP_AMF); - - activate(a_mtc_shutdown()); - - f_setVerdict(v_ret); - } // End of function f_cf_NGAP_AMF_Up*/ - /** * @desc Creates test configuration of cf_NGNAS_gNB - AMF is SUT * @param p_NGNAS_Component_gnb diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn index e713ec6..becd977 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn @@ -14,8 +14,11 @@ module NG_NAS_TestSystem { // LibCommon import from LibCommon_Sync all; - // Lib_NG_NAS - import from Lib_NG_NAS_Interface all; + // LibNGAP + import from LibNGAP_Interface all; + + // NGAP + import from NGAP_TestSystem all; group SystemConfiguration { @@ -24,14 +27,14 @@ module NG_NAS_TestSystem { /** * @desc The NGAP AMF component, AMF is SUT */ - type component gNB_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { + type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, aMFNGAPComponent { //component variables } // End of type component gNBNGAPComponent /** * @desc The NGAP AMF component, gNodeB is SUT */ - type component aMF_NGNAS_NGAPComponent extends ServerSyncComp, NGNASComponent { + type component gNB_NGNAS_NGAPComponent extends ServerSyncComp, gNBNGAPComponent { //component variables } // End of type component gNBNGAPComponent diff --git a/ttcn/Ats_NG_NAS/module.mk b/ttcn/Ats_NG_NAS/module.mk index 4e5b69e..31c2ef8 100644 --- a/ttcn/Ats_NG_NAS/module.mk +++ b/ttcn/Ats_NG_NAS/module.mk @@ -1,18 +1,19 @@ suite := Ats_NG_NAS pdu := NGAP-PDU -sources:= \ - NG_NAS_TestCases.ttcn \ - NG_NAS_TestControl.ttcn \ - NG_NAS_TCFunctions.ttcn \ - NG_NAS_Pics.ttcn \ - NG_NAS_TestSystem.ttcn \ - NG_NAS_TestConfiguration.ttcn \ - ../AtsNGAP/NGAP_Pics.ttcn \ - ../AtsNGAP/NGAP_Pixits.ttcn \ - ../AtsNGAP/NGAP_Steps.ttcn \ - ../AtsNGAP/NGAP_TestSystem.ttcn \ - ../AtsNGAP/NGAP_TestConfiguration.ttcn +sources:= \ + NG_NAS_TestCases.ttcn \ + NG_NAS_TestControl.ttcn \ + NG_NAS_TCFunctions.ttcn \ + NG_NAS_Steps.ttcn \ + NG_NAS_Pics.ttcn \ + NG_NAS_TestSystem.ttcn \ + NG_NAS_TestConfiguration.ttcn \ + ../AtsNGAP/NGAP_Pics.ttcn \ + ../AtsNGAP/NGAP_Pixits.ttcn \ + ../AtsNGAP/NGAP_Steps.ttcn \ + ../AtsNGAP/NGAP_TestSystem.ttcn \ + ../AtsNGAP/NGAP_TestConfiguration.ttcn modules := \ diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn new file mode 100644 index 0000000..60466ea --- /dev/null +++ b/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn @@ -0,0 +1,5 @@ +module LibNGAP_Pics { + + modulepar boolean PICS_OFFLINE_MODE := false; // If true, the test system runs in offline mode (no SUT connection) + +} // End of module LibNGAP_Pics diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index e1aed28..bcdec9d 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -94,6 +94,19 @@ module LibNGAP_Interface { } // End of type component NGNASComponent + /** + * @desc The NGAP AMF component, gNodeB is SUT + */ + type component gNBNGAPComponent extends ServerSyncComp, NGNASComponent { + //component variables + } // End of type component gNBNGAPComponent + + /** + * @desc The AMF NGAP component, ANF is SUT + */ + type component aMFNGAPComponent extends ServerSyncComp, NGNASComponent { + //component variables + } // End of type component aMFNGAPComponent } // End of group interfacePorts diff --git a/ttcn/LibNGAP/module.mk b/ttcn/LibNGAP/module.mk index bf4fb8f..eb37595 100644 --- a/ttcn/LibNGAP/module.mk +++ b/ttcn/LibNGAP/module.mk @@ -1,6 +1,7 @@ sources := \ lib/LibNGAP_TypesAndValues.ttcn \ lib/LibNGAP_Pixits.ttcn \ + lib/LibNGAP_Pics.ttcn \ lib/LibNGAP_Templates.ttcn \ lib/LibNGAP_EncdecDeclarations.ttcn \ lib_system/LibNGAP_Functions.ttcn \ diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index eb8f37b..e8b321b 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -55,128 +55,128 @@ module Lib_NG_NAS_Functions { ))))); } - /** - * @desc Function to await NAS RegistrationRequest message - * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg - */ - function f_await_registration_request() runs on NGNASComponent { - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_initialUeMessage( - PX_RAN_UE_NGAP_ID - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { - log("Received NG_REGISTRATION_REQUEST NAS message"); +// /** +// * @desc Function to await NAS RegistrationRequest message +// * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg +// */ +// function f_await_registration_request() runs on NGNASComponent { +// f_recv_NGAP_PDU( +// mw_ngap_initMsg( +// mw_n2_initialUeMessage( +// PX_RAN_UE_NGAP_ID +// ))); +// f_NASPDU_Get(vc_recvNGAP_PDU); +// if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { +// log("Received NG_REGISTRATION_REQUEST NAS message"); - // Extract ID-RAN-UE-NGAP-ID - vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; - log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); - } else { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - } - } +// // Extract ID-RAN-UE-NGAP-ID +// vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; +// log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); +// } else { +// log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); +// setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); +// } +// } - /** - * @desc Function to await NAS NGSetupResponse message - */ - function f_await_registration_accept() runs on NGNASComponent { - // Await request for REGISTRATION_ACCEPT - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // AuthorizationRequest - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - -, - ?, - mw_PLMN_List( - -, -, - { - *, - PX_PLMN_IDENTITY, - * - } - ), - -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message) == false) { - setverdict(fail); - return; - } + // /** + // * @desc Function to await NAS NGSetupResponse message + // */ + // function f_await_registration_accept() runs on NGNASComponent { + // // Await request for REGISTRATION_ACCEPT + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_DownlinkNASTransport( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID, + // ? // AuthorizationRequest + // ))); + // f_NASPDU_Get(vc_recvNGAP_PDU); + // var NG_NAS_DL_Message_Type v_message; + // if (f_Check_5GAKA_NAS_DL_Message( + // vc_recvNAS_PDU, + // mw_NG_REGISTRATION_ACCEPT( + // -, + // ?, + // mw_PLMN_List( + // -, -, + // { + // *, + // PX_PLMN_IDENTITY, + // * + // } + // ), + // -,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + // ? + // ), + // vc_ng_nas_security_params_type, + // vc_previous_nas_count_dl, + // v_message) == false) { + // setverdict(fail); + // return; + // } - setverdict(pass); - } + // setverdict(pass); + // } - /** - * @desc Function to await NAS AuthenticationRequest message and send AuthenticationResponse message with security computation for future encryption - */ - function f_await_NasAuthenticationRequest_send_NasAuthenticationResponse() runs on NGNASComponent { - // Await request for authentication - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - ?,//PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // AuthenticationRequest - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_AUTHENTICATION_REQUEST( - ?,//'100'B, - -, - mw_GMM_AuthRAND, - mw_GSM_AUTN - ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message - ) == false) { - setverdict(fail); - return; - } - setverdict(pass); + // /** + // * @desc Function to await NAS AuthenticationRequest message and send AuthenticationResponse message with security computation for future encryption + // */ + // function f_await_NasAuthenticationRequest_send_NasAuthenticationResponse() runs on NGNASComponent { + // // Await request for authentication + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_DownlinkNASTransport( + // ?,//PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID, + // ? // AuthenticationRequest + // ))); + // f_NASPDU_Get(vc_recvNGAP_PDU); + // var NG_NAS_DL_Message_Type v_message; + // if (f_Check_5GAKA_NAS_DL_Message( + // vc_recvNAS_PDU, + // mw_NG_AUTHENTICATION_REQUEST( + // ?,//'100'B, + // -, + // mw_GMM_AuthRAND, + // mw_GSM_AUTN + // ), + // vc_ng_nas_security_params_type, + // vc_previous_nas_count_dl, + // v_message + // ) == false) { + // setverdict(fail); + // return; + // } + // setverdict(pass); - // Extract ID-RAN-UE-NGAP-ID - vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; - log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // // Extract ID-RAN-UE-NGAP-ID + // vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + // log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); - // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { - setverdict(fail); - return; - } - setverdict(pass); + // // Compute RES/XRES + // if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + // setverdict(fail); + // return; + // } + // setverdict(pass); - // Send response - vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( - { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } - ); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } + // // Send response + // vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( + // { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + // ); + // vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UplinkNASTransport( + // vc_AMF_UE_ID, + // PX_RAN_UE_NGAP_ID, + // vc_sendNAS_PDU, + // m_uPTransportLayerInformation_userLocationInformationNR( + // m_userLocationInformationNR( + // m_nR_CGI, + // m_tAI + // ))))); + // } function f_send_NasAuthenticationFailure( in NAS_CauseValue_Type p_nas_cause_value := tsc_Cause_MAC_Failure @@ -200,11 +200,11 @@ module Lib_NG_NAS_Functions { ))))); } - /******************************************************************************** - * - * FIXME Use or enhance check functions from 3GPP library such as NG_NASTemplateFunctions.f_Check_NG_SecurityModeCompleteMsg - * - ********************************************************************************/ + // /******************************************************************************** + // * + // * FIXME Use or enhance check functions from 3GPP library such as NG_NASTemplateFunctions.f_Check_NG_SecurityModeCompleteMsg + // * + // ********************************************************************************/ function f_await_NasSecurityModeCommand() runs on NGNASComponent { // Await SecurityModeCommand @@ -227,6 +227,8 @@ module Lib_NG_NAS_Functions { setverdict(fail); return; } + + setverdict(pass); // Extract security parameters if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { setverdict(fail); @@ -234,69 +236,69 @@ module Lib_NG_NAS_Functions { } vc_previous_nas_count_ul := f_NasCountInit(); vc_previous_nas_count_dl := f_NasCountInit(); - - setverdict(pass); } - function f_await_NasSecurityModeCommand_send_NasSecurityModeComplete() runs on NGNASComponent { - // Await SecurityModeCommand - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // Security mode command - ))); - f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_SECURITY_MODE_COMMAND, - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message - ) == false) { - setverdict(fail); - return; - } + - setverdict(pass); - // Extract security parameters - if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { - setverdict(fail); - return; - } - vc_previous_nas_count_ul := f_NasCountInit(); - vc_previous_nas_count_dl := f_NasCountInit(); + // function f_await_NasSecurityModeCommand_send_NasSecurityModeComplete() runs on NGNASComponent { + // // Await SecurityModeCommand + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_DownlinkNASTransport( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID, + // ? // Security mode command + // ))); + // f_NASPDU_Get(vc_recvNGAP_PDU); + // var NG_NAS_DL_Message_Type v_message; + // if (f_Check_5GAKA_NAS_DL_Message( + // vc_recvNAS_PDU, + // mw_NG_SECURITY_MODE_COMMAND, + // vc_ng_nas_security_params_type, + // vc_previous_nas_count_dl, + // v_message + // ) == false) { + // setverdict(fail); + // return; + // } - // Send SecurityModeComplete - vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - ); - var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type - vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( - tsc_EPD_GMM, - tsc_SpareHalfOctet, - tsc_SHT_IntegrityProtected_Ciphered, - '00000000'O, // FIXME How to calculate MessageAuthenticationCode? - '00'O, - os // Cyphered NAS message - ) - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } + // setverdict(pass); + // // Extract security parameters + // if (f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type) == false) { + // setverdict(fail); + // return; + // } + // vc_previous_nas_count_ul := f_NasCountInit(); + // vc_previous_nas_count_dl := f_NasCountInit(); + + // // Send SecurityModeComplete + // vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + // m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + // { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + // m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + // ); + // var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type + // vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + // tsc_EPD_GMM, + // tsc_SpareHalfOctet, + // tsc_SHT_IntegrityProtected_Ciphered, + // '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + // '00'O, + // os // Cyphered NAS message + // ) + // vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UplinkNASTransport( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID, + // vc_sendNAS_PDU, + // m_uPTransportLayerInformation_userLocationInformationNR( + // m_userLocationInformationNR( + // m_nR_CGI, + // m_tAI + // ))))); + // } function f_send_NGUERadioCApabilityInfoIndication() runs on NGNASComponent { f_send_NGAP_PDU( diff --git a/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch b/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch index 55f334a..e00c2c7 100644 --- a/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch +++ b/ttcn/patch_abstract_socket/Abstract_Socket.cc.patch @@ -1,7 +1,7 @@ -diff --git a/src/Abstract_Socket.cc b/src/Abstract_Socket.cc -index 8b7b753..5e4addf 100644 ---- a/src/Abstract_Socket.cc -+++ b/src/Abstract_Socket.cc +diff --git a/home/yann/tmp/titan.TestPorts.Common_Components.Abstract_Socket/src/Abstract_Socket.cc b/./Abstract_Socket.cc +index 8b7b753..af41462 100644 +--- a/home/yann/tmp/titan.TestPorts.Common_Components.Abstract_Socket/src/Abstract_Socket.cc ++++ b/./Abstract_Socket.cc @@ -40,6 +40,7 @@ # include #endif @@ -45,7 +45,34 @@ index 8b7b753..5e4addf 100644 error = getaddrinfo(localHostname, localServicename, &hints, &aip); if (error != 0) { -@@ -1143,6 +1151,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch +@@ -818,6 +826,26 @@ int Abstract_Socket::open_listen_port(const char* localHostname, const char* loc + else log_error("Setsockopt failed"); + } + ++ if (ip_proto==IPPROTO_SCTP){ ++ // Subscribe to SCTP events ++ sctp_event_subscribe events{}; ++ memset(&events, 0, sizeof(events)); ++ events.sctp_data_io_event = 1; ++ //events.sctp_association_event = 1; ++ //events.sctp_shutdown_event = 1; ++ if (setsockopt(listen_fd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events))==-1){ ++ log_error("Setsockopt SCTP event failed"); ++ } ++ ++ linger l; ++ memset(&l, 0, sizeof(l)); ++ l.l_onoff=1; /* option on/off */ ++ l.l_linger=0; ++ if (setsockopt(listen_fd, SOL_SOCKET, SO_LINGER, (void *)&l, sizeof (l)) == -1){ ++ log_error("Setsockopt SCTP socket linger failed"); ++ } ++ } ++ + if(!nagling) { + int on = 1; + setsockopt(listen_fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); +@@ -1143,6 +1171,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch } hints.ai_socktype = SOCK_STREAM; hints.ai_family = ai_family; @@ -53,7 +80,7 @@ index 8b7b753..5e4addf 100644 error = getaddrinfo(remoteHostname, remoteServicename, &hints, &res); if (error != 0) { -@@ -1191,9 +1200,11 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch +@@ -1191,12 +1220,13 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch } } @@ -65,9 +92,13 @@ index 8b7b753..5e4addf 100644 + ((aip->ai_protocol==IPPROTO_TCP)?"IPPROTO_TCP": + ((aip->ai_protocol==IPPROTO_SCTP)?"IPPROTO_SCTP":"unknown")) ); - - -@@ -1225,6 +1236,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch +- +- ++ + if(!nagling) { + int on = 1; + setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, (const char*)&on, sizeof(on)); +@@ -1225,6 +1255,7 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch hints.ai_flags = AI_PASSIVE; hints.ai_socktype = SOCK_STREAM; hints.ai_family = ai_family;//aip->ai_family; // NOTE: On solaris 10 if is set to aip->ai_family, getaddrinfo will crash for IPv4-mapped addresses! @@ -75,7 +106,7 @@ index 8b7b753..5e4addf 100644 error = getaddrinfo(localHostname, localServicename, &hints, &localAddrinfo); if (error != 0) { -@@ -1390,10 +1402,13 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch +@@ -1390,10 +1421,35 @@ int Abstract_Socket::open_client_connection(const char* remoteHostname, const ch } log_debug( @@ -88,10 +119,32 @@ index 8b7b753..5e4addf 100644 + ((aip->ai_protocol==IPPROTO_TCP)?"IPPROTO_TCP": + ((aip->ai_protocol==IPPROTO_SCTP)?"IPPROTO_SCTP":"unknown")) + ); ++ ++ if(ip_proto==IPPROTO_SCTP){ ++ //if (aip->ai_protocol==IPPROTO_SCTP){ ++ log_debug("Setting events,linger for SCTP socket!"); ++ // Subscribe to SCTP events ++ sctp_event_subscribe events{}; ++ memset(&events, 0, sizeof(events)); ++ events.sctp_data_io_event = 1; ++ //events.sctp_association_event = 1; ++ //events.sctp_shutdown_event = 1; ++ if (setsockopt(socket_fd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events))==-1){ ++ log_error("Setsockopt SCTP event failed"); ++ } ++ ++ linger l; ++ memset(&l, 0, sizeof(l)); ++ l.l_onoff=1; /* option on/off */ ++ l.l_linger=0; ++ if (setsockopt(socket_fd, SOL_SOCKET, SO_LINGER, (void *)&l, sizeof (l)) == -1){ ++ log_error("Setsockopt SCTP socket linger failed"); ++ } ++ }//else{log_debug("not ipproto sctp!");} break; } if (aip==NULL) { -@@ -1774,18 +1789,19 @@ const char* Abstract_Socket::remote_address_name() { return "destIPAddr +@@ -1774,18 +1830,19 @@ const char* Abstract_Socket::remote_address_name() { return "destIPAddr const char* Abstract_Socket::local_address_name() { return "serverIPAddr";} const char* Abstract_Socket::remote_port_name() { return "destPort";} const char* Abstract_Socket::ai_family_name() { return "ai_family";} -- GitLab From d68aed56a0723942ced1ee02d6eff1dca185bf0d Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 9 Feb 2026 15:23:18 +0100 Subject: [PATCH 041/151] Validate Integrety protection against Open5GS --- ccsrc/EncDec/NG_NAS_EncDec.cc | 5 - etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 4 +- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 17 +- etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 3 +- install.sh | 4 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 4 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 8 +- .../NG_NAS/NG_NAS_EncdecDeclarations.ttcn | 10 +- ttcn/Lib3GPP/NG_NAS/NG_NAS_Templates.ttcn | 85 +++++ ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 2 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 341 +++++++++++++----- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 8 +- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 10 +- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 37 +- ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations | 50 --- .../lib_system/Lib_NG_NAS_Functions.ttcn | 19 +- ttcn/Lib_NG_NAS/module.mk | 12 +- 17 files changed, 430 insertions(+), 189 deletions(-) delete mode 100644 ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations diff --git a/ccsrc/EncDec/NG_NAS_EncDec.cc b/ccsrc/EncDec/NG_NAS_EncDec.cc index af95a84..bb4e344 100644 --- a/ccsrc/EncDec/NG_NAS_EncDec.cc +++ b/ccsrc/EncDec/NG_NAS_EncDec.cc @@ -22,8 +22,6 @@ namespace NG__NAS__EncdecDeclarations { * @return encoded value ****************************************************/ - BITSTRING fx__enc__NG__NAS__UL__Message__Type(const NG__NAS__MsgContainers::NG__NAS__UL__Message__Type &p){return int2bit(0,0);} - BITSTRING fx__enc__NG__NAS__DL__Message__Type(const NG__NAS__MsgContainers::NG__NAS__DL__Message__Type &p){return int2bit(0,0);} BITSTRING fx__enc__IntraN1TransparentContainer(const NG__NAS__TypeDefs::IntraN1TransparentContainer &p){return int2bit(0,0);} BITSTRING fx__enc__CIoTSmallDataContainer(const NG__NAS__TypeDefs::CIoTSmallDataContainer &p){return int2bit(0,0);} BITSTRING fx__enc__EAP__Message__Type(const EAP__TypeDefs::EAP__Message__Type &p){return int2bit(0,0);} @@ -33,13 +31,10 @@ namespace NG__NAS__EncdecDeclarations { * @param value to encode * @return encoded value ****************************************************/ - INTEGER fx__dec__NG__NAS__UL__Message__Type(BITSTRING &b, NG__NAS__MsgContainers::NG__NAS__UL__Message__Type &p) {return -1;} - INTEGER fx__dec__NG__NAS__DL__Message__Type(BITSTRING &b, NG__NAS__MsgContainers::NG__NAS__DL__Message__Type &p) {return -1;} INTEGER fx__dec__IntraN1TransparentContainer(BITSTRING &b, NG__NAS__TypeDefs::IntraN1TransparentContainer &p) {return -1;} INTEGER fx__dec__CIoTSmallDataContainer(BITSTRING &b, NG__NAS__TypeDefs::CIoTSmallDataContainer &p) {return -1;} INTEGER fx__dec__EAP__Message__Type(BITSTRING &b, EAP__TypeDefs::EAP__Message__Type &p) {return -1;} - } // namespace NG__NAS__EncdecDeclarations diff --git a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ index a7894f7..b71cf03 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ @@ -23,8 +23,10 @@ LibNGAP_Pixits.PX_SST := '01'O LibNGAP_Pixits.PX_SD := '000009'O Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false -Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '0001'B # SUCI format Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_SUCI_DIGITS := '0000000010'O; + # OP Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O # OPc diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index c770531..e03ebdf 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -4,12 +4,12 @@ NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false -LibNGAP_Pics.PICS_OFFLINE_MODE := true +LibNGAP_Pics.PICS_OFFLINE_MODE := false # 5GRegAuthSec_deReg.pcap LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 2 LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B @@ -22,8 +22,10 @@ LibNGAP_Pixits.PX_SD := '000009'O LibNGAP_Pixits.PX_PAGING_DRX := v128 Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false -Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format +Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_MSIN := '0000000010'O; # OP Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O @@ -33,10 +35,11 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B # https://www.binaryhexconverter.com/hex-to-binary-converter -Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_PLMN := '99f907'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B -Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 +Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 +Parameters.px_IMEISV_Def := '4573806121856151f1'H NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] @@ -57,10 +60,10 @@ LogEventTypes:= Yes # In this section you can specify parameters that are passed to Test Ports. # Open5GS AMF IP and port as listener -#system.NGAP_AMF.params := "NGAP/SCTP(server_mode=1,local_port=38412,debug=1)" +system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Open5GS pcap files -system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" [DEFINE] # In this section you can create macro definitions, diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ index ffad9bd..e0d91b9 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -22,8 +22,9 @@ LibNGAP_Pixits.PX_SD := '000009'O LibNGAP_Pixits.PX_PAGING_DRX := v128 Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false -Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '0001'B # SUCI format Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_SUCI_DIGITS := '0000000010'O; # OP Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O diff --git a/install.sh b/install.sh index e05d3d5..69ff5ae 100755 --- a/install.sh +++ b/install.sh @@ -22,11 +22,13 @@ fi cd $BASE_PATH ln -f ./ttcn/patch_lib_common_titan/module.mk ./ttcn/LibCommon/ -# TODO Add other patch +cd $BASE_PATH cd ./ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src git apply ../../../../patch_abstract_socket/Abstract_Socket.hh.patch git apply ../../../../patch_abstract_socket/Abstract_Socket.cc.patch cd $BASE_PATH +# TODO Add other patch + exit 0 diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 932ba1c..fd646dc 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4403,8 +4403,8 @@ module NGAP_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + vc_AMF_UE_ID, + vc_RAN_UE_ID, mw_gUAMI ( PX_PLMN_IDENTITY, diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 714e82b..0930e36 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -1256,7 +1256,7 @@ module NG_NAS_TCFunctions { {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, '111'B,//in template (value) NAS_KsiValue p_KeySetId, '0'B,//in template (value) B1_Type p_Tsc, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, // 24.501 cl. 9.11.3.4 + m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, // 24.501 cl. 9.11.3.4 -,/* in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit,*/ -,/*in template (omit) NG_GMM_Cap p_GMM_Cap := omit,*/ @@ -1430,7 +1430,7 @@ module NG_NAS_TCFunctions { {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, '111'B,//in template (value) NAS_KsiValue p_KeySetId, '0'B,//in template (value) B1_Type p_Tsc, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, + m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, omit, // in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit, omit, // in template (omit) NG_GMM_Cap p_GMM_Cap := omit, @@ -1556,7 +1556,7 @@ module NG_NAS_TCFunctions { '01'B//B2_Type p_Access := '01'B),//in template (value) DeregisterType p_DeregisterType, ), cs_NAS_KeySetIdentifier_lv('111'B,'1'B),//in template (value) NAS_KeySetIdentifier p_KSI, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, + m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, ); f_send_NGAP_PDU( m_ngap_initMsg( @@ -1623,7 +1623,7 @@ module NG_NAS_TCFunctions { '01'B//B2_Type p_Access := '01'B),//in template (value) DeregisterType p_DeregisterType, ), cs_NAS_KeySetIdentifier_lv('111'B,'1'B),//in template (value) NAS_KeySetIdentifier p_KSI, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, + m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, ); f_send_NGAP_PDU( m_ngap_initMsg( diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_EncdecDeclarations.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_EncdecDeclarations.ttcn index d8d7202..8f98535 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_EncdecDeclarations.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_EncdecDeclarations.ttcn @@ -4,19 +4,19 @@ module NG_NAS_EncdecDeclarations { import from NG_NAS_TypeDefs all; import from EAP_TypeDefs all; - external function fx_enc_NG_NAS_UL_Message_Type (NG_NAS_UL_Message_Type p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} + with {extension "prototype(convert) encode(RAW)"} external function fx_dec_NG_NAS_UL_Message_Type (inout bitstring pdu, out NG_NAS_UL_Message_Type p) return integer - //with {extension "prototype(sliding) decode(NAS Types)"} + with {extension "prototype(sliding) decode(RAW)"} external function fx_enc_NG_NAS_DL_Message_Type (NG_NAS_DL_Message_Type p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} + with {extension "prototype(convert) encode(RAW)"} external function fx_dec_NG_NAS_DL_Message_Type (inout bitstring pdu, out NG_NAS_DL_Message_Type p) return integer - //with {extension "prototype(sliding) decode(NAS Types)"} + with {extension "prototype(sliding) decode(RAW)"} + //external function fx_dec_NG_NAS_DL_Message_Type (in octetstring pdu) return NG_NAS_DL_Message_Type //with {extension "prototype(convert)" // extension "decode(RAW)" diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_Templates.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_Templates.ttcn index b699581..0ac60d9 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_Templates.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_Templates.ttcn @@ -2150,6 +2150,81 @@ module NG_NAS_Templates { causeValue := p_Cause }; + template (omit) NG_GMM_Cap m_ng_gmm_cap( + in template (omit) IEI8_Type p_iei:= '10'O, + in B1_Type p_sgc := '0'B, + in B1_Type p_ngIPHC_CP_CIoT := '0'B, + in B1_Type p_n3Data := '0'B, + in B1_Type p_ng_CP_CIoT := '0'B, + in B1_Type p_restrictEC := '0'B, + in B1_Type p_lpp := '0'B, + in B1_Type p_hoAttach := '0'B, + in B1_Type p_s1Cap := '0'B + ) := { + iei := p_iei, + iel := '01'O, + sgc := p_sgc, + ngIPHC_CP_CIoT := p_ngIPHC_CP_CIoT, + n3Data := p_n3Data, + ng_CP_CIoT := p_ng_CP_CIoT, + restrictEC := p_restrictEC, + lpp := p_lpp, + hoAttach := p_hoAttach, + s1Cap := p_s1Cap, + racs := omit, + nssaa := omit, + ngLCS := omit, + v2xNPC5 := omit, + v2xEPC5 := omit, + v2x := omit, + ng_UP_CIoT := omit, + ngSRVCC := omit, + ngProSeL2relay := omit, + ngProSe_dc := omit, + ngProSe_dd := omit, + erNSSAI := omit, + ngEHC_CP_CIoT := omit, + multipleUP := omit, + wusa := omit, + cag := omit, + pr := omit, + rpr := omit, + piv := omit, + ncr := omit, + nrPSSI := omit, + ngProSeL3rmt := omit, + ngProSeL2rmt := omit, + ngProSeL3relay := omit, + mpsiu := omit, + uas := omit, + nsag := omit, + exCAG := omit, + ssnpnsi := omit, + eventNotification := omit, + mint := omit, + nssrg := omit, + spareBits := omit, + rcman := omit, + rcmap := omit, + spare := omit + }; + + template (omit) NG_UpdateType m_ng_update_type( + in template (omit) IEI8_Type p_iei := '53'O, + in template (value) B2_Type p_eps_PNB_CIoT := '00'B, + in template (value) B2_Type p_ng_PNB_CIoT := '00'B, + in template (value) B1_Type p_ngRAN_RCU := '0'B, + in template (value) B1_Type p_smsRequested := '0'B + ) := { + iei := p_iei, + iel := '01'O, + spare := '00'B, + eps_PNB_CIoT := p_eps_PNB_CIoT, + ng_PNB_CIoT := p_ng_PNB_CIoT, + ngRAN_RCU := p_ngRAN_RCU, + smsRequested := p_smsRequested + }; + template (value) ABBA cs_ABBA(octetstring p_ABBA, template (omit) IEI8_Type p_IEI := '38'O, Type4Length_Type p_Length := '02'O) := @@ -2168,6 +2243,16 @@ module NG_NAS_Templates { causeValue := p_Cause }; + template (omit) UE_UsageSetting m_ue_usagesetting( + in template (omit) IEI8_Type p_iei := '18'O, + in template (value) B1_Type p_ue_usage_setting := '0'B // Voice usage setting is not supported in NR5GC, so default to '0'B (not allowed) + ) := { + iei := p_iei, + iel := '01'O, + spare := '0000000'B, + ueUsageSetting := p_ue_usage_setting + }; + template (present) PDU_SessionStatus cr_PDU_SessionStatusAny (IEI8_Type p_IEI := '50'O) := { /* 24.501 cl. 9.11.3.44 */ /* @status APPROVED (NR5GC_IRAT) */ diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index cecb706..4695251 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -69,7 +69,7 @@ module LibNGAP_Pixits { * @desc This IE carries an identifier assigned by the RAN to the UE for the purposes of NGAP signaling * @see ETSI TS 138 413 V16.12.0 (2023-05) */ - modulepar RAN_UE_NGAP_ID PX_RAN_UE_NGAP_ID := 1; + modulepar RAN_UE_NGAP_ID PX_RAN_UE_NGAP_ID := 2; /** * @desc The identifier for the PDU session diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 5401af8..43334cd 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -6,10 +6,13 @@ module LibNGAP_Functions { import from NAS_CommonTypeDefs all; import from NAS_CommonTemplates all; import from NAS_AuthenticationCommon all; + import from NAS_AuxiliaryDefsAndFunctions all; import from NG_NAS_Common all; import from NG_NAS_MsgContainers all; import from NG_NAS_Templates all; import from NG_NAS_SecurityFunctions all; + import from NG_NAS_TypeDefs all; + import from NG_SecurityDefinitionsAndExternalFunctions all; // Lib_NGAP import from NGAP_IEs language "ASN.1:2002" all; @@ -97,7 +100,7 @@ module LibNGAP_Functions { m_sliceSupportItem( m_s_NSSAI( PX_SST, - PX_SD,// in template (omit) SD p_sD := omit, + -, //PX_SD,// in template (omit) SD p_sD := omit, -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit ), -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit @@ -190,17 +193,27 @@ module LibNGAP_Functions { log(">>> f_send_registration_request"); // Send REGISTRATION_REQUEST + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + log("f_send_registration_request: v_other_digits: ", v_other_digits); + log("f_send_registration_request: m_NG_MobileIdentitySUCI: ", m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)); var NG_NAS_UL_Message_Type v_nas_message := valueof( m_NG_REGISTRATION_REQUEST( cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), tsc_NasKsi_NoKey, '0'B, // TSC, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), // 24.501 cl. 9.11.3.4 + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID), // 24.501 cl. 9.11.3.4 -, -, m_ng_ue_security_capability )); - f_send_NGAP_PDU( + log("f_send_registration_request: v_nas_message: ", v_nas_message); + log(bit2oct(encvalue(valueof(v_nas_message)))) + f_send_NGAP_PDU( m_ngap_initMsg( m_n2_initialUeMessage( -, @@ -228,8 +241,8 @@ module LibNGAP_Functions { if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { log("Received NG_REGISTRATION_REQUEST NAS message"); - // Extract ID-RAN-UE-NGAP-ID - vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.rAN_UE_NGAP_ID; log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); } else { log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); @@ -291,8 +304,8 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + ?, + vc_RAN_UE_ID, ? // AuthorizationRequest ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -312,8 +325,12 @@ module LibNGAP_Functions { setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); } log("v_message: ", v_message); + if (not(isbound(v_message))) { + setverdict(fail); + return; + } - // Extract ID-RAN-UE-NGAP-ID + // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); @@ -332,7 +349,7 @@ module LibNGAP_Functions { m_ngap_initMsg( m_n2_UplinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( @@ -353,7 +370,7 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, + ?, vc_RAN_UE_ID, ? // AuthorizationRequest ))); @@ -375,7 +392,7 @@ module LibNGAP_Functions { } log("v_dl_message: ", v_dl_message); - // Extract ID-AMF-UE-NGAP-ID + // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); @@ -455,26 +472,67 @@ module LibNGAP_Functions { } log("v_message: ", v_message); + // Setup security context based on received SECURITY_MODE_COMMAND f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type); vc_previous_nas_count_ul := f_NasCountInit(); vc_previous_nas_count_dl := f_NasCountInit(); - // Send response for SECURITY_MODE_COMPLETE - vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - ); - var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type - vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( - tsc_EPD_GMM, - tsc_SpareHalfOctet, - tsc_SHT_IntegrityProtected_Ciphered, - '00000000'O, // FIXME How to calculate MessageAuthenticationCode? - '00'O, - os // Cyphered NAS message - ); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + // Prepare response for SECURITY_MODE_COMPLETE + // 1. Registration Request message with no + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + var NG_NAS_UL_Message_Type ng_registration_Request := valueof( + m_NG_REGISTRATION_REQUEST( + cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), + tsc_NasKsi_NoKey, + '0'B, // TSC, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID), + -, + m_ng_gmm_cap, + m_ng_ue_security_capability('04'O, -, -, 'f0'O, 'f0'O), + cs_NSSAI_SST1eMBB('2f'O), + -, -, -, -, -, -, -, -, + -, //m_ue_usagesetting, + -, -, -, -, -, -, + m_ng_update_type + )); + // 2. Add security if any + // TODO + log("ng_registration_Request: ", ng_registration_Request); + var octetstring v_msg := bit2oct(encvalue(ng_registration_Request.registration_Request)); + log("bit2oct(encvalue(ng_registration_Request.registration_Request))", v_msg); + + // 3. NAS 5GS message + log("px_IMEISV_Def: ", px_IMEISV_Def); + log("f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def): ", f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def)); + var NG_NAS_UL_Message_Type ng_security_mode_complete := valueof( + m_NG_SECURITY_MODE_COMPLETE_no_NonIMEISV_PEI( + f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := '71'O, iel := int2oct(lengthof(v_msg), 2), replayedNASMsgContainerValue := v_msg } + )); + ng_security_mode_complete.security_Mode_Complete.nasMsg := { iei := '71'O, iel := int2oct(lengthof(v_msg), 2), replayedNASMsgContainerValue := v_msg }; + log("ng_security_mode_complete: ", ng_security_mode_complete); + + // 4. Add security if any + v_msg := bit2oct(encvalue(ng_security_mode_complete.security_Mode_Complete)); + log("bit2oct(encvalue(ng_security_mode_complete.security_Mode_Complete))", v_msg); + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext, + v_msg, + tsc_DirectionUL, + PX_BEARER_ID, + vc_previous_nas_count_ul, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_ul: ", vc_previous_nas_count_ul); + vt_NgNasUl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( @@ -531,7 +589,7 @@ module LibNGAP_Functions { if (f_Check_5GAKA_NAS_UL_Message( vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMPLETE_no_nonIMEISV_PEI( - -, //mw_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + -, //mw_NG_MobileIdentitySUCI(PX_TYPE_OF_ID, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - //{ iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, ), vc_ng_nas_security_params_type, @@ -777,39 +835,39 @@ module LibNGAP_Functions { log(">>> f_send_session_establishment_request"); // Send PDUSessionEstablishmentRequest - vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - ); - var octetstring os := bit2oct( - encvalue( - valueof( - m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( - cs_NG_PDU_SessionId, - tsc_PTI_1 - )))); - vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( - tsc_EPD_GMM, - tsc_SpareHalfOctet, - tsc_SHT_IntegrityProtected_Ciphered, - '00000000'O, // FIXME How to calculate MessageAuthenticationCode? - '00'O, - os // Cyphered NAS message - ); - - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); + // vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + // { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + // ); + // var octetstring os := bit2oct( + // encvalue( + // valueof( + // m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( + // cs_NG_PDU_SessionId, + // tsc_PTI_1 + // )))); + // vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + // tsc_EPD_GMM, + // tsc_SpareHalfOctet, + // tsc_SHT_IntegrityProtected_Ciphered, + // '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + // '00'O, + // os // Cyphered NAS message + // ); + + // vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UplinkNASTransport( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // vc_sendNAS_PDU, + // m_uPTransportLayerInformation_userLocationInformationNR( + // m_userLocationInformationNR( + // m_nR_CGI, + // m_tAI + // ))))); } function f_await_session_establishment_request() runs on NGNASComponent { @@ -837,40 +895,40 @@ module LibNGAP_Functions { log(">>> f_send_session_establishment_accept"); // Send PDUSessionEstablishmentRequest - vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - ); - var octetstring os := ''O; // TODO - // var octetstring os := bit2oct( - // encvalue( - // valueof( - // m_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT( - // cs_NG_PDU_SessionId, - // tsc_PTI_1 - // )))); - vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( - tsc_EPD_GMM, - tsc_SpareHalfOctet, - tsc_SHT_IntegrityProtected_Ciphered, - '00000000'O, // FIXME How to calculate MessageAuthenticationCode? - '00'O, - os // Cyphered NAS message - ); - - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); + // vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( + // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + // { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + // ); + // var octetstring os := ''O; // TODO + // // var octetstring os := bit2oct( + // // encvalue( + // // valueof( + // // m_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT( + // // cs_NG_PDU_SessionId, + // // tsc_PTI_1 + // // )))); + // vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( + // tsc_EPD_GMM, + // tsc_SpareHalfOctet, + // tsc_SHT_IntegrityProtected_Ciphered, + // '00000000'O, // FIXME How to calculate MessageAuthenticationCode? + // '00'O, + // os // Cyphered NAS message + // ); + + // vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UplinkNASTransport( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID, + // vc_sendNAS_PDU, + // m_uPTransportLayerInformation_userLocationInformationNR( + // m_userLocationInformationNR( + // m_nR_CGI, + // m_tAI + // ))))); } @@ -1189,4 +1247,97 @@ module LibNGAP_Functions { } // End of function f_NASPDU_Get + function f_NG_Imeisv2MobileIdentity_v( + in hexstring p_IMEISV + ) return NG_MobileIdentity { + var integer v_ImeiLength := lengthof(p_IMEISV); + var integer v_Odd := (v_ImeiLength rem 2); + var octetstring v_Other := f_ImsiImei2Octetstring (p_IMEISV); + var B4_Type v_FirstDigit := hex2bit(p_IMEISV[0]); + var B1_Type v_OddEvenInd := int2bit(v_Odd, 1); + + return valueof({ + iei := '77'O, + iel := int2oct(1+v_ImeiLength, 2), + idDigit1 := v_FirstDigit, + oddEvenInd := v_OddEvenInd, + typeOfId := tsc_IdType_NG_IMEISV, + otherDigits := v_Other + }); + } + + // TODO To be moved in Lib_NG_NAS_Security_Functions.ttcn + // See NG_NasEmu_Common.f_EncodeAndCipher_NG_NasPdu + // This function needs to be reworked for ciphering + function f_EncodeAndCipher_NG_NasPdu_v( // TODO To be renamed + in SecurityHeaderType p_security_header_type, + in octetstring p_nAS_PDU, + in MAC_Direction_Type p_direction, + in B5_Type p_bearerId, + inout NasCount_Type p_nas_count, + inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type, + out NG_SECURITY_PROTECTED_NAS_MESSAGE p_ng_security_protected_nas_message + ) return octetstring { + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nAS_PDU: ", p_nAS_PDU); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_direction: ", p_direction); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_bearerId: ", p_bearerId); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); + + //v_EncodedNasPdu := f_NG_NasEmu_EncodePiggybacked(p_NAS_MSG_Request.Pdu); + + if (p_ng_nas_security_params_type.NAS_Integrity.Algorithm == tsc_SHT_NoSecurityProtection) { + log("f_EncodeAndCipher_NG_NasPdu_v: No security applied"); + return p_nAS_PDU; + } + + // Increment NAS count + p_nas_count := f_NasSecurity_IncrementCOUNT(p_nas_count); + + // Apply ciphering if necessary + var octetstring v_EncodedNasPdu := p_nAS_PDU; + if ( + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) + ) { + log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); + v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, + p_nas_count, + p_bearerId); + } + + // Apply integrity protection + log("f_EncodeAndCipher_NG_NasPdu_v: Apply integrity protection"); + var NAS_SequenceNumber v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(p_nas_count); + log("f_EncodeAndCipher_NG_NasPdu_v: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_EncodedNasPdu; + log("f_EncodeAndCipher_NG_NasPdu_v: v_Octet7toN: ", v_Octet7toN); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_ng_nas_security_params_type.NAS_Integrity.Algorithm, + p_ng_nas_security_params_type.NAS_Integrity.K_NAS, + p_nas_count, + p_bearerId, + p_direction); + log("f_EncodeAndCipher_NG_NasPdu_v: v_calculated_mac: ", v_calculated_mac); + p_nas_count := v_calculated_mac; + + // Security protected NAS message + var NG_NAS_DL_Message_Type v := valueof( + m_NG_SecurityProtected_NasMsg( + p_security_header_type, + v_calculated_mac, + v_SequenceNumber, + v_EncodedNasPdu + )); + p_ng_security_protected_nas_message := v.security_Protected_Nas_Message; + v_EncodedNasPdu := bit2oct(encvalue(p_ng_security_protected_nas_message)); + + log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); + log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_ng_security_protected_nas_message: ", p_ng_security_protected_nas_message); + log("<<< f_EncodeAndCipher_NG_NasPdu_v: ", v_EncodedNasPdu); + return v_EncodedNasPdu; + } + } // End of module LibNGAP_Functions diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn index 86a2187..9b70630 100755 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn @@ -16,10 +16,16 @@ module Lib_NG_NAS_Pixits { modulepar boolean PX_CHECK_SECURITY := true; - modulepar B4_Type PX_SUPI_FORMAT := '0000'B; + modulepar B4_Type PX_SUPI_FORMAT := '0000'B; + + modulepar NAS_IdType PX_TYPE_OF_ID := '001'B; modulepar octetstring PX_SUPI_DIGITS := '00f110214300014444330302'O; + modulepar octetstring PX_MSIN := '0000000010'O; + + modulepar octetstring PX_SUCI_DIGITS := '0000000010'O; + /** * @desc Operator Key (OP) */ diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 8b74a8d..609dabf 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -330,7 +330,7 @@ module Lib_NG_NAS_Security_Functions { function f_NG_NasSecurity_EstimateCOUNT(in NasCount_Type p_PrevCount, in integer p_SequenceNumber - ) return NasCount_Type { + ) return NasCount_Type { log(">>> f_NG_NasSecurity_EstimateCOUNT: p_PrevCount: ", p_PrevCount); log(">>> f_NG_NasSecurity_EstimateCOUNT: p_SequenceNumber: ", p_SequenceNumber); @@ -361,6 +361,14 @@ module Lib_NG_NAS_Security_Functions { return int2oct(oct2int(p_Count) mod 256, 1); }; + function f_NasSecurity_IncrementCOUNT( + in NasCount_Type p_Count + ) return NasCount_Type { + var integer v_CountValue := oct2int(p_Count); + v_CountValue := (v_CountValue + 1) mod (65536 * 256); // the 8 most significant bits are 0 (24.301 cl. 4.4.3.1) + return int2oct(v_CountValue, 4); + }; + /** * @see https://www.ericsson.com/en/blog/2021/9/authentication-and-key-agreements */ diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 2b5bd2c..9cc5f2d 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -767,6 +767,22 @@ module Lib_NG_NAS_Templates { } } // End of template m_NG_SECURITY_MODE_COMPLETE + template (value) NG_NAS_UL_Message_Type m_NG_SECURITY_MODE_COMPLETE_no_NonIMEISV_PEI( + in template (value) NG_MobileIdentity p_IMEISV, + in template (value) ReplayedNASMessageContainer p_NASMsg + ) := { /* 24.501 cl. 8.2.26 */ + /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ + security_Mode_Complete := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_SecurityModeComplete, /* cl. 9.7 M V 1 */ + imeisv := p_IMEISV, /* cl. 9.11.3.4 O TLV 11 IEI=2C */ + nasMsg := p_NASMsg, /* cl. 9.11.3.33 O TLV-E 3-n IEI=7D */ + nonIMEISV_PEI := omit + } + } // End of template m_NG_SECURITY_MODE_COMPLETE + template (present) NG_NAS_UL_Message_Type mw_NG_SECURITY_MODE_COMPLETE( template (present) NG_MobileIdentity p_IMEISV := ?, template (present) ReplayedNASMessageContainer p_NASMsg := ?, @@ -2169,14 +2185,15 @@ module Lib_NG_NAS_Templates { //from template (present) NG_MobileIdentity cr_NG_MobileIdentitySUCI - NG_NAS_Common template (value) NG_MobileIdentity m_NG_MobileIdentitySUCI( in template (value) B4_Type p_SUPIFormat, - in template (value) octetstring p_OtherDigits + in template (value) octetstring p_OtherDigits, + in template (value) NAS_IdType p_typeOfId := tsc_IdType_NG_SUCI ) := { /* @status APPROVED (NR5GC) */ iei := omit, iel := int2oct(1+lengthof(p_OtherDigits), 2), // @sic R5s190719 sic@ idDigit1 := p_SUPIFormat, // 4 bits oddEvenInd := '0'B, // 1 bit - typeOfId := tsc_IdType_NG_SUCI, // 3 bits + typeOfId := p_typeOfId, // 3 bits otherDigits := p_OtherDigits }; @@ -2311,4 +2328,20 @@ module Lib_NG_NAS_Templates { spare := p_spare } // End of template mw_ng_ue_security_capability + template (value) NG_NAS_DL_Message_Type m_NG_SecurityProtected_NasMsg( + in SecurityHeaderType p_SecurityHeaderType, + in MessageAuthenticationCode p_MessageAuthenticationCode, + in NAS_SequenceNumber p_NAS_SequenceNumber, + in template (value) NG_NAS_Message p_NAS_Message + ) := { /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ + security_Protected_Nas_Message := { + protocolDiscriminator := tsc_EPD_GMM, + spareHalfOctet := tsc_SpareHalfOctet, + securityHeaderType := p_SecurityHeaderType, + messageAuthenticationCode := p_MessageAuthenticationCode, + sequenceNumber := p_NAS_SequenceNumber, + plainNASMessage := p_NAS_Message + } + } // End of template m_NG_SecurityProtected_NasMsg + } // End of module Lib_NG_NAS_Templates \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations b/ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations deleted file mode 100644 index 7f65093..0000000 --- a/ttcn/Lib_NG_NAS/lib/NG_NAS_EncdecDeclarations +++ /dev/null @@ -1,50 +0,0 @@ -module NG_NAS_EncdecDeclarations { - - import from NG_NAS_MsgContainers all; - import from NG_NAS_TypeDefs all; - import from EAP_TypeDefs all; - - - external function fx_enc_NG_NAS_UL_Message_Type (NG_NAS_UL_Message_Type p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} - - external function fx_dec_NG_NAS_UL_Message_Type (inout bitstring pdu, out NG_NAS_UL_Message_Type p) return integer - //with {extension "prototype(sliding) decode(NAS Types)"} - - - external function fx_enc_NG_NAS_DL_Message_Type (NG_NAS_DL_Message_Type p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} - - external function fx_dec_NG_NAS_DL_Message_Type (inout bitstring pdu, out NG_NAS_DL_Message_Type p) return integer - //with {extension "prototype(sliding) decode(NAS Types)"} - //external function fx_dec_NG_NAS_DL_Message_Type (in octetstring pdu) return NG_NAS_DL_Message_Type - //with {extension "prototype(convert) decode(RAW)"} - - external function fx_enc_NG_SECURITY_PROTECTED_NAS_MESSAGE(NG_SECURITY_PROTECTED_NAS_MESSAGE p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} - - external function fx_dec_NG_SECURITY_PROTECTED_NAS_MESSAGE(in octetstring pdu) return NG_SECURITY_PROTECTED_NAS_MESSAGE - //with {extension "prototype(sliding) decode(NAS Types)"} - - external function fx_enc_IntraN1TransparentContainer (IntraN1TransparentContainer p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} - - external function fx_dec_IntraN1TransparentContainer (inout bitstring pdu, out IntraN1TransparentContainer p) return integer - //with {extension "prototype(sliding) decode(NAS Types)"} - - - external function fx_enc_CIoTSmallDataContainer (CIoTSmallDataContainer p) return bitstring - //with {extension "prototype(convert) encode(NAS Types)"} - - external function fx_dec_CIoTSmallDataContainer (inout bitstring pdu, out CIoTSmallDataContainer p) return integer - //with {extension "prototype(sliding) decode(NAS Types)"} - - - - external function fx_enc_EAP_Message_Type (EAP_Message_Type p) return bitstring - with {extension "prototype(convert) encode(EAP Types)"} - - external function fx_dec_EAP_Message_Type (inout bitstring pdu, out EAP_Message_Type p) return integer - with {extension "prototype(sliding) decode(EAP Types)"} - -} // End of module module NG_NAS_EncdecDeclarations diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index e8b321b..3134f3b 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -8,6 +8,7 @@ module Lib_NG_NAS_Functions { // NG_NAS import from NG_NAS_TypeDefs all; + import from NG_NAS_Templates all; // Lib3GPP import from CommonDefs all; @@ -34,11 +35,17 @@ module Lib_NG_NAS_Functions { * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg */ function f_send_NasRegistrationRequest() runs on NGNASComponent { + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( - {'0'B,'001'B}, - '111'B, - '0'B, - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS), + cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), + tsc_NasKsi_NoKey, + '0'B, // TSC + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID), -, -, m_ng_ue_security_capability ); @@ -273,9 +280,9 @@ module Lib_NG_NAS_Functions { // // Send SecurityModeComplete // vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - // m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, // { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - // m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI + // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI // ); // var octetstring os := ''O; // FIXME f_EncodeAndCipher_NG_NasPdu(vt_NgNasUl_Msg, ); How to calculate NG_NAS_MSG_Request_Type // vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( diff --git a/ttcn/Lib_NG_NAS/module.mk b/ttcn/Lib_NG_NAS/module.mk index 8cd3d19..944cfaf 100644 --- a/ttcn/Lib_NG_NAS/module.mk +++ b/ttcn/Lib_NG_NAS/module.mk @@ -1,11 +1,9 @@ -sources := \ - lib/Lib_NG_NAS_Templates.ttcn \ - lib/Lib_NG_NAS_Pixits.ttcn \ +sources := \ + lib/Lib_NG_NAS_Templates.ttcn \ + lib/Lib_NG_NAS_Pixits.ttcn \ lib/Lib_NG_NAS_Security_Functions.ttcn \ - lib_system/Lib_NG_NAS_Interface.ttcn \ - lib_system/Lib_NG_NAS_Functions.ttcn \ - - #../Lib3GPP/NG_NAS_EncdecDeclarations.ttcn + lib_system/Lib_NG_NAS_Interface.ttcn \ + lib_system/Lib_NG_NAS_Functions.ttcn \ #modules := \ # ../Lib3GPP -- GitLab From d936eab82157ab0fe29cb842403eee55357b00b4 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 10 Feb 2026 09:39:54 +0100 Subject: [PATCH 042/151] Finalyse TC_NGAP_AMF_CMP_01 against Open5GS --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 22 +++ ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 24 ++- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 141 ++++++++++++++++-- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 61 ++++++++ 5 files changed, 236 insertions(+), 14 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index e03ebdf..e517424 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -12,7 +12,7 @@ LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 2 LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B -LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B LibNGAP_Pixits.PX_AMF_POINTER := '000000'B LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 9328005..76b907a 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -299,6 +299,28 @@ module NGAP_Steps { } } + /** + * @desc + */ + function f_NGAP_amf_UE_PDU_InitialContextSetupFailure() runs on aMFNGAPComponent { + if (PICS_OFFLINE_MODE) { + f_await_initial_context_setup_failure(); + } else { + f_send_initial_context_setup_failure(); + } + } // End of function f_NGAP_amf_UE_PDU_InitialContextSetupFailure + + /** + * @desc + */ + function f_NGAP_amf_UE_ContextRealease() runs on aMFNGAPComponent { + if (PICS_OFFLINE_MODE) { + f_await_ue_context_release_command_await_ue_context_release_complete(); + } else { + f_await_ue_context_release_command_send_ue_context_release_complete(); + } + } // End of function f_await_ue_context_release_command_send_ue_context_release_complete + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index fd646dc..229c9e9 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -16,15 +16,22 @@ module NGAP_TCFunctions { import from LibCommon_VerdictControl all; import from LibCommon_Time all; + // NG_NAS + import from NG_NAS_MsgContainers all; + // LibNGAP import from NGAP_IEs language "ASN.1:2002" all; import from NGAP_Constants language "ASN.1:2002" all; - import from LibNGAP_Pixits all; import from LibNGAP_Templates all; + import from LibNGAP_Functions all; import from LibNGAP_Interface all; import from LibNGAP_Steps all; + // LibNG_NAS + import from Lib_NG_NAS_Templates all; + import from Lib_NG_NAS_Security_Functions all; + // AtsNGAP import from NGAP_TestSystem all; import from NGAP_Steps all; @@ -4430,12 +4437,25 @@ module NGAP_TCFunctions { ?, ? */ ))); - // TODO Check security + // Check security + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: mw_NG_REGISTRATION_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_REGISTRATION_ACCEPT ***"); + setverdict(pass); + } + log("v_message: ", v_message); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble + // Send error response to release the UE context + f_NGAP_amf_UE_PDU_InitialContextSetupFailure(); + f_NGAP_amf_UE_ContextRealease(); f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 90401ee..f4cb923 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1439,12 +1439,12 @@ module LibNGAP_Templates { id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } - }, + }/*, { id := id_MaskedIMEISV, criticality := ignore, value_ := { MaskedIMEISV := p_maskedIMEISV } - }, + }*/, { id := id_NAS_PDU, criticality := ignore, @@ -1730,6 +1730,39 @@ module LibNGAP_Templates { } } // End of template m_n2_InitialContextSetupFailure + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.3 INITIAL CONTEXT SETUP FAILURE + */ + template (value) UnsuccessfulOutcome m_n2_InitialContextSetupFailure_noPDUSessionResourceFailedToSetupListCxtFail( + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + in template (value) Cause p_cause := m_cause_radioNetwork(PX_CAUSE_INITIAL_SETUP_FAILURE) + ) := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + InitialContextSetupFailure := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + }, + { + id := id_Cause, + criticality := ignore, + value_ := { Cause := p_cause } + } + } + } + } + } // End of template m_n2_InitialContextSetupFailure_noPDUSessionResourceFailedToSetupListCxtFail + } // End of group Send group Receive { @@ -1773,6 +1806,39 @@ module LibNGAP_Templates { } } // End of template mw_n2_PDUInitialContextSetupFailure + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.3 INITIAL CONTEXT SETUP FAILURE + */ + template (present) UnsuccessfulOutcome mw_n2_InitialContextSetupFailure_noPDUSessionResourceFailedToSetupListCxtFail( + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) Cause p_cause := ? + ) := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + InitialContextSetupFailure := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + }, + { + id := id_Cause, + criticality := ignore, + value_ := { Cause := p_cause } + } + } + } + } + } // End of template mw_n2_PDUInitialContextSetupFailure_noPDUSessionResourceFailedToSetupListCxtFail + } // End of group Receive } // End of group INITIAL_CONTEXT_SETUP_FAILURE @@ -1933,7 +1999,7 @@ module LibNGAP_Templates { in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes ) := { - procedureCode := id_InitialContextSetup, + procedureCode := id_UEContextRelease, criticality := reject, value_ := { PDUSessionResourceSetupResponse := { @@ -1958,6 +2024,33 @@ module LibNGAP_Templates { } } // End of template m_n2_UEContextReleaseComplete + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.6 UE CONTEXT RELEASE COMPLETE + */ + template (value) SuccessfulOutcome m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID + ) := { + procedureCode := id_UEContextRelease, + criticality := reject, + value_ := { + PDUSessionResourceSetupResponse := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + } // End of template m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes + } // End of group Send group Receive { @@ -1995,6 +2088,33 @@ module LibNGAP_Templates { } } // End of template mw_n2_UEContextReleaseComplete + /** + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.2.6 UE CONTEXT RELEASE COMPLETE + */ + template (present) SuccessfulOutcome mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ? + ) := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + PDUSessionResourceSetupResponse := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + } // End of template mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes + } // End of group Receive } // End of group UE_CONTEXT_RELEASE_COMPLETE @@ -5234,7 +5354,7 @@ module LibNGAP_Templates { id := id_RRCEstablishmentCause, criticality := ignore, value_ := { RRCEstablishmentCause := p_rrcEstCause } - }//, + }, /*{ id := NGAP_Constants.id_FiveG_S_TMSI, criticality := NGAP_CommonDataTypes.reject, @@ -5246,14 +5366,13 @@ module LibNGAP_Templates { criticality := NGAP_CommonDataTypes.ignore, Value := "NGAP_IEs.AMFSetID", presence := NGAP_CommonDataTypes.optional_ - }, - { - id := NGAP_Constants.id_UEContextRequest, - criticality := NGAP_CommonDataTypes.ignore, - Value := "NGAP_IEs.", - presence := NGAP_CommonDataTypes.optional_ - }, + },*/ { + id := NGAP_Constants.id_UEContextRequest, + criticality := ignore, + value_ := { UEContextRequest := requested} + }//, + /*{ id := NGAP_Constants.id_AllowedNSSAI, criticality := NGAP_CommonDataTypes.reject, Value := "NGAP_IEs.AllowedNSSAI", diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 43334cd..66800c4 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1133,6 +1133,67 @@ module LibNGAP_Functions { // ))); // } + function f_await_initial_context_setup_failure() runs on NGNASComponent { + log(">>> f_send_initial_context_setup_failure"); + + // Await InitialContextSetupFailure + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + mw_n2_InitialContextSetupFailure_noPDUSessionResourceFailedToSetupListCxtFail( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + } + + function f_send_initial_context_setup_failure() runs on NGNASComponent { + log(">>> f_send_initial_context_setup_failure"); + + // Send InitialContextSetupFailure + f_send_NGAP_PDU( + m_ngap_unsuccMsg( + m_n2_InitialContextSetupFailure_noPDUSessionResourceFailedToSetupListCxtFail( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_cause_radioNetwork(unspecified) + ))); + } + + function f_await_ue_context_release_command_await_ue_context_release_complete() runs on NGNASComponent { + log(">>> f_await_ue_context_release_command_await_ue_context_release_complete"); + + // Await UEContextRealeaseCommand + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand + )); + + // Await UEContextReleaseComplete + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + vc_AMF_UE_ID, + PX_RAN_UE_NGAP_ID + ))); + } + + function f_await_ue_context_release_command_send_ue_context_release_complete() runs on NGNASComponent { + log(">>> f_await_ue_context_release_command_send_ue_context_release_complete"); + + // Await UEContextRealeaseCommand + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand + )); + + // Send UEContextReleaseComplete + f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + vc_AMF_UE_ID, + PX_RAN_UE_NGAP_ID + ))); + } + function f_send_ue_context_release_request_await_ue_context_release_response( in template (value) Cause p_Cause ) runs on NGNASComponent { -- GitLab From 4ca7fc233bc54708c0d0d87215b3d32876fbadc1 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 10 Feb 2026 15:00:38 +0100 Subject: [PATCH 043/151] Update ATS submodules --- .gitmodules | 2 ++ titan-test-system-framework | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 11 ++++++++ ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 2 ++ .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 25 ++++++++++++++++++- 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 83f3b28..a324ae6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,5 @@ [submodule "ttcn/LibCommon"] path = ttcn/LibCommon url = https://forge.etsi.org/rep/LIBS/LibCommon.git +[submodule "./titan-test-system-framework/"] + branch = dev diff --git a/titan-test-system-framework b/titan-test-system-framework index 3f542e0..e477d32 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit 3f542e05e054a605c110d0b0b62908057c7203b2 +Subproject commit e477d327f4df850e487feab5c0f68b1044db3cf1 diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 76b907a..595e0cb 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -321,6 +321,17 @@ module NGAP_Steps { } } // End of function f_await_ue_context_release_command_send_ue_context_release_complete + /** + * @desc + */ + function f_NGAP_amf_UE_ContextRealeaseComplete() runs on aMFNGAPComponent { + if (PICS_OFFLINE_MODE) { + f_await_ue_context_release_complete(); + } else { + f_send_ue_context_release_complete(); + } + } // End of function f_NGAP_amf_UE_ContextRealeaseComplete + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 229c9e9..5b8ebd3 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4505,6 +4505,8 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble + // Send UEContextComplete response to release the UE context + f_NGAP_amf_UE_ContextRealeaseComplete(); f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 66800c4..50e070c 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1194,6 +1194,30 @@ module LibNGAP_Functions { ))); } + function f_await_ue_context_release_complete() runs on NGNASComponent { + log(">>> f_await_ue_context_release_complete"); + + // Await UEContextReleaseComplete + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + vc_AMF_UE_ID, + PX_RAN_UE_NGAP_ID + ))); + } + + function f_send_ue_context_release_complete() runs on NGNASComponent { + log(">>> f_send_ue_context_release_complete"); + + // Send UEContextReleaseComplete + f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + vc_AMF_UE_ID, + PX_RAN_UE_NGAP_ID + ))); + } + function f_send_ue_context_release_request_await_ue_context_release_response( in template (value) Cause p_Cause ) runs on NGNASComponent { @@ -1216,7 +1240,6 @@ module LibNGAP_Functions { ))); } - function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGNASComponent { vc_recvNGAP_PDU := p_PDU; -- GitLab From 31c7727615a76461985dbae6d7a98363117e9cb6 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 10 Feb 2026 15:37:35 +0100 Subject: [PATCH 044/151] Use patch instead of git apply in install script --- install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/install.sh b/install.sh index 69ff5ae..81d245e 100755 --- a/install.sh +++ b/install.sh @@ -5,9 +5,6 @@ set -vx BASE_PATH=`pwd` -git checkout devel -git submodule update --init --recursive --remote - if [ ! -d ./titan-test-system-framework ] then git clone --recurse-submodules --branch devel https://labs.etsi.org/rep/cti-tools/titan-test-system-framework.git @@ -25,8 +22,8 @@ ln -f ./ttcn/patch_lib_common_titan/module.mk ./ttcn/LibCommon/ cd $BASE_PATH cd ./ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src -git apply ../../../../patch_abstract_socket/Abstract_Socket.hh.patch -git apply ../../../../patch_abstract_socket/Abstract_Socket.cc.patch +patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.hh.patch +patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.cc.patch cd $BASE_PATH # TODO Add other patch -- GitLab From 30b98b23f7527e462eaddc3ea346b98bd2ba254e Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 10 Feb 2026 15:47:39 +0100 Subject: [PATCH 045/151] Bug fixed in Ats_NG_NAS --- titan-test-system-framework | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 40 ++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/titan-test-system-framework b/titan-test-system-framework index e477d32..3f542e0 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit e477d327f4df850e487feab5c0f68b1044db3cf1 +Subproject commit 3f542e05e054a605c110d0b0b62908057c7203b2 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 0930e36..3b3fbea 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -1251,12 +1251,20 @@ module NG_NAS_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + log("f_TC_5GNAS_AMF_REG_REJ_01: v_other_digits: ", v_other_digits); + log("f_TC_5GNAS_AMF_REG_REJ_01: m_NG_MobileIdentitySUCI: ", m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)); vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, '111'B,//in template (value) NAS_KsiValue p_KeySetId, '0'B,//in template (value) B1_Type p_Tsc, - m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, // 24.501 cl. 9.11.3.4 + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID),//in template (value) NG_MobileIdentity p_MobileId, // 24.501 cl. 9.11.3.4 -,/* in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit,*/ -,/*in template (omit) NG_GMM_Cap p_GMM_Cap := omit,*/ @@ -1425,12 +1433,20 @@ module NG_NAS_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + log("f_TC_5GNAS_AMF_REG_REJ_02: v_other_digits: ", v_other_digits); + log("f_TC_5GNAS_AMF_REG_REJ_02: m_NG_MobileIdentitySUCI: ", m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)); vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, '111'B,//in template (value) NAS_KsiValue p_KeySetId, '0'B,//in template (value) B1_Type p_Tsc, - m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS),//in template (value) NG_MobileIdentity p_MobileId, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID),//in template (value) NG_MobileIdentity p_MobileId, omit, // in template (omit) NAS_KeySetIdentifier p_NonCurrentKSI := omit, omit, // in template (omit) NG_GMM_Cap p_GMM_Cap := omit, @@ -1549,6 +1565,14 @@ module NG_NAS_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + log("f_TC_5GNAS_AMF_DRG_ACC_01: v_other_digits: ", v_other_digits); + log("f_TC_5GNAS_AMF_DRG_ACC_01: m_NG_MobileIdentitySUCI: ", m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)); vt_NgNasUl_Msg := m_NG_DEREGISTRATION_REQUEST_MO( crs_DeregisterType ('0'B,//B1_Type p_SwitchOff, @@ -1556,7 +1580,7 @@ module NG_NAS_TCFunctions { '01'B//B2_Type p_Access := '01'B),//in template (value) DeregisterType p_DeregisterType, ), cs_NAS_KeySetIdentifier_lv('111'B,'1'B),//in template (value) NAS_KeySetIdentifier p_KSI, - m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)//in template (value) NG_MobileIdentity p_MobileId, ); f_send_NGAP_PDU( m_ngap_initMsg( @@ -1616,6 +1640,14 @@ module NG_NAS_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + log("f_TC_5GNAS_AMF_DRG_ACC_02: v_other_digits: ", v_other_digits); + log("f_TC_5GNAS_AMF_DRG_ACC_02: m_NG_MobileIdentitySUCI: ", m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)); vt_NgNasUl_Msg := m_NG_DEREGISTRATION_REQUEST_MO( crs_DeregisterType ('1'B,//B1_Type p_SwitchOff, @@ -1623,7 +1655,7 @@ module NG_NAS_TCFunctions { '01'B//B2_Type p_Access := '01'B),//in template (value) DeregisterType p_DeregisterType, ), cs_NAS_KeySetIdentifier_lv('111'B,'1'B),//in template (value) NAS_KeySetIdentifier p_KSI, - m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS)//in template (value) NG_MobileIdentity p_MobileId, + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)//in template (value) NG_MobileIdentity p_MobileId, ); f_send_NGAP_PDU( m_ngap_initMsg( -- GitLab From 2aca887e45209d50fec80a696cb0b9ab830122b0 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 10 Feb 2026 16:08:26 +0100 Subject: [PATCH 046/151] Remove libosip --- Makefile | 2 +- install.sh | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a41f492..e3d4a61 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ defines += LINUX libs += -lpcap -lrt -lpthread endif -libs += -lssl -lcrypto -lxml2 -ljsoncpp -L$(OSIP_LIB) -losipparser2 -lsctp +libs += -lssl -lcrypto -lxml2 -ljsoncpp -L$(OSIP_LIB) -lsctp $(eval $(call IncludeModule, $(TOPDIR)/ttcn/$(ATS))) diff --git a/install.sh b/install.sh index 81d245e..93eaca7 100755 --- a/install.sh +++ b/install.sh @@ -5,6 +5,9 @@ set -vx BASE_PATH=`pwd` +git checkout devel +git submodule update --init --recursive --remote + if [ ! -d ./titan-test-system-framework ] then git clone --recurse-submodules --branch devel https://labs.etsi.org/rep/cti-tools/titan-test-system-framework.git @@ -23,7 +26,7 @@ cd $BASE_PATH cd ./ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.hh.patch -patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.cc.patch +patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.cc.patch cd $BASE_PATH # TODO Add other patch -- GitLab From 85d00631925c7ee6639804437055ded71df07971 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 10 Feb 2026 16:17:21 +0100 Subject: [PATCH 047/151] Bug fixed in install.sh --- install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/install.sh b/install.sh index 93eaca7..09e128d 100755 --- a/install.sh +++ b/install.sh @@ -5,9 +5,6 @@ set -vx BASE_PATH=`pwd` -git checkout devel -git submodule update --init --recursive --remote - if [ ! -d ./titan-test-system-framework ] then git clone --recurse-submodules --branch devel https://labs.etsi.org/rep/cti-tools/titan-test-system-framework.git @@ -25,8 +22,8 @@ ln -f ./ttcn/patch_lib_common_titan/module.mk ./ttcn/LibCommon/ cd $BASE_PATH cd ./ttcn/modules/titan.TestPorts.Common_Components.Abstract_Socket/module/src -patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.hh.patch -patch --version -p1 < ../../../../patch_abstract_socket/Abstract_Socket.cc.patch +patch -i ../../../../patch_abstract_socket/Abstract_Socket.hh.patch Abstract_Socket.hh +patch -i ../../../../patch_abstract_socket/Abstract_Socket.cc.patch Abstract_Socket.cc cd $BASE_PATH # TODO Add other patch -- GitLab From be38e9f0654474955fceb082be329f0edf02d6d6 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 12 Feb 2026 13:53:55 +0100 Subject: [PATCH 048/151] Finalyze TC_NGAP_AMF_CMP_02 --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 13 ++++- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 6 ++- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 48 ++++++++++++++----- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index e517424..72959ec 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -102,9 +102,9 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #NGAP_TestCases.TC_NGAP_AMF_PDU_05 # Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed -NGAP_TestCases.TC_NGAP_AMF_CMP_01 +#NGAP_TestCases.TC_NGAP_AMF_CMP_01 # Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID -#NGAP_TestCases.TC_NGAP_AMF_CMP_02 +NGAP_TestCases.TC_NGAP_AMF_CMP_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 595e0cb..27784d9 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -313,7 +313,7 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_amf_UE_ContextRealease() runs on aMFNGAPComponent { + function f_NGAP_amf_UE_ContextRealease_ContextRealeaseComplete() runs on aMFNGAPComponent { if (PICS_OFFLINE_MODE) { f_await_ue_context_release_command_await_ue_context_release_complete(); } else { @@ -321,6 +321,17 @@ module NGAP_Steps { } } // End of function f_await_ue_context_release_command_send_ue_context_release_complete + /** + * @desc + */ + function f_NGAP_amf_UE_ContextRealeaseRequest() runs on aMFNGAPComponent { + if (PICS_OFFLINE_MODE) { + f_await_ue_context_release_request(); + } else { + f_send_ue_context_release_request(); + } + } // End of function f_NGAP_amf_UE_ContextRealeaseRequest + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 5b8ebd3..1e0e5ce 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4455,7 +4455,7 @@ module NGAP_TCFunctions { // Postamble // Send error response to release the UE context f_NGAP_amf_UE_PDU_InitialContextSetupFailure(); - f_NGAP_amf_UE_ContextRealease(); + f_NGAP_amf_UE_ContextRealease_ContextRealeaseComplete(); f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4490,6 +4490,8 @@ module NGAP_TCFunctions { // Body action("Trigger a UE context release command!"); + f_sleep(1.0); // Sleep for a while to make sure the previous procedure is completed + f_NGAP_amf_UE_ContextRealeaseRequest(); // f_send_ue_context_release_request f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -4533,6 +4535,8 @@ module NGAP_TCFunctions { // Body action("Trigger a UE context release command!"); + f_sleep(1.0); // Sleep for a while to make sure the previous procedure is completed + f_NGAP_amf_UE_ContextRealeaseRequest(); // f_send_ue_context_release_request f_recv_NGAP_PDU( mw_ngap_initMsg( diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 50e070c..665cd21 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -715,7 +715,7 @@ module LibNGAP_Functions { m_ngap_succMsg( m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID ))); } @@ -878,7 +878,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_DownlinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -922,7 +922,7 @@ module LibNGAP_Functions { // m_ngap_initMsg( // m_n2_UplinkNASTransport( // PX_AMF_UE_NGAP_ID, - // PX_RAN_UE_NGAP_ID, + // vc_RAN_UE_ID, // vc_sendNAS_PDU, // m_uPTransportLayerInformation_userLocationInformationNR( // m_userLocationInformationNR( @@ -940,7 +940,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_DownlinkNASTransport( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -1004,7 +1004,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_PDUSessionResourceSetupRequest( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, { mw_pDUSessionResourceSetupItemSUReq( PX_PDU_SESSION_ID, @@ -1092,7 +1092,7 @@ module LibNGAP_Functions { // mw_ngap_initMsg( // mw_n2_PDUSessionResourceSetupRequest( // vc_AMF_UE_ID, - // PX_RAN_UE_NGAP_ID, + // vc_RAN_UE_ID, // { // mw_pDUSessionResourceSetupItemSUReq( // PX_PDU_SESSION_ID, @@ -1172,7 +1172,7 @@ module LibNGAP_Functions { mw_ngap_succMsg( mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID ))); } @@ -1190,7 +1190,33 @@ module LibNGAP_Functions { m_ngap_succMsg( m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID + ))); + } + + function f_await_ue_context_release_request() runs on NGNASComponent { + log(">>> f_await_ue_context_release_request"); + + // Await UEContextReleaseRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_cause_radioNetwork(unspecified) + ))); + } + + function f_send_ue_context_release_request() runs on NGNASComponent { + log(">>> f_send_ue_context_release_request"); + + // Send UEContextReleaseRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UEContextReleaseRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_cause_radioNetwork(unspecified) ))); } @@ -1202,7 +1228,7 @@ module LibNGAP_Functions { mw_ngap_succMsg( mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID ))); } @@ -1214,7 +1240,7 @@ module LibNGAP_Functions { m_ngap_succMsg( m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID ))); } @@ -1236,7 +1262,7 @@ module LibNGAP_Functions { mw_ngap_succMsg( mw_n2_UEContextReleaseComplete( vc_AMF_UE_ID, - PX_RAN_UE_NGAP_ID + vc_RAN_UE_ID ))); } -- GitLab From 8b93f5859ac0f9963582825090c1b515bbedb48d Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 17 Feb 2026 12:39:31 +0100 Subject: [PATCH 049/151] Validating TC_NGAP_AMF_PDU_01 --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 12 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 35 +-- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 12 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 206 +++++++++++------- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 23 ++ ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 36 +++ .../lib_system/Lib_NG_NAS_Functions.ttcn | 30 +-- 7 files changed, 217 insertions(+), 137 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 72959ec..bb138de 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -21,6 +21,8 @@ LibNGAP_Pixits.PX_SST := '01'O LibNGAP_Pixits.PX_SD := '000009'O LibNGAP_Pixits.PX_PAGING_DRX := v128 +LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 + Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type @@ -39,7 +41,7 @@ Lib_NG_NAS_Pixits.PX_PLMN := '99f907'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 -Parameters.px_IMEISV_Def := '4573806121856151f1'H +Parameters.px_IMEISV_Def := '73806121856151f1'H NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) [LOGGING] @@ -48,9 +50,9 @@ NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V LogFile := "../logs/AtsNGAP/%e.%h-%r.%s" FileMask := LOG_ALL | USER | DEBUG | MATCHING -ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING #FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE -#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE LogSourceInfo := Stack LogEntityName:= Yes LogEventTypes:= Yes @@ -91,7 +93,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #AtsImsIot_TestControl.control # Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. -#NGAP_TestCases.TC_NGAP_AMF_PDU_01 +NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. @@ -104,7 +106,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed #NGAP_TestCases.TC_NGAP_AMF_CMP_01 # Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID -NGAP_TestCases.TC_NGAP_AMF_CMP_02 +#NGAP_TestCases.TC_NGAP_AMF_CMP_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 1e0e5ce..d80034e 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -37,35 +37,6 @@ module NGAP_TCFunctions { import from NGAP_Steps all; import from NGAP_Pixits all; - group TC_function_template{ - - /** - * @desc Testcase function for TC_NGAP_gNB_or_aMF_functionName_01 - */ - function f_TC_NGAP_gNB_or_aMF_functionName_01() runs on gNBNGAPComponent { - // Local variables - - // Preamble - f_NGAP_gnb_init(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - //f_send_NGAP_PDU(m_ngap_initMsg(/*initiating msgtemplate*/)); - //f_recv_NGAP_PDU(?); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_gNB_or_aMF_functionName_01 - - } // End of group TC_function_template - group gNB_Role{ //8.2 group PDU_Session_Management_Procedures{ @@ -4063,15 +4034,15 @@ module NGAP_TCFunctions { // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body //action("Trigger PDU session resource SETUP!"); - f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request + f_send_session_establishment_request(); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -4117,8 +4088,8 @@ module NGAP_TCFunctions { // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request_await_session_establishment_response f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request_send_session_resource_setup_response diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index f4cb923..aca96d9 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1439,12 +1439,12 @@ module LibNGAP_Templates { id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } - }/*, + }, { id := id_MaskedIMEISV, criticality := ignore, value_ := { MaskedIMEISV := p_maskedIMEISV } - }*/, + }, { id := id_NAS_PDU, criticality := ignore, @@ -6927,7 +6927,7 @@ module LibNGAP_Templates { */ template (value) InitiatingMessage m_n2_ErrorIndication := { procedureCode := id_ErrorIndication, - criticality := reject, + criticality := ignore, value_ := { ErrorIndication := { protocolIEs := { } @@ -6944,7 +6944,7 @@ module LibNGAP_Templates { in template (value) Cause p_cause ) := { procedureCode := id_ErrorIndication, - criticality := reject, + criticality := ignore, value_ := { ErrorIndication := { protocolIEs := { @@ -6977,7 +6977,7 @@ module LibNGAP_Templates { */ template (present) InitiatingMessage mw_n2_ErrorIndication := { procedureCode := id_ErrorIndication, - criticality := reject, + criticality := ignore, value_ := { ErrorIndication := { protocolIEs := { } @@ -6994,7 +6994,7 @@ module LibNGAP_Templates { template (present) Cause p_cause := ? ) := { procedureCode := id_ErrorIndication, - criticality := reject, + criticality := ignore, value_ := { ErrorIndication := { protocolIEs := { diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 665cd21..31664d4 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -250,50 +250,6 @@ module LibNGAP_Functions { } } - /** - * @desc Function to send NAS RegistrationComplete message - */ - function f_send_registration_complete() runs on NGNASComponent { - log(">>> f_send_registration_complete"); - - // Send request for REGISTRATION_COMPLETE - // Compute NAS message - var NG_NAS_UL_Message_Type v_nas_message := valueof( - m_NG_REGISTRATION_COMPLETE_noSOR - ); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_initialUeMessage( - -, - bit2oct(encvalue(valueof(v_nas_message))), - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - )) - ))); - } - - /** - * @desc Function to await NAS RegistrationComplete message - */ - function f_await_registration_complete() runs on NGNASComponent { - log(">>> f_await_registration_complete"); - - // Await request for REGISTRATION_COMPLETE - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_initialUeMessage - )); - f_NASPDU_Get(vc_recvNGAP_PDU) - if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_COMPLETE)) { - log("Received NG_REGISTRATION_COMPLETE NAS message"); - } else { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - } - } - /** * @desc Function to await NAS AuthenticationRequest message and send for AuthenticationResponse message */ @@ -714,7 +670,7 @@ module LibNGAP_Functions { f_send_NGAP_PDU( m_ngap_succMsg( m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( - PX_AMF_UE_NGAP_ID, + vc_AMF_UE_ID, vc_RAN_UE_ID ))); } @@ -831,43 +787,135 @@ module LibNGAP_Functions { )))); } + /** + * @desc Function to send NAS RegistrationComplete message + */ + function f_send_registration_complete() runs on NGNASComponent { + log(">>> f_send_registration_complete"); + + // Send request for REGISTRATION_COMPLETE + // Compute NAS message + var NG_NAS_UL_Message_Type v_nas_message := valueof( + m_NG_REGISTRATION_COMPLETE_noSOR + ); + // 2. Add security if any + // TODO + log("f_send_registration_complete: ", v_nas_message); + var octetstring v_msg := bit2oct(encvalue(v_nas_message)); + log("bit2oct(encvalue(f_send_registration_complete))", v_msg); + + // 3. Add security if any + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_Ciphered, + v_msg, + tsc_DirectionUL, + PX_BEARER_ID, + vc_previous_nas_count_ul, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_ul: ", vc_previous_nas_count_ul); + vt_NgNasUl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_initialUeMessage( + -, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + )) + ))); + } + + /** + * @desc Function to await NAS RegistrationComplete message + */ + function f_await_registration_complete() runs on NGNASComponent { + log(">>> f_await_registration_complete"); + + // Await request for REGISTRATION_COMPLETE + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_initialUeMessage + )); + f_NASPDU_Get(vc_recvNGAP_PDU) + if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_COMPLETE)) { + log("Received NG_REGISTRATION_COMPLETE NAS message"); + } else { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + } + } + function f_send_session_establishment_request() runs on NGNASComponent { log(">>> f_send_session_establishment_request"); - // Send PDUSessionEstablishmentRequest - // vt_NgNasUl_Msg := m_NG_SECURITY_MODE_COMPLETE( - // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, - // { iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, - // m_NG_MobileIdentitySUCI(PX_TYPE_OF_ID,PX_SUPI_DIGITS) //in template (value) NG_MobileIdentity p_NonIMEISV_PEI - // ); - // var octetstring os := bit2oct( - // encvalue( - // valueof( - // m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( - // cs_NG_PDU_SessionId, - // tsc_PTI_1 - // )))); - // vt_NgNasUl_Msg.security_Protected_Nas_Message := m_NG_SECURITY_PROTECTED_NAS_MESSAGE( - // tsc_EPD_GMM, - // tsc_SpareHalfOctet, - // tsc_SHT_IntegrityProtected_Ciphered, - // '00000000'O, // FIXME How to calculate MessageAuthenticationCode? - // '00'O, - // os // Cyphered NAS message - // ); + // 1. Prepare PDUSessionEstablishmentRequest message + var NG_NAS_UL_Message_Type v_ng_pdu_session_establishment_request := valueof( + m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( + cs_NG_PDU_SessionId(int2oct(PX_PDU_SESSION_ID, 1), omit), + tsc_PTI_1, + m_PDU_SessionType_iei('001'B), + crs_SSC_Mode('9'H, '001'B), + m_ng_ue_sm_cap, + -, + m_integrity_prot_max_data_rate + )); + v_ng_pdu_session_establishment_request.pdu_Session_Establishment_Request.protocolDiscriminator := tsc_EPD_GSM; + // 2. Prepare UL NAS Transport message + log("v_ng_pdu_session_establishment_request: ", v_ng_pdu_session_establishment_request); + var octetstring v_msg := bit2oct(encvalue(v_ng_pdu_session_establishment_request)); + log("bit2oct(encvalue(v_ng_pdu_session_establishment_request))", v_msg); + var NG_NAS_UL_Message_Type v_ng_ul_nas_transport := valueof( + m_NG_UL_NAS_TRANSPORT( + { iei := omit, container := '0001'B }, // N1 SM information (1) + m_PayloadContainer( + -, + int2oct(lengthof(v_msg), 2), + v_msg + ), + cr_NG_PDU_SessionId ('12'O, int2oct(PX_PDU_SESSION_ID, 1)), + -, + cr_NG_Request_Type('001'B), + cs_S_NSSAI_WithIEI('22'O, cs_S_NSSAI('01'O, PX_SST, omit)), + cs_DNN(-, '08696e7465726e6574'O) // internet + )); - // vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - // f_send_NGAP_PDU( - // m_ngap_initMsg( - // m_n2_UplinkNASTransport( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID, - // vc_sendNAS_PDU, - // m_uPTransportLayerInformation_userLocationInformationNR( - // m_userLocationInformationNR( - // m_nR_CGI, - // m_tAI - // ))))); + // 2. Add security if any + // TODO + log("v_ng_ul_nas_transport: ", v_ng_ul_nas_transport); + v_msg := bit2oct(encvalue(v_ng_ul_nas_transport)); + log("bit2oct(encvalue(v_ng_ul_nas_transport))", v_msg); + + // 3. Add security if any + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_Ciphered, + v_msg, + tsc_DirectionUL, + PX_BEARER_ID, + vc_previous_nas_count_ul, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_ul: ", vc_previous_nas_count_ul); + vt_NgNasUl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); } function f_await_session_establishment_request() runs on NGNASComponent { @@ -921,7 +969,7 @@ module LibNGAP_Functions { // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_UplinkNASTransport( - // PX_AMF_UE_NGAP_ID, + // vc_AMF_UE_ID, // vc_RAN_UE_ID, // vc_sendNAS_PDU, // m_uPTransportLayerInformation_userLocationInformationNR( diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index b847b5f..7867a10 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -157,6 +157,29 @@ module LibNGAP_Steps { f_NGAPPDU_Set(p_PDU); log("f_send_NGAP_PDU: vc_sendNGAP_PDU: ", vc_sendNGAP_PDU); N2_gNBaMF_P.send(p_PDU); + tc_noac.start(3.0); + alt { + [] N2_gNBaMF_P.check( + receive( + mw_ngap_initMsg( + mw_n2_ErrorIndication_ids( + vc_AMF_UE_ID, + vc_RAN_UE_ID + )))) { + // Let's the test case proceed with the error indication, but log it as inconclusive + setverdict(inconc,"*** " & __SCOPE__ & ": INCONC: Error indication received. ***"); + } + [] N2_gNBaMF_P.check( + receive( + mw_ngap_initMsg + )) { + tc_noac.stop; + } + [] tc_noac.timeout { + // No message received, let's consider the message was accepted and proceed with the test case execution + log("f_send_NGAP_PDU: Message accepted"); + } + } } // End of function f_send_NGAPPDU /** diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 9cc5f2d..363e8b0 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -2344,4 +2344,40 @@ module Lib_NG_NAS_Templates { } } // End of template m_NG_SecurityProtected_NasMsg + template (value) PDU_SessionType m_PDU_SessionType_iei( + in B3_Type p_Type + ) modifies cs_PDU_SessionType := { + iei := '9'H, + spare := tsc_Spare1, + typeValue := p_Type + } + + template (value) NG_UE_SM_Cap m_ng_ue_sm_cap( + in template (value) B1_Type p_tpmic := '0'B, + in template (value) B4_Type p_atsssST := '0000'B, + in template (value) B1_Type p_ept_S1 := '0'B, + in template (value) B1_Type p_mh6_PDU := '0'B, + in template (value) B1_Type p_rQoS := '0'B + ) := { + iei := '28'O, + iel := '01'O, + tpmic := p_tpmic, + atsssST := p_atsssST, + ept_S1 := p_ept_S1, + mh6_PDU := p_mh6_PDU, + rQoS := p_rQoS, + spareBits := omit, + apmqf := omit, + spare := omit + } // End of template m_ng_ue_sm_cap + + template (value) IntegrityProtMaxDataRate m_integrity_prot_max_data_rate( + in template (value) O1_Type p_maxDataRateUL := 'ff'O, + in template (value) O1_Type p_maxDataRateDL := 'ff'O + ) := { + iei := omit, + maxDataRateUL := p_maxDataRateUL, + maxDataRateDL := p_maxDataRateDL + } // End of template m_integrity_prot_max_data_rate + } // End of module Lib_NG_NAS_Templates \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index 3134f3b..556b99c 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -53,7 +53,7 @@ module Lib_NG_NAS_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_initialUeMessage( - PX_RAN_UE_NGAP_ID, + vc_RAN_UE_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( @@ -70,7 +70,7 @@ module Lib_NG_NAS_Functions { // f_recv_NGAP_PDU( // mw_ngap_initMsg( // mw_n2_initialUeMessage( -// PX_RAN_UE_NGAP_ID +// vc_RAN_UE_ID // ))); // f_NASPDU_Get(vc_recvNGAP_PDU); // if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_REQUEST)) { @@ -93,8 +93,8 @@ module Lib_NG_NAS_Functions { // f_recv_NGAP_PDU( // mw_ngap_initMsg( // mw_n2_DownlinkNASTransport( - // PX_AMF_UE_NGAP_ID, - // PX_RAN_UE_NGAP_ID, + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, // ? // AuthorizationRequest // ))); // f_NASPDU_Get(vc_recvNGAP_PDU); @@ -133,8 +133,8 @@ module Lib_NG_NAS_Functions { // f_recv_NGAP_PDU( // mw_ngap_initMsg( // mw_n2_DownlinkNASTransport( - // ?,//PX_AMF_UE_NGAP_ID, - // PX_RAN_UE_NGAP_ID, + // ?,//vc_AMF_UE_ID, + // vc_RAN_UE_ID, // ? // AuthenticationRequest // ))); // f_NASPDU_Get(vc_recvNGAP_PDU); @@ -176,7 +176,7 @@ module Lib_NG_NAS_Functions { // m_ngap_initMsg( // m_n2_UplinkNASTransport( // vc_AMF_UE_ID, - // PX_RAN_UE_NGAP_ID, + // vc_RAN_UE_ID, // vc_sendNAS_PDU, // m_uPTransportLayerInformation_userLocationInformationNR( // m_userLocationInformationNR( @@ -197,8 +197,8 @@ module Lib_NG_NAS_Functions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + vc_AMF_UE_ID, + vc_RAN_UE_ID, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( @@ -218,8 +218,8 @@ module Lib_NG_NAS_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + vc_AMF_UE_ID, + vc_RAN_UE_ID, ? // Security mode command ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -252,8 +252,8 @@ module Lib_NG_NAS_Functions { // f_recv_NGAP_PDU( // mw_ngap_initMsg( // mw_n2_DownlinkNASTransport( - // PX_AMF_UE_NGAP_ID, - // PX_RAN_UE_NGAP_ID, + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, // ? // Security mode command // ))); // f_NASPDU_Get(vc_recvNGAP_PDU); @@ -297,8 +297,8 @@ module Lib_NG_NAS_Functions { // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_UplinkNASTransport( - // PX_AMF_UE_NGAP_ID, - // PX_RAN_UE_NGAP_ID, + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, // vc_sendNAS_PDU, // m_uPTransportLayerInformation_userLocationInformationNR( // m_userLocationInformationNR( -- GitLab From b4936b05c49011c79f7411005057de73acc479ff Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 20 Feb 2026 10:05:19 +0100 Subject: [PATCH 050/151] Validating TC_NGAP_AMF_CMP_02 --- ttcn/AtsNGAP/NGAP_Steps.ttcn | 2 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 3 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 4 +- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 62 ++++++++++++------- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 27784d9..d1c5286 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -270,7 +270,7 @@ module NGAP_Steps { if (PICS_OFFLINE_MODE) { f_await_session_establishment_request(); } else { - f_send_session_establishment_request(); + f_send_pdu_session_establishment_request(); } } // End of function f_NGAP_amf_UE_PDU_SessionEstablishmentRequest diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index d80034e..4bb4908 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4030,6 +4030,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); @@ -4042,7 +4043,7 @@ module NGAP_TCFunctions { // Body //action("Trigger PDU session resource SETUP!"); - f_send_session_establishment_request(); + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); f_recv_NGAP_PDU( mw_ngap_initMsg( diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 31664d4..ec4dbff 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -851,8 +851,8 @@ module LibNGAP_Functions { } } - function f_send_session_establishment_request() runs on NGNASComponent { - log(">>> f_send_session_establishment_request"); + function f_send_pdu_session_establishment_request() runs on NGNASComponent { + log(">>> f_send_pdu_session_establishment_request"); // 1. Prepare PDUSessionEstablishmentRequest message var NG_NAS_UL_Message_Type v_ng_pdu_session_establishment_request := valueof( diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index 7867a10..1623e07 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -157,29 +157,29 @@ module LibNGAP_Steps { f_NGAPPDU_Set(p_PDU); log("f_send_NGAP_PDU: vc_sendNGAP_PDU: ", vc_sendNGAP_PDU); N2_gNBaMF_P.send(p_PDU); - tc_noac.start(3.0); - alt { - [] N2_gNBaMF_P.check( - receive( - mw_ngap_initMsg( - mw_n2_ErrorIndication_ids( - vc_AMF_UE_ID, - vc_RAN_UE_ID - )))) { - // Let's the test case proceed with the error indication, but log it as inconclusive - setverdict(inconc,"*** " & __SCOPE__ & ": INCONC: Error indication received. ***"); - } - [] N2_gNBaMF_P.check( - receive( - mw_ngap_initMsg - )) { - tc_noac.stop; - } - [] tc_noac.timeout { - // No message received, let's consider the message was accepted and proceed with the test case execution - log("f_send_NGAP_PDU: Message accepted"); - } - } + // tc_noac.start(3.0); + // alt { + // [] N2_gNBaMF_P.check( + // receive( + // mw_ngap_initMsg( + // mw_n2_ErrorIndication_ids( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // )))) { + // // Let's the test case proceed with the error indication, but log it as inconclusive + // setverdict(inconc,"*** " & __SCOPE__ & ": INCONC: Error indication received. ***"); + // } + // [] N2_gNBaMF_P.check( + // receive( + // NGAP_PDU:? + // )) { + // tc_noac.stop; + // } + // [] tc_noac.timeout { + // // No message received, let's consider the message was accepted and proceed with the test case execution + // log("f_send_NGAP_PDU: Message accepted"); + // } + // } } // End of function f_send_NGAPPDU /** @@ -348,6 +348,22 @@ module LibNGAP_Steps { stop; } } + [] N2_gNBaMF_P.receive( + mw_ngap_initMsg( + mw_n2_ErrorIndication_ids( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))) { + // Let's the test case proceed with the error indication, but log it as inconclusive + setverdict(inconc,"*** " & __SCOPE__ & ": INCONC: Error indication received. ***"); + all timer.stop; + if (vc_serverStop==false) { + f_selfOrClientSyncAndVerdict("error", e_timeout); + } + else { + stop; + } + } [] N2_gNBaMF_P.receive (NGAP_PDU:{initiatingMessage := ?}) -> value vc_recvNGAP_PDUDefault { repeat; } -- GitLab From 87bbf7f57876e324392526f885345a69981c3e4f Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 17 Mar 2026 10:22:33 +0100 Subject: [PATCH 051/151] syntax --- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index ec4dbff..bde3075 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -79,7 +79,7 @@ module LibNGAP_Functions { /** * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ - function f_send_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { + function f_send_NGSetupRequest_await_NGSetupResponse() runs on NGNASComponent { // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( @@ -100,7 +100,7 @@ module LibNGAP_Functions { m_sliceSupportItem( m_s_NSSAI( PX_SST, - -, //PX_SD,// in template (omit) SD p_sD := omit, + PX_SD,// in template (omit) SD p_sD := omit, -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit ), -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit @@ -133,7 +133,7 @@ module LibNGAP_Functions { /** * @desc Function to send NGSetupRequest message and await for NGSetupResponse message */ - function f_await_NGSetupRequest_await_NGSetupRespone() runs on NGNASComponent { + function f_send_NGSetupRequest_await_NGSetupResponse2() runs on NGNASComponent { // Await NGSetupRequest f_recv_NGAP_PDU( mw_ngap_initMsg( -- GitLab From 9666dff854bb73086ceb8362838efe070425b0c2 Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 17 Mar 2026 10:23:06 +0100 Subject: [PATCH 052/151] syntax --- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 3b3fbea..3fcadbe 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -114,7 +114,7 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_send_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); f_send_NasRegistrationRequest(); f_NG_NAS_amf_UE_Authentication(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -157,7 +157,7 @@ module NG_NAS_TCFunctions { var integer v_start_time_ms; // Preamble - f_send_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); f_send_NasRegistrationRequest(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1243,9 +1243,9 @@ module NG_NAS_TCFunctions { // Preamble if (PICS_OFFLINE_MODE) { - f_await_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } else { - f_send_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -1425,9 +1425,9 @@ module NG_NAS_TCFunctions { // Preamble if (PICS_OFFLINE_MODE) { - f_await_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } else { - f_send_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); -- GitLab From dc87a1535a8f90be3849dabc1cc566ddfa9ce9dd Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 17 Mar 2026 10:23:19 +0100 Subject: [PATCH 053/151] syntax --- ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn index 5072585..88c9ad5 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn @@ -44,9 +44,9 @@ module NG_NAS_Steps { function f_NG_NAS_amf_UE_Register() runs on aMF_NGNAS_NGAPComponent { log(">>> f_NGAP_amf_UE_f_NG_NAS_amf_UE_RegisterRegister"); if (PICS_OFFLINE_MODE) { - f_await_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } else { - f_send_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } log("f_NGAP_amf_UE_Register: f_send_registration_request done"); if (PICS_OFFLINE_MODE) { -- GitLab From dff37ddf0d5fbcdc623c54a379e20aef361465fa Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 17 Mar 2026 10:23:31 +0100 Subject: [PATCH 054/151] syntax --- ttcn/AtsNGAP/NGAP_Steps.ttcn | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index d1c5286..d5cc9f4 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -183,9 +183,9 @@ module NGAP_Steps { function f_NGAP_amf_UE_Register() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_Register"); if (PICS_OFFLINE_MODE) { - f_await_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } else { - f_send_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } log("f_NGAP_amf_UE_Register: f_send_registration_request done"); if (PICS_OFFLINE_MODE) { @@ -445,11 +445,11 @@ module NGAP_Steps { function f_NGAP_gnb_UE_Register() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_Register"); if (PICS_OFFLINE_MODE) { - f_await_NGSetupRequest_await_NGSetupRespone(); + f_send_NGSetupRequest_await_NGSetupResponse(); } else { f_await_NGSetupRequest_send_NGSetupRespone(); } - log("f_NGAP_gnb_UE_Register: f_send_NGSetupRequest_await_NGSetupRespone done"); + log("f_NGAP_gnb_UE_Register: f_send_NGSetupRequest_await_NGSetupResponse done"); f_await_registration_request(); log("<<< f_NGAP_gnb_UE_Register"); } // End of function f_NGAP_gnb_UE_Register -- GitLab From eed57772734b5ca4be30b5b1797c296a2a263ca5 Mon Sep 17 00:00:00 2001 From: pintar Date: Wed, 18 Mar 2026 16:34:12 +0100 Subject: [PATCH 055/151] Inconsistencies and typos were resolved --- test_purposes/Ngnas_Common.tplan2 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test_purposes/Ngnas_Common.tplan2 b/test_purposes/Ngnas_Common.tplan2 index 0b4e0ac..b001b26 100644 --- a/test_purposes/Ngnas_Common.tplan2 +++ b/test_purposes/Ngnas_Common.tplan2 @@ -121,7 +121,9 @@ Package Ngnas_Common { ; events: - receives + - receive - sends + - send - forwards - aborts // Initial conditions @@ -142,9 +144,9 @@ Package Ngnas_Common { - indicateUEderegistration ; event templates: - /* This template can be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSFER message. */ + /* This template can be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSPORT message. */ - AUTHENTICATION_REQUEST { - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, @@ -171,7 +173,6 @@ Package Ngnas_Common { type Bitstring; type PIXIT; - PIXIT PX_WRONG_ARP_IEI; //0x20 PIXIT PX_WRONG_ARP_IEI; //0x20 //Table 8.1-1 -- GitLab From 791f83d35448105429b9b240f68c2480bbb1d8cd Mon Sep 17 00:00:00 2001 From: pintar Date: Wed, 18 Mar 2026 16:34:26 +0100 Subject: [PATCH 056/151] Inconsistencies and typos were resolved --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 228 +++++++++++++----------- 1 file changed, 124 insertions(+), 104 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 24efb99..83c9732 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -47,7 +47,7 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, - registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type, 5GS_mobile_identity;; } @@ -56,12 +56,12 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, + message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, Authentication_parameter_RAND, Authentication_parameter_AUTN;; - to the UE entity + to the GNB entity } } } // end TP_5GNAS_AMF_AUT_REQ_01 @@ -91,18 +91,18 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, - authentication_response_message_identity set to AUTHENTICATION_RESPONSE, + message_type set to AUTHENTICATION_RESPONSE, authentication_response_parameter containing Authentication_response_parameter_IEI indicating value PX_WRONG_ARP_IEI;;; - from the UE entity + from the GNB entity } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, - authentication_reject_message_identity set to AUTHENTICATION_REJECT;; - to the UE entity + message_type set to AUTHENTICATION_REJECT;; + to the GNB entity } } } // end TP_5GNAS_AMF_AUT_REQ_02 @@ -159,7 +159,7 @@ Package TP_AMF { security_header_type set to INTEGRITY_PROTECTED, authentication_parameter_AUTN containing AUTN indicating value PX_WRONG_MAC_CODE;;; - to the UE entity + to the GNB entity } Expected behaviour @@ -169,18 +169,18 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, + message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to MAC_failure;; - from the UE entity + from the GNB entity } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, - identity_request_message_identity set to IDENTITY_REQUEST, + message_type set to IDENTITY_REQUEST, identity_type set to SUCI;; - to the UE entity + to the GNB entity } } } // end TP_5GNAS_AMF_AUT_REQ_04 @@ -200,19 +200,19 @@ Package TP_AMF { Initial conditions with { the UE entity isNotRegisteredToAMF and - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, + message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, //value for nas_key_set_identifier was already used before spare_half_octet, ABBA, Authentication_parameter_RAND, Authentication_parameter_AUTN;; - to the UE entity + to the GNB entity } Expected behaviour @@ -222,24 +222,24 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, + message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to ngKSI_already_in_use;; - from the UE entity + from the GNB entity } then { - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, + message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI;, spare_half_octet, ABBA, Authentication_parameter_RAND, Authentication_parameter_AUTN;; - to the UE entity + to the GNB entity } } } // end TP_5GNAS_AMF_AUT_REQ_05 @@ -261,19 +261,19 @@ Package TP_AMF { Initial conditions with { the UE entity isNotRegisteredToAMF and - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, + message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, spare_half_octet, ABBA, Authentication_parameter_RAND, Authentication_parameter_AUTN;; //the "separation bit" in the AMF field of AUTN is set to 0 - to the UE entity + to the GNB entity } Expected behaviour @@ -283,19 +283,19 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, - authentication_failure_message_identity set to AUTHENTICATION_FAILURE, + message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to "Non-5G authentication unacceptable (26)";; - from the UE entity + from the GNB entity } then { - the IUT entity sends an DOWNLINK_NAS_TRANSFER containing + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, - identity_request_message_identity set to IDENTITY_REQUEST, + message_type set to IDENTITY_REQUEST, 5GS_identity_type_IEI set to "SUCI";; - to the UE entity + to the GNB entity } } @@ -315,7 +315,7 @@ Package TP_AMF { Test objective "Verify that the IUT sends a SECURITY_MODE_COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION_RESPONSE." Reference - "ETSI TS 124 501 [1], Clause 5.4.1.2" + "ETSI TS 124 501 [1], Clauses 5.4.2.2, 5.4.2.3 and 8.2.25" Config Id CF_AMF_N2N1 @@ -325,7 +325,7 @@ Package TP_AMF { the UE entity isNotRegisteredToAMF and event AUTHENTICATION_REQUEST occurs with { argument replaced by the AUTHENTICATION_REQUEST containing - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT; + security_header_type set to NOT_SECURITY_PROTECTED; } } @@ -335,21 +335,21 @@ Package TP_AMF { the IUT entity receives a UPLINK_NAS_TRANSPORT containing // AUTHENTICATION_RESPONSE NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - authentication_response_message_identity set to AUTHENTICATION_RESPONSE;; //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - from the UE entity + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_RESPONSE;; //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + from the GNB entity } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // SECURITY_MODE_COMMAND NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_command_message_identity set to SECURITY_MODE_COMMAND, + message_type set to SECURITY_MODE_COMMAND, selected_NAS_security_algorithms, ngKSI containing nas_key_set_identifier set to "111";, replayed_UE_security_capabilities;; // UE security capability 9.11.3.54 - to the UE entity + to the GNB entity } } } // end TP_NGNAS_AMF_AUT_SEQ_01 @@ -361,7 +361,7 @@ Package TP_AMF { Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" + "ETSI TS 124 501 [1], Clause 5.4.2.4, 5.5.1.2.4, 8.2.7 and 8.2.26" Config Id CF_AMF_N2N1 @@ -379,17 +379,17 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_complete_message_identity set to SECURITY_MODE_COMPLETE;; - from the UE entity + message_type set to SECURITY_MODE_COMPLETE;; + from the GNB entity } then { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, + message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing - 55GS_registration_result_value set to 3GPP_ACCESS;, + 5GS_registration_result_value set to 3GPP_ACCESS;, 5G_GUTI containing Type_of_identity set to 5G_GUTI, MCC indicating value PX_MCC, @@ -421,7 +421,7 @@ Package TP_AMF { Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_REJECT message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration." Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.25" + "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.27" Config Id CF_AMF_N2N1 @@ -438,16 +438,16 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - security_mode_reject_message_identity set to SECURITY_MODE_REJECT, + message_type set to SECURITY_MODE_REJECT, 5GMM_cause set to "UE security capabilities mismatch (23)";; - from the UE entity + from the GNB entity } then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_reject_message_identity set to REGISTRATION_REJECT, + message_type set to REGISTRATION_REJECT, 5GMM_cause set to "UE security capabilities mismatch (23)", T3346_value containing Timer_value indicating value nonZeroValue;;; @@ -473,7 +473,7 @@ Package TP_AMF { Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_REQUEST from the UE and responds with a DL NAS transport message containing a PDU SESSION ESTABLISHMENT ACCEPT." Reference - "ETSI TS 124 501 [1], Clause 5.4.5 and 8.2.10, 8.2.11" + "ETSI TS 124 501 [1], Clauses 5.4.5, 6.4.1, 8.2.10 and 8.2.11" Config Id CF_AMF_N2N1 @@ -488,28 +488,48 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - uL_NAS_TRANSPORT_message_identity set to UL_NAS_TRANSPORT, + message_type set to UL_NAS_TRANSPORT, payload_container containing payload_container_type set to "N1 SM information", number_of_optional_IEs set to 1, optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_REQUEST;, old_PDU_session_ID;; - from the UE entity + from the GNB entity +// BPIN: Above expected behaviour need to be checked once again, and updated (one sample is below but need to be checked again) +// the IUT entity receives an UPLINK_NAS_TRANSPORT containing +// NAS_PDU containing +// extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, +// security_header_type set to NOT_SECURITY_PROTECTED, +// message_type set to UL_NAS_TRANSPORT, +// payload_container_type set to "N1 SM information", +// payload_container containing +// 5GSM_PDU containing +// extended_protocol_discriminator set to 5GS_SESION_MANAGEMENT_MESSAGES, +// message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, +// PDU_session_type set to "IPv4", +// SSC_mode set to "SSC mode 1";;, +// pDU_session_identity set to PX_PDU_session_identity, +// request_type set to "Initial request", +// s_NSSAI containing +// sst set to PX_SST, +// sd set to PX_SD;, +// dNN set to PX_DNN;; +// from the GNB entity } then { the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - dL_NAS_TRANSPORT_message_identity set to DL_NAS_TRANSPORT, + message_type set to DL_NAS_TRANSPORT, payload_container containing payload_container_type set to "N1 SM information", number_of_optional_IEs set to 1, optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_ACCEPT;, pDU_session_ID;; - to the UE entity + to the GNB entity } } @@ -545,15 +565,15 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, + Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, Routing_indicator indicating value PX_ROUTING_INDICATOR, @@ -565,11 +585,11 @@ Package TP_AMF { then { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, + message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing - 55GS_registration_result_value set to 3GPP_ACCESS;, + 5GS_registration_result_value set to 3GPP_ACCESS;, 5G_GUTI containing Type_of_identity set to 5G_GUTI, MCC indicating value PX_MCC, @@ -615,15 +635,15 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, + Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, Routing_indicator indicating value PX_ROUTING_INDICATOR, @@ -637,9 +657,9 @@ Package TP_AMF { then { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, + message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing 5GS_registration_result_value set to 3GPP_ACCESS, SMS_over_NAS_transport_allowed set to 1;, //SMS over NAS allowed @@ -688,15 +708,15 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, + Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, Routing_indicator indicating value PX_ROUTING_INDICATOR, @@ -710,9 +730,9 @@ Package TP_AMF { then { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, + message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing 5GS_registration_result_value set to 3GPP_ACCESS, SMS_over_NAS_transport_allowed set to 0;, //SMS over NAS not allowed @@ -760,15 +780,15 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, + Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, Routing_indicator indicating value PX_ROUTING_INDICATOR, @@ -780,9 +800,9 @@ Package TP_AMF { then { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, + message_type set to REGISTRATION_ACCEPT, 5G_GUTI containing Type_of_identity set to 5G_GUTI, MCC indicating value PX_MCC, @@ -824,15 +844,15 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, + Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, Routing_indicator indicating value PX_ROUTING_INDICATOR, @@ -844,9 +864,9 @@ Package TP_AMF { then { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_accept_message_identity set to REGISTRATION_ACCEPT, + message_type set to REGISTRATION_ACCEPT, 5G_GUTI containing Type_of_identity set to 5G_GUTI, MCC indicating value PX_MCC, @@ -888,15 +908,15 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, - Type_of_idenity indicating value SUCI, + Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, Routing_indicator indicating value PX_ROUTING_INDICATOR, @@ -908,9 +928,9 @@ Package TP_AMF { then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Registration_reject_message_identity set to REGISTRATION_REJECT, + message_type set to REGISTRATION_REJECT, 5GMM_cause set to "Congestion (22)", T3346_value containing Timer_value indicating value nonZeroValue;;; @@ -941,7 +961,7 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - Registration_request_message_identity set to REGISTRATION_REQUEST, + message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending @@ -951,7 +971,7 @@ Package TP_AMF { then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - Registration_reject_message_identity set to REGISTRATION_REJECT, + message_type set to REGISTRATION_REJECT, 5GMM_cause set to "No network slice available (62)";; to the GNB entity } @@ -987,9 +1007,9 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing Switch_off_value set to NORMAL_DEREGISTRATION, Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, @@ -1007,9 +1027,9 @@ Package TP_AMF { then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; + message_type set to DEREGISTRATION_ACCEPT;; to the GNB entity } } @@ -1037,9 +1057,9 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing Switch_off_value set to SWITCH_OFF, Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, @@ -1055,11 +1075,11 @@ Package TP_AMF { from the GNB entity } then { - the IUT entity not sends a DOWNLINK_NAS_TRANSPORT containing + the IUT entity not send a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; + message_type set to DEREGISTRATION_ACCEPT;; to the GNB entity } } @@ -1097,9 +1117,9 @@ Package TP_AMF { then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing Switch_off_value set to NORMAL_DEREGISTRATION, Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, @@ -1132,19 +1152,19 @@ Package TP_AMF { the IUT entity indicateUEderegistration and the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST;; + message_type set to DEREGISTRATION_REQUEST;; to the GNB entity and - the IUT entity does not receives an UPLINK_NAS_TRANSPORT containing + the IUT entity does not receive an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - Deregistration_accept_message_identity set to DEREGISTRATION_ACCEPT;; + message_type set to DEREGISTRATION_ACCEPT;; from the GNB entity } then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing Switch_off_value set to NORMAL_DEREGISTRATION, Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, @@ -1179,9 +1199,9 @@ Package TP_AMF { then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5G_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - Deregistration_request_message_identity set to DEREGISTRATION_REQUEST, + message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing Switch_off_value set to NORMAL_DEREGISTRATION, Reregistration_required_value set to REREGISTRATION_REQUIRED, -- GitLab From d3872ec8f99ff458fdb79f6d6ca4bd15a638e059 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Wed, 18 Mar 2026 17:11:11 +0000 Subject: [PATCH 057/151] Additional update --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 44 ++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 83c9732..5b54c5f 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -45,7 +45,7 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type, @@ -54,7 +54,7 @@ Package TP_AMF { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_REQUEST, ngKSI containing @@ -70,7 +70,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_AUT_REQ_02 - Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message correctly upon receipt of an AUTHENTICATION_RESPONSE message indicating a wrong ARP IEI." + Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message correctly upon receipt of an AUTHENTICATION_RESPONSE containing invalid authentication response parameters." Reference "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" @@ -89,17 +89,17 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_RESPONSE, authentication_response_parameter containing - Authentication_response_parameter_IEI indicating value PX_WRONG_ARP_IEI;;; + Authentication_response_parameter_IEI indicating value PX_INVALID_AUTHENTICATION_RESOINSE_VALUE;;; from the GNB entity } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_REJECT;; to the GNB entity @@ -167,7 +167,7 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to MAC_failure;; @@ -176,7 +176,7 @@ Package TP_AMF { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to IDENTITY_REQUEST, identity_type set to SUCI;; @@ -202,7 +202,7 @@ Package TP_AMF { the UE entity isNotRegisteredToAMF and the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, message_type set to AUTHENTICATION_REQUEST, @@ -220,7 +220,7 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to ngKSI_already_in_use;; @@ -229,7 +229,7 @@ Package TP_AMF { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, message_type set to AUTHENTICATION_REQUEST, @@ -263,7 +263,7 @@ Package TP_AMF { the UE entity isNotRegisteredToAMF and the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, message_type set to AUTHENTICATION_REQUEST, @@ -281,7 +281,7 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to "Non-5G authentication unacceptable (26)";; @@ -290,7 +290,7 @@ Package TP_AMF { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, message_type set to IDENTITY_REQUEST, @@ -334,7 +334,7 @@ Package TP_AMF { when { the IUT entity receives a UPLINK_NAS_TRANSPORT containing // AUTHENTICATION_RESPONSE NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_RESPONSE;; //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values from the GNB entity @@ -342,7 +342,7 @@ Package TP_AMF { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // SECURITY_MODE_COMMAND NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_COMMAND, selected_NAS_security_algorithms, @@ -377,8 +377,8 @@ Package TP_AMF { when { the IUT entity receives a UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_COMPLETE;; from the GNB entity } @@ -436,7 +436,7 @@ Package TP_AMF { when { the IUT entity receives a UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_REJECT, 5GMM_cause set to "UE security capabilities mismatch (23)";; @@ -489,7 +489,7 @@ Package TP_AMF { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to UL_NAS_TRANSPORT, payload_container containing payload_container_type set to "N1 SM information", @@ -501,7 +501,7 @@ Package TP_AMF { // the IUT entity receives an UPLINK_NAS_TRANSPORT containing // NAS_PDU containing // extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, -// security_header_type set to NOT_SECURITY_PROTECTED, +// security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, // message_type set to UL_NAS_TRANSPORT, // payload_container_type set to "N1 SM information", // payload_container containing @@ -522,7 +522,7 @@ Package TP_AMF { the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DL_NAS_TRANSPORT, payload_container containing payload_container_type set to "N1 SM information", -- GitLab From b2d8f0214ba9f3f370a0b71512ddfb36f69b370b Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Wed, 18 Mar 2026 17:12:33 +0000 Subject: [PATCH 058/151] UE to GNB change since this is NAS conformance with uper NGAP layer --- test_purposes/Ngnas_Common.tplan2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_purposes/Ngnas_Common.tplan2 b/test_purposes/Ngnas_Common.tplan2 index b001b26..2fb149e 100644 --- a/test_purposes/Ngnas_Common.tplan2 +++ b/test_purposes/Ngnas_Common.tplan2 @@ -161,7 +161,7 @@ Package Ngnas_Common { Authentication_parameter_AUTN ; ; - to the UE entity + to the GNB entity } ; } // End of Domain section -- GitLab From 745bed0dc490cd4843eed377a3569466c3fce2ee Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 19 Mar 2026 13:33:28 +0100 Subject: [PATCH 059/151] Update README file --- README.md | 368 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 311 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 29d516e..1ada180 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,346 @@ -# NG_NAS +# ETSI 5GNGAP protocol project +## Introduction -## Getting started +This repositories contains the test specificationsfor ETSI 5GNGAP protocols testing, Release 16. +ETSI 5GNGAP protocols project supports: +- ETSI TS 123 501: "5G; System architecture for the 5G System (5GS) (3GPP TS 23.501 version 16.16.0 Release 16)" +- ETSI TS 123 502: "5G; Procedures for the 5G System (5GS) (3GPP TS 23.502 version 16.15.0 Release 16)" +- ETSI TS 124 501: "5G; Non-Access-Stratum (NAS) protocol for 5G System (5GS); Stage 3 (3GPP TS 24.501 version 16.12.0 Release 16)" +- ETSI TS 138 413: "5G; NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.12.0 Release 16)" -To make it easy for you to get started with GitLab, here's a list of recommended next steps. -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! +## Contact information -## Add your files +Email at `cti_support` at `etsi` dot `org`. -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: +## License + +Unless specified otherwise, the content of this repository and the files contained are released under the BSD-3-Clause license. +See the attached LICENSE file or visit https://forge.etsi.org/legal-matters. + +## STFs/TTFs + +The following STFs were or are currently involved in the evolutions of the ETSI 5GNGAP protocols project: +- TTF T033, TTF T048 + + +# Installation + +The NGAP/NAS Conformance Test System project builds and tests regularly on the following platforms: + + - Linux (Ubuntu) + - Windows ([Cygwin x64](https://cygwin.com/install.html), [Npcap SDK x64](https://nmap.org/npcap/#download) and [OpenSSL-Windows x64](https://www.openssl.org) are required) + +Note: The [OpenSSL](https://www.openssl.org) version >= 1.1.1 is also required. + +## How to do it? + +They are three different methods: +- Using [Vagrant](https://www.vagrantup.com/) +- Using [Docker](https://www.docker.com/) +- Using [Eclipse TITAN on Windows or Linux](https://projects.eclipse.org/projects/tools.titan/downloads) + +How to choose one of these methods is depending of your host system. + +NOTE: In all case, if you want to setup an continuous integration process (e.g. Jenkins), Docker is the best choice. + + +### The host system is Windows +The both methods require a virtual machine. You can use either VirtualBox or WMware. +In this case, the easiest way is to use Vagrant. + + +### The host system is Linux +Vagrant requires a virtual machine. You can use either VirtualBox or WMware. +Docker does not need a virtual machine, so it is the more efficant way. + +The following clauses describes four ways to build and deploy the CISE Test System: +- [Using TITAN compiler on a Docker image](#using-titan-compiler-on-a-docker-image) +- [Using development Docker image](#using-development-docker-image) +- [Using Vagrant](#using-vagrant) +- [From scratch](#from-scratch) + +## Using TITAN compiler on a Docker image + +In this configuration, TITAN compiler is located on a Docker image and the sources and the outputs are located on the host. + +Pre-requisites on your host machine: +- Install Docker + +Procedure on the host machine: +- Open a Terminal +- Clone the project + +```sh +$ git clone --recurse-submodules --remote-submodules https://forge.etsi.org/rep/int/5g-core/nas.git ``` -cd existing_repo -git remote add origin https://forge.etsi.org/rep/int/5g-core/nas.git -git branch -M main -git push -uf origin main + +- Select the branch you need: + + devel + +```sh +$ git checkout TTF_T048 ``` -## Integrate with your tools +- Execute the installation script to setup the correct environment: + +```sh +$ cd ./nas +& ./install.sh +``` -- [ ] [Set up project integrations](https://forge.etsi.org/rep/int/5g-core/nas/-/settings/integrations) +- From the NGAP/NAS Conformance Test System root directory, build the Docker image executing the following commands: -## Collaborate with your team +```sh +$ cd ./virtualization/docker +$ docker build --no-cache --tag alpine-nas -f Dockerfile --force-rm . +$ docker images +``` -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) +To build the NGAP/NAS Test Suite, execute the following command: -## Test and Deploy +```sh +$ ./docker-run.sh build +``` -Use the built-in continuous integration in GitLab. +Possble other options are 'clean' to remove all the build outputs or 'rebuild' to force a build of the Test Suite after a 'clean'. -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) +To retrieve the list of the available test cases, execute the following command: -*** +```sh +$ ./docker-run.sh list +``` -# Editing this README +Before to execute the NGAP/NAS Test Suite, prepare, edit and update the configuration file (e.g. AtsNGAP Test Suite): -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. +```sh +$ ln -sf ../../etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ ../../etc/AtsNGAP/AtsNGAP.cfg +$ vi ../../etc/AtsNGAP/AtsNGAP.cfg # To update it +``` -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. +To execute the NGAP/NAS Test Suite, execute the following command: -## Name -Choose a self-explaining name for your project. +```sh +$ ./docker-run.sh run +``` -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. +Notes: +- The NGAP/NAS Conformance Test System is listening on port 38412 +- Updating the file etc/AtsNGAP.cfg is about: +. Selecting the test(s) to be executed +. Updating value of PICs and PIXITs +. Updating HTTP port setting -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. +## Using development Docker image -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. +In this configuration, the TITAN compiler, the sources and the outputs are located on the Docker image. -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. +Pre-requisites on your host machine: +- Install Docker -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. +Procedure for a Windows host machine: +- On your host machine, open a the Docker Quickstart Terminal and change to a working folder such as ./temp/docker_its -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. +Procedure for a Linux host machine: +- On your host machine, open a terminal and change to a working folder such as $HOME/temp/docker_its -## Contributing -State if you are open to contributions and what your requirements are for accepting them. +On your host machine, download the following items from NGAP/NAS Conformance Test System project: +- The docker folder +- The .jenkins.sh script file (hidden file) and add the execution rights on it +- Check the rights of the script files and the folders -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. +From the your current directory, execute the following commands: -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. +```sh +$ ./.jenkins.sh +... +``` -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. +NOTE The creation and the installations will take some time to achieve +- Start the container -## License -For open source projects, say how it is licensed. +```sh +$ ./virtualization/docker/run-container.sh +... +``` + +- Switch to the next clause (Usage) + + +## Using Vagrant + +Pre-requisites on your host machine: +- Install [Virtualbox](https://www.virtualbox.org/manual/ch01.html) +- Install [Vagrant](https://www.vagrantup.com/intro/getting-started/) +- Install Vagrant plugin vagrant-vbguest +- Credentials to access [ETSI forge](https://forge.etsi.org/gitlab/users/sign_in) + - Set the environment variable USERNAME to your ETSI EOL account user name + - Set the environment variable PASSWORD to your ETSI EOL account password + +Procedure: +- On your host machine, open a command line session (PuTTY, DOS window...) +- From the NGAP/NAS Conformance Test System project, clone the Vagrant folder +- In the file Vagrantfile, modify the tag config.vm.provision replacing & strings by your ETSI credentials +- In the Vagrant folder (./virtualization/vagrant), execute the following commands: + +```sh +$ vagrant up --provider virtualbox --provision +... +``` + +NOTE The creation and the installations will take some time to achieve +- Stop vagrant virtual machine + +```sh +$ vagrant halt +... +``` + +- Update the file 'Vagrantfile' to match with your networks configuration +- Re-start the vagrant virtual machine and log to to the machine + +```sh +$ vagrant up +... +$ vagrant ssh +``` + +- Switch to the next clause (Usage) + +NOTE The user password is vagrant. + + +## From scratch + +Pre-requisites: +- Install Virtualbox + +Procedure: +- Install a new Linux Virtual machine (Mint, Debian...) +- Update your system with the latest version of kernel and security packages +- Install the following packages (According to the Linux chosen, the package naming can be different) + autoconf + bison + build-essential + cmake + curl + dos2unix + doxygen + emacs + expect + flex + g++:latest + gcc:latest + graphviz + gdb + git-core + gnutls-bin + libglib2.0-dev + libpcap-dev + libgcrypt-dev + libncurses5-dev + libjsoncpp-dev + libssl-dev + libtool-bin + libtool + libwireshark-dev + libxml2-dev + lsof + ntp + pkg-config + qt5-default + qtmultimedia5-dev + libqt5svg5-dev + subversion + sudo + sshpass + tcpdump + texlive-font-utils + tshark + valgrind + vim + vsftpd + xutils-dev + tree + tzdata + unzip + wget + xsltproc + +- Clone the NGAP/NAS Conformance Test System project into $HOME/dev folder + +```sh +$ git clone --branch=devel --recurse-submodules --remote-submodules https://forge.etsi.org/rep/int/5g-core/nas.git +``` + +- Execute the script install.sh + +```sh +$ ./install.sh +``` + +- Build a test suite (e.g. AtsNGAP) + +```sh +$ export ATS=AtsNGAP && make +``` + +- Switch to the next clause (Usage) + + +# Usage + +This clause describes how to compile and execute an Abstract Test Suite. +The procedures below illustrate how to run the AtsNGAP test suite. The same procedures will apply for any other NGAP/NAS Test Suite. + + +Pre-requisites: +- Your machine is installed following one of the installation method describes in the previous clause +- Your are logged as 'etsi' or 'vagrant' user +- Procedure using TITAN command line (only): + - Open several SSH session (PuTTY...) + - Change to the directory ~/dev/nas/ + - Modify the file config.mk according to your system: + - On Linux, comment all the lines using the '#' character + - On Windows, update the path accordingly + - Build the test suite AtsNGAP using the following command: + +```sh +$ export ATS=AtsNGAP # The Abstract Test Suite you want to build, such as AtsNGAP... +$ make +... +``` + +- Edit the file ../etc/AtsNGAP.cfg +- Update the following fields: + - system.mcaPort.params + - system.mcaPortIn.params + - system.utPort.params +- To run the test suitem, execute the following command: + +```sh +$ cd ~/dev/nas/scripts +$ ../run_all.bash +... +``` + +- The log files are located in ../logs/AtsNGAP folder for this example. You can edit them using any editor or using the Eclipse TITAN log plugins + +# Limitations + +The following limitations apply: +- AE test suite was not validated; +- CBOR is not supported; +- XML is not supported; +- Subscription/notification mechanism testing not implemented yet. + +# How to Report a Bug + +The NGAP/NAS Conformance Test System project is under constant development, so it is possible that you will +encounter a bug while using it. Please report bugs at cti_support at etsi dot org. -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. -- GitLab From 8a1d8ceb8e6d1d09e77342d848ee37187f038bdb Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 20 Mar 2026 07:44:55 +0100 Subject: [PATCH 060/151] Review README file --- README.md | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 1ada180..60587b2 100644 --- a/README.md +++ b/README.md @@ -109,20 +109,18 @@ $ ./docker-run.sh build Possble other options are 'clean' to remove all the build outputs or 'rebuild' to force a build of the Test Suite after a 'clean'. -To retrieve the list of the available test cases, execute the following command: - -```sh -$ ./docker-run.sh list -``` - Before to execute the NGAP/NAS Test Suite, prepare, edit and update the configuration file (e.g. AtsNGAP Test Suite): +- Update the following fields: + - system.NGAP_AMF.params + - system.N2_gNBaMF_P.params +- Update the PICS and PIXITs accordingly ```sh $ ln -sf ../../etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ ../../etc/AtsNGAP/AtsNGAP.cfg $ vi ../../etc/AtsNGAP/AtsNGAP.cfg # To update it ``` -To execute the NGAP/NAS Test Suite, execute the following command: +To run the NGAP/NAS Test Suite, execute the following command: ```sh $ ./docker-run.sh run @@ -316,12 +314,18 @@ $ make ... ``` -- Edit the file ../etc/AtsNGAP.cfg +Before to execute the NGAP/NAS Test Suite, prepare, edit and update the configuration file (e.g. AtsNGAP Test Suite): - Update the following fields: - - system.mcaPort.params - - system.mcaPortIn.params - - system.utPort.params -- To run the test suitem, execute the following command: + - system.NGAP_AMF.params + - system.N2_gNBaMF_P.params +- Update the PICS and PIXITs accordingly + +```sh +$ ln -sf ../../etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ ../../etc/AtsNGAP/AtsNGAP.cfg +$ vi ../../etc/AtsNGAP/AtsNGAP.cfg # To update it +``` + +To run the NGAP/NAS Test Suite, execute the following command: ```sh $ cd ~/dev/nas/scripts -- GitLab From 402ccc5590ac3481487d140b4dcfe5707f2626b7 Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 20 Mar 2026 08:48:02 +0100 Subject: [PATCH 061/151] Bug fixed in Lib_NG_NAS_Functions.ttcn; Remove duplicate PIXIT --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 23 +- etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ | 211 ++++++++++++++++++ titan-test-system-framework | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 2 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 34 ++- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 64 +++++- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 2 - .../lib_system/Lib_NG_NAS_Functions.ttcn | 2 +- 8 files changed, 316 insertions(+), 24 deletions(-) create mode 100644 etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index bb138de..e2b1bd4 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -1,25 +1,27 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. +# https://www.binaryhexconverter.com/hex-to-binary-converter + NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false -LibNGAP_Pics.PICS_OFFLINE_MODE := false +LibNGAP_Pics.PICS_OFFLINE_MODE := false # true for offline mode with pcap files, false for online mode with SCTP server -# 5GRegAuthSec_deReg.pcap -LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" -LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 2 LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O -LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B -LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B -LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "gnb0012345" LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" LibNGAP_Pixits.PX_TACode := '000001'O LibNGAP_Pixits.PX_SST := '01'O LibNGAP_Pixits.PX_SD := '000009'O LibNGAP_Pixits.PX_PAGING_DRX := v128 +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 2 LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 @@ -36,8 +38,6 @@ Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B -# https://www.binaryhexconverter.com/hex-to-binary-converter -Lib_NG_NAS_Pixits.PX_PLMN := '99f907'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 @@ -65,7 +65,8 @@ LogEventTypes:= Yes system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Open5GS pcap files -#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/ttcn_5g_ngap.pcapng)" # Linux cooked capture v2, no Ethernet layer +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" # regular pcap with Ethernet layer [DEFINE] # In this section you can create macro definitions, diff --git a/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ new file mode 100644 index 0000000..46bc83d --- /dev/null +++ b/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ @@ -0,0 +1,211 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +# https://www.binaryhexconverter.com/hex-to-binary-converter + +NGAP_Pics.PICS_NGAP_AMF_IUT := true +NGAP_Pics.PICS_NGAP_GNB_IUT := false + +LibNGAP_Pics.PICS_OFFLINE_MODE := true # true for offline mode with pcap files, false for online mode with SCTP server + +LibNGAP_Pixits.PX_PLMN_IDENTITY := '00F110'O # '99f907'O +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_GNB_ID := '0000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v32 #v128 +LibNGAP_Pixits.PX_AMF_NAME := "Kontron5G-amf" +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000001'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000010'B +LibNGAP_Pixits.PX_AMF_POINTER := '011111'B +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 4957 + +LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 + +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format +Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_MSIN := '0000000010'O; + +# OP +Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O +# OPc +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E88E6183CA'O +Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true + +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B +Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B + +Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 +Parameters.px_IMEISV_Def := '73806121856151f1'H +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/AtsNGAP/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +#ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. + +# Open5GS AMF IP and port as listener +#system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" + +# Open5GS pcap files +system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/ttcn_5g_ngap.pcapng)" # Linux cooked capture v2, no Ethernet layer +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" # regular pcap with Ethernet layer + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +# Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. +NGAP_TestCases.TC_NGAP_AMF_PDU_01 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_03 +# Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_04 +# Verify that the AMF node processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for not successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_AMF_PDU_05 + +# Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed +#NGAP_TestCases.TC_NGAP_AMF_CMP_01 +# Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID +#NGAP_TestCases.TC_NGAP_AMF_CMP_02 +# Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons +#NGAP_TestCases.TC_NGAP_AMF_CMP_03 +# Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs +###########################################NGAP_TestCases.TC_NGAP_AMF_CMP_04 +# Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_05 +# Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs +#NGAP_TestCases.TC_NGAP_AMF_CMP_06 +# Verify that the IUT can successfully request UE information from the AMF +#NGAP_TestCases.TC_NGAP_AMF_CMP_07 +# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_08 +# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension +#NGAP_TestCases.TC_NGAP_AMF_CMP_09 +# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_10 +# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context +#NGAP_TestCases.TC_NGAP_AMF_CMP_11 + + + +# Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER COMMAND with successfully handover. +#NGAP_TestCases.TC_NGAP_AMF_MMP_01 +# Verify that the AMF node successfully processes a HANDOVER REQUIRED message contains mandatory IEs and answers with HANDOVER PREPARATION FAILURE because the UE is not longer available. +#NGAP_TestCases.TC_NGAP_AMF_MMP_02 +# Verify that the AMF node successfully sends a HANDOVER REQUEST message that contains mandatory IEs to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_MMP_03 +# Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and answers with PATH SWITCH REQUEST ACKNOWLEDGE to acknowledge the path switch. +#NGAP_TestCases.TC_NGAP_AMF_MMP_04 +# Verify that the AMF node successfully processes a PATH SWITCH REQUEST message that contains mandatory IEs and two PDU Sessions with same ID and answers with PATH SWITCH REQUEST FAILURE. +#NGAP_TestCases.TC_NGAP_AMF_MMP_05 +# Verify that the AMF node successfully processes a HANDOVER CANCEL message that contains mandatory IEs and answers with HANDOVER CANCEL ACKNOWLEDGE to confirm that the ongoing handover was cancelled. +#NGAP_TestCases.TC_NGAP_AMF_MMP_06 +# Verify that the AMF node successfully sends a DOWNLINK RAN STATUS TRANSFER message that contains mandatory IEs. +#NGAP_TestCases.TC_NGAP_AMF_MMP_07 +# Verify that the NG-RAN node successfully sends a Handover Success message to the AMF. +#NGAP_TestCases.TC_NGAP_AMF_MMP_08 +# Verify that the AMF node successfully sends a DOWNLINK RAN EARLY STATUS TRANSFER message that contains mandatory IEs. +#NGAP_TestCases.TC_NGAP_AMF_MMP_09 + +# Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. +#NGAP_TestCases.TC_NGAP_AMF_NAS_01 +# Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF. +#NGAP_TestCases.TC_NGAP_AMF_NAS_02 + +# Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_01 +# Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_02 +# Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_03 +# Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_04 +# Verify that the AMF node successfully processes a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update. +#NGAP_TestCases.TC_NGAP_AMF_IMP_05 +# Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request. +#NGAP_TestCases.TC_NGAP_AMF_IMP_06 +# Verify that the IUT can send a AMF CONFIGURATION UPDATE message to the AMF. +#NGAP_TestCases.TC_NGAP_AMF_IMP_07 +# Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset. +#NGAP_TestCases.TC_NGAP_AMF_IMP_08 +# Verify that the AMF can send a ERROR INDICATION to the GNB when a error occurs. +#NGAP_TestCases.TC_NGAP_AMF_IMP_09 +# Verify that the AMF can send a AMF STATUS INDICATION to the GNB when a error occurs. +#NGAP_TestCases.TC_NGAP_AMF_IMP_10 +# Verify that the AMF can send a OVERLOAD START to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_IMP_11 +# Verify that the AMF can send a OVERLOAD STOP to the GNB. +#NGAP_TestCases.TC_NGAP_AMF_IMP_12 + +# Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_AMF_WTP_01 +#Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_AMF_WTP_02 + +# Verify that the IUT can send a TRACE_START to initiate a trace session for a UE. +#NGAP_TestCases.TC_NGAP_AMF_TRP_01 +# Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE. +#NGAP_TestCases.TC_NGAP_AMF_TRP_02 + +# Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure. +#NGAP_TestCases.TC_NGAP_AMF_UBP_01 +# Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping. +#NGAP_TestCases.TC_NGAP_AMF_URP_02 + +# Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER. +#NGAP_TestCases.TC_NGAP_AMF_RIP_01 + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 diff --git a/titan-test-system-framework b/titan-test-system-framework index 3f542e0..c668fdd 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit 3f542e05e054a605c110d0b0b62908057c7203b2 +Subproject commit c668fdde6b04942cb7ce43b5fd379105174c1828 diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index d5cc9f4..ca3dbea 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -183,7 +183,7 @@ module NGAP_Steps { function f_NGAP_amf_UE_Register() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_Register"); if (PICS_OFFLINE_MODE) { - f_send_NGSetupRequest_await_NGSetupResponse(); + f_await_NGSetupRequest_await_NGSetupResponse(); } else { f_send_NGSetupRequest_await_NGSetupResponse(); } diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index aca96d9..ff8c333 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -5447,7 +5447,7 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_initialUeMessage_base_nas:= { procedureCode := id_InitialUEMessage, - criticality := ?, + criticality := reject, value_ := { InitialUEMessage := { protocolIEs := {*, @@ -5470,7 +5470,7 @@ module LibNGAP_Templates { template (present) UEContextRequest p_uEContextRequest := ? ) := { procedureCode := id_InitialUEMessage, - criticality := ignore, + criticality := reject, value_ := { InitialUEMessage := { protocolIEs := { @@ -6064,6 +6064,36 @@ module LibNGAP_Templates { } } // End of template mw_n2_NGSetupRequest + template (present) InitiatingMessage mw_n2_NGSetupRequest_noRANNodeName( + template (present) GlobalRANNodeID p_globalRANNodeID := ?, + template (present) SupportedTAList p_supportedTAs := ?, + template (present) PagingDRX p_pagingDRX := ? + ) := { + procedureCode := id_NGSetup, + criticality := reject, + value_ := { + NGSetupRequest := { + protocolIEs := { + { + id := id_GlobalRANNodeID, + criticality := reject, + value_ := { GlobalRANNodeID := p_globalRANNodeID } + }, + { + id := id_SupportedTAList, + criticality := reject, + value_ := { SupportedTAList := p_supportedTAs } + }, + { + id := id_DefaultPagingDRX, + criticality := ignore, + value_ := { PagingDRX := p_pagingDRX } + } + } + } + } + } // End of template mw_n2_NGSetupRequest + } // End of group Receive } // End of group NG_SETUP_REQUEST diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index bde3075..5bdfe88 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -100,8 +100,7 @@ module LibNGAP_Functions { m_sliceSupportItem( m_s_NSSAI( PX_SST, - PX_SD,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + PX_SD ), -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit ) @@ -186,6 +185,60 @@ module LibNGAP_Functions { ))); } + /** + * @desc Function to await NGSetupRequest message and await for NGSetupResponse message + */ + function f_await_NGSetupRequest_await_NGSetupResponse() runs on NGNASComponent { + // Send NGSetupRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_NGSetupRequest_noRANNodeName( + mw_globalRANNodeID_globalGNB_ID( + mw_ie_globalGnbId( + PX_PLMN_IDENTITY, + PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + )), + { + mw_supportedTAItem( + PX_TACode, + { + mw_ie_broadcastPLMNItem( + PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + { + mw_sliceSupportItem( + mw_s_NSSAI( + PX_SST, + PX_SD,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + }, + PX_PAGING_DRX + ))); + + // Await NGSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + PX_PLMN_IDENTITY + )), + * + } + ))); + } + /** * @desc Function to send NAS RegistrationRequest message */ @@ -194,7 +247,7 @@ module LibNGAP_Functions { // Send REGISTRATION_REQUEST var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -242,8 +295,7 @@ module LibNGAP_Functions { log("Received NG_REGISTRATION_REQUEST NAS message"); // Extract RAN_UE_NGAP_ID - vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.rAN_UE_NGAP_ID; - log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.initialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; } else { log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); @@ -436,7 +488,7 @@ module LibNGAP_Functions { // Prepare response for SECURITY_MODE_COMPLETE // 1. Registration Request message with no var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn index 9b70630..b422ca1 100755 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn @@ -44,8 +44,6 @@ module Lib_NG_NAS_Pixits { */ modulepar B128_Type PX_SUBSCRIPTION_KEY := oct2bit('00000000000000000000000000000000'O); - modulepar NAS_PlmnId PX_PLMN := '000000'O; - modulepar B5_Type PX_BEARER_ID := '11010'B; } // End of module Lib_NG_NAS_Pixits \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index 556b99c..1069d50 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -36,7 +36,7 @@ module Lib_NG_NAS_Functions { */ function f_send_NasRegistrationRequest() runs on NGNASComponent { var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier -- GitLab From 1475307d2cb44fc5bdb53eddbaa9c1c00fe38bc9 Mon Sep 17 00:00:00 2001 From: pintar Date: Fri, 20 Mar 2026 16:22:05 +0100 Subject: [PATCH 062/151] TP_5GNAS_AMF_CNF_COM_01 added --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 54 +++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 83c9732..d6a5413 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -461,6 +461,57 @@ Package TP_AMF { } // end Group Security mode control procedure + + Group "5.4.4 Generic UE configuration update procedure" + { + import all from Ngnas_Common; + + Test Purpose { + TP Id TP_5GNAS_AMF_CNF_COM_01 + + Test objective "Verify that the IUT initiates the generic UE configuration update procedure by sending a CONFIGURATION_UPDATE_COMMAND message including only NITZ-related information elements, and either does not include the Configuration update indication IE or includes it with the Acknowledgement requested bit set to '0'." + + Reference + "ETSI TS 124 501 [1], Clauses 5.4.4.2 and 8.2.19" + + Config Id CF_AMF_N2N1 + + PICS Selection PICS_A4/4_1 + + Initial conditions with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to CONFIGURATION_UPDATE_COMMAND, + Network_name indicating value RV_NETWORK_NAME, + Full_name_for_network indicating value RV_FULL_NAME_FOR_NETWORK, + Short_name_for_network indicating value RV_SHORT_NAME_FOR_NETWORK, + Local_time_zone indicating value RV_LOCAL_TIME_ZONE, + Universal_time_and_local_time_zone indicating value RV_UTC_TIME_ZONE, + Daylight_saving_time indicating value RV_DAYLIGHT_SAVING_TIME, + not Configuration_update_indication OR + Configuration_update_indication containing + Acknowledgement_requested set to 0 + ;;; + to the GNB entity + } + then { + the IUT entity does not receive an UPLINK_NAS_TRANSPORT containing + NAS_PDU containing + message_type set to CONFIGURATION_UPDATE_COMPLETE;; + from the GNB entity + } + } + } // end TP_5GNAS_AMF_CNF_COM_01 + + }//end group Generic UE configuration update procedure Group "5.4.5 NAS transport procedure" { @@ -1210,8 +1261,11 @@ Package TP_AMF { } } }// end TP_5GNAS_AMF_DRG_REQ_03 + } //end Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" + + } // End of Package TP_AMF -- GitLab From a7fd112f594f8afc71bebec85d846fcb5d0c3914 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Mon, 23 Mar 2026 08:05:32 +0000 Subject: [PATCH 063/151] Minor update related IE and example hint --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index b22860a..0cc1f52 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -470,6 +470,8 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_CNF_COM_01 Test objective "Verify that the IUT initiates the generic UE configuration update procedure by sending a CONFIGURATION_UPDATE_COMMAND message including only NITZ-related information elements, and either does not include the Configuration update indication IE or includes it with the Acknowledgement requested bit set to '0'." + // Example trigger observed in implementation: CONFIGURATION_UPDATE_COMMAND sent after PDU_SESSION_ESTABLISHMENT_REQUEST; + // note that the base specification does not explicitly define when the CONFIGURATION_UPDATE_COMMAND shall be sent. Reference "ETSI TS 124 501 [1], Clauses 5.4.4.2 and 8.2.19" @@ -490,7 +492,6 @@ Package TP_AMF { extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to CONFIGURATION_UPDATE_COMMAND, - Network_name indicating value RV_NETWORK_NAME, Full_name_for_network indicating value RV_FULL_NAME_FOR_NETWORK, Short_name_for_network indicating value RV_SHORT_NAME_FOR_NETWORK, Local_time_zone indicating value RV_LOCAL_TIME_ZONE, -- GitLab From d848b373b610d0c91277bca1c6e2c37fb6439802 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 23 Mar 2026 15:03:03 +0100 Subject: [PATCH 064/151] Rework TC_NGAP_AMF_PDU_01 --- ccsrc/Externals/ia2_128.cc | 48 ++++----- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 1 + titan-test-system-framework | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 12 ++- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 3 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 101 ++++++++++++++---- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 5 + .../lib/Lib_NG_NAS_Security_Functions.ttcn | 2 + ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 17 +++ 9 files changed, 142 insertions(+), 49 deletions(-) diff --git a/ccsrc/Externals/ia2_128.cc b/ccsrc/Externals/ia2_128.cc index 49e9406..245c42b 100644 --- a/ccsrc/Externals/ia2_128.cc +++ b/ccsrc/Externals/ia2_128.cc @@ -23,14 +23,14 @@ namespace { } int ia2_128::encrypt(const uint8_t algo_id, - const unsigned char* knas_enc, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** cyphered, - uint32_t* cyphered_length) { + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** cyphered, + uint32_t* cyphered_length) { loggers::get_instance().log(">>> ia2_128::encrypt: Starting encryption"); loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: knas_enc", knas_enc, 16); loggers::get_instance().log_to_hexa(">>> ia2_128::encrypt: payload", payload, payload_length); @@ -115,14 +115,14 @@ cleanup: } int ia2_128::decrypt(const uint8_t algo_id, - const unsigned char* knas_enc, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* cyphered, - const uint32_t cyphered_length, - unsigned char** payload, - uint32_t* payload_length) { + const unsigned char* knas_enc, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* cyphered, + const uint32_t cyphered_length, + unsigned char** payload, + uint32_t* payload_length) { loggers::get_instance().log(">>> ia2_128::decrypt: Starting decryption"); loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: knas_enc", knas_enc, 16); loggers::get_instance().log_to_hexa(">>> ia2_128::decrypt: cyphered", cyphered, cyphered_length); @@ -207,14 +207,14 @@ cleanup: } int ia2_128::mac(const uint8_t algo_id, - const unsigned char* knas_int, - const uint32_t count, - const uint8_t bearer, - const uint8_t direction, - const unsigned char* payload, - const uint32_t payload_length, - unsigned char** mac, - uint32_t* mac_length) { + const unsigned char* knas_int, + const uint32_t count, + const uint8_t bearer, + const uint8_t direction, + const unsigned char* payload, + const uint32_t payload_length, + unsigned char** mac, + uint32_t* mac_length) { loggers::get_instance().log_to_hexa(">>> ia2_128::mac: knas_int", knas_int, KEY_SIZE); loggers::get_instance().log(">>> ia2_128::mac: payload_length: %d", payload_length); loggers::get_instance().log_to_hexa(">>> ia2_128::mac: payload", payload, payload_length); diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index e2b1bd4..bca4b48 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -30,6 +30,7 @@ Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O Lib_NG_NAS_Pixits.PX_MSIN := '0000000010'O; +Lib_NG_NAS_Pixits.PX_NETWORK_NAME := "Open5GS" # OP Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O diff --git a/titan-test-system-framework b/titan-test-system-framework index c668fdd..b7ef8f8 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit c668fdde6b04942cb7ce43b5fd379105174c1828 +Subproject commit b7ef8f8a661c237a8c79b1a58fa16e99cca17175 diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index ca3dbea..d1e5264 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -268,7 +268,7 @@ module NGAP_Steps { function f_NGAP_amf_UE_PDU_SessionEstablishmentRequest() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_PDU_SessionEstablishmentRequest"); if (PICS_OFFLINE_MODE) { - f_await_session_establishment_request(); + f_await_pdu_session_establishment_request(); } else { f_send_pdu_session_establishment_request(); } @@ -282,6 +282,14 @@ module NGAP_Steps { f_await_session_establishment_accept(); } // End of function f_NGAP_amf_UE_PDU_SessionEstablishmentAccept + /** + * @desc + */ + function f_NGAP_amf_ConfigurationUpdateCommand() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_ConfigurationUpdateCommand"); + f_await_configuration_update_command(); + } // End of function f_NGAP_amf_ConfigurationUpdateCommand + /** * @desc */ @@ -522,7 +530,7 @@ module NGAP_Steps { */ function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest"); - f_await_session_establishment_request(); + f_await_pdu_session_establishment_request(); } // End of function f_NGAP_gnb_UE_PDU_SessionEstablishmentRequest /** diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 4bb4908..6b63241 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4043,7 +4043,8 @@ module NGAP_TCFunctions { // Body //action("Trigger PDU session resource SETUP!"); - f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request + f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command f_recv_NGAP_PDU( mw_ngap_initMsg( diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 5bdfe88..7be67fc 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -99,8 +99,8 @@ module LibNGAP_Functions { { m_sliceSupportItem( m_s_NSSAI( - PX_SST, - PX_SD + PX_SST/*, + PX_SD*/ ), -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit ) @@ -518,10 +518,10 @@ module LibNGAP_Functions { log("px_IMEISV_Def: ", px_IMEISV_Def); log("f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def): ", f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def)); var NG_NAS_UL_Message_Type ng_security_mode_complete := valueof( - m_NG_SECURITY_MODE_COMPLETE_no_NonIMEISV_PEI( - f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def), //in template (value) NG_MobileIdentity p_IMEISV, - { iei := '71'O, iel := int2oct(lengthof(v_msg), 2), replayedNASMsgContainerValue := v_msg } - )); + m_NG_SECURITY_MODE_COMPLETE_no_NonIMEISV_PEI( + f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def), //in template (value) NG_MobileIdentity p_IMEISV, + { iei := '71'O, iel := int2oct(lengthof(v_msg), 2), replayedNASMsgContainerValue := v_msg } + )); ng_security_mode_complete.security_Mode_Complete.nasMsg := { iei := '71'O, iel := int2oct(lengthof(v_msg), 2), replayedNASMsgContainerValue := v_msg }; log("ng_security_mode_complete: ", ng_security_mode_complete); @@ -872,15 +872,15 @@ module LibNGAP_Functions { log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); f_send_NGAP_PDU( m_ngap_initMsg( - m_n2_initialUeMessage( - -, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - )) - ))); + m_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); } /** @@ -892,8 +892,10 @@ module LibNGAP_Functions { // Await request for REGISTRATION_COMPLETE f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_initialUeMessage - )); + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); f_NASPDU_Get(vc_recvNGAP_PDU) if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_COMPLETE)) { log("Received NG_REGISTRATION_COMPLETE NAS message"); @@ -915,8 +917,15 @@ module LibNGAP_Functions { crs_SSC_Mode('9'H, '001'B), m_ng_ue_sm_cap, -, - m_integrity_prot_max_data_rate - )); + m_integrity_prot_max_data_rate, + -, -, + f_NAS_ExtdProtocolConfigOptionsTX( + { + cs_ProtocolContainer_Common('000a'O), + cs_ProtocolContainer_Common('000d'O) + } + + ))); v_ng_pdu_session_establishment_request.pdu_Session_Establishment_Request.protocolDiscriminator := tsc_EPD_GSM; // 2. Prepare UL NAS Transport message log("v_ng_pdu_session_establishment_request: ", v_ng_pdu_session_establishment_request); @@ -970,8 +979,8 @@ module LibNGAP_Functions { ))))); } - function f_await_session_establishment_request() runs on NGNASComponent { - log(">>> f_await_session_establishment_request"); + function f_await_pdu_session_establishment_request() runs on NGNASComponent { + log(">>> f_await_pdu_session_establishment_request"); // Await PDUSessionEstablishmentRequest f_recv_NGAP_PDU( @@ -1233,6 +1242,45 @@ module LibNGAP_Functions { // ))); // } + function f_await_configuration_update_command() runs on NGNASComponent { + log(">>> f_await_configuration_update_command"); + + // Await ConfigurationUpdateCommand + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_CONFIGURATION_UPDATE_COMMAND( + -, -, -, -, -, + mw_network_name( + -, -, -, -, -, + -//unichar2oct(oct2unichar(char2oct(PX_NETWORK_NAME))) + ), + -, + cs_TimeZone('40'O), + ?, // TimeZoneAndTime + ? // DaylightSavingTime + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, v_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_CONFIGURATION_UPDATE_COMMAND mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_CONFIGURATION_UPDATE_COMMAND ***"); + setverdict(pass); + } + log("v_message: ", v_message); + + log("<<< f_await_configuration_update_command"); + } + function f_await_initial_context_setup_failure() runs on NGNASComponent { log(">>> f_send_initial_context_setup_failure"); @@ -1517,6 +1565,17 @@ module LibNGAP_Functions { p_nas_count, p_bearerId); } + if ( + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) + ) { + log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); + v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, + p_nas_count, + p_bearerId); + } // Apply integrity protection log("f_EncodeAndCipher_NG_NasPdu_v: Apply integrity protection"); diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn index b422ca1..5eecbc0 100755 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn @@ -46,4 +46,9 @@ module Lib_NG_NAS_Pixits { modulepar B5_Type PX_BEARER_ID := '11010'B; + /** + * @desc Network Name + */ + modulepar charstring PX_NETWORK_NAME := ""; + } // End of module Lib_NG_NAS_Pixits \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 609dabf..3cb0b47 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -166,6 +166,7 @@ module Lib_NG_NAS_Security_Functions { } else { log("f_Check_5GAKA_NAS_DL_Message: Message is not security protected"); } + log("f_Check_5GAKA_NAS_DL_Message: p_NG_NAS_DL_Message_Type: ", p_NG_NAS_DL_Message_Type); if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { log(match(v_message, p_NG_NAS_DL_Message_Type)); return false; @@ -276,6 +277,7 @@ module Lib_NG_NAS_Security_Functions { return false; } } + log("f_Check_5GAKA_NAS_UL_Message: p_NG_NAS_UL_Message_Type: ", p_NG_NAS_UL_Message_Type); if (not(match(v_message, p_NG_NAS_UL_Message_Type))) { log(match(v_message, p_NG_NAS_UL_Message_Type)); return false; diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 363e8b0..e5109b3 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -2380,4 +2380,21 @@ module Lib_NG_NAS_Templates { maxDataRateDL := p_maxDataRateDL } // End of template m_integrity_prot_max_data_rate + template (present) NetworkName mw_network_name( + template (present) IEI8_Type p_iei := '43'O, + template (present) Type4Length_Type p_iel := ?, + template (present) B1_Type p_ext := '1'B, + template (present) B3_Type p_codingScheme := '001'B, + template (present) B1_Type p_addCI := '0'B, + template (present) octetstring p_text := ? + ) := { + iei := p_iei, + iel := p_iel, + ext := p_ext, + codingScheme := p_codingScheme, + addCI := p_addCI, + spareBitCnt := ?, + text := p_text + } + } // End of module Lib_NG_NAS_Templates \ No newline at end of file -- GitLab From 5d7c68280024b7879cdef110607281c155465e84 Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 24 Mar 2026 09:27:56 +0100 Subject: [PATCH 065/151] modified with permutation --- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index ff8c333..1c1820b 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -5447,7 +5447,7 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_initialUeMessage_base_nas:= { procedureCode := id_InitialUEMessage, - criticality := reject, + criticality := ignore, value_ := { InitialUEMessage := { protocolIEs := {*, @@ -5470,10 +5470,10 @@ module LibNGAP_Templates { template (present) UEContextRequest p_uEContextRequest := ? ) := { procedureCode := id_InitialUEMessage, - criticality := reject, + criticality := ignore, value_ := { InitialUEMessage := { - protocolIEs := { + protocolIEs := {permutation( { id := id_RAN_UE_NGAP_ID, criticality := reject, @@ -5498,7 +5498,7 @@ module LibNGAP_Templates { id := id_UEContextRequest, criticality := ignore, value_ := { UEContextRequest := p_uEContextRequest } - } + },*) } } } @@ -5557,14 +5557,14 @@ module LibNGAP_Templates { criticality := ?, value_ := { DownlinkNASTransport := { - protocolIEs := { + protocolIEs := {permutation( *, { id := id_NAS_PDU, criticality := ?, value_ := { NAS_PDU := ? } }, - * + *) } } } @@ -5579,7 +5579,7 @@ module LibNGAP_Templates { criticality := ignore, value_ := { DownlinkNASTransport := { - protocolIEs := { + protocolIEs := {permutation( { id := id_AMF_UE_NGAP_ID, criticality := reject, @@ -5594,7 +5594,7 @@ module LibNGAP_Templates { id := id_NAS_PDU, criticality := reject, value_ := { NAS_PDU := p_nasPdu } - } + }) } } } @@ -6073,7 +6073,7 @@ module LibNGAP_Templates { criticality := reject, value_ := { NGSetupRequest := { - protocolIEs := { + protocolIEs := {permutation( { id := id_GlobalRANNodeID, criticality := reject, @@ -6088,7 +6088,8 @@ module LibNGAP_Templates { id := id_DefaultPagingDRX, criticality := ignore, value_ := { PagingDRX := p_pagingDRX } - } + }, + *) } } } -- GitLab From 6ceb2770a6991e81fd5aac18351371ffa0fb3ea8 Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 24 Mar 2026 09:28:36 +0100 Subject: [PATCH 066/151] valiadtion checks --- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 7be67fc..5182164 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -215,7 +215,8 @@ module LibNGAP_Functions { -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit ) } - ) + ), + * },//in template (value) BroadcastPLMNList p_broadcastPLMNList, -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit ) -- GitLab From ab0c2fc5bdb5cb4c78a6318adbf868d8c62f0be8 Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 24 Mar 2026 09:29:17 +0100 Subject: [PATCH 067/151] valiadtion checks --- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn | 1 + 1 file changed, 1 insertion(+) diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 3cb0b47..63f196d 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -91,6 +91,7 @@ module Lib_NG_NAS_Security_Functions { } else if (v_message.security_Protected_Nas_Message.securityHeaderType == tsc_SHT_IntegrityProtected_NewSecurityContext) { // Integrity & new context var NG_SECURITY_MODE_COMMAND v_ng_security_mode_command; var bitstring v_bs1 := oct2bit(v_message.security_Protected_Nas_Message.plainNASMessage); + log(v_message.security_Protected_Nas_Message.plainNASMessage); if (decvalue(v_bs1, v_ng_security_mode_command) != 0) { log("f_Check_5GAKA_NAS_DL_Message: decvalue failure for NG_SECURITY_MODE_COMMAND"); return false; -- GitLab From 283f489b286640bb697b129d00b840b10dbaad27 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 24 Mar 2026 16:01:58 +0100 Subject: [PATCH 068/151] Major bu fixed in sequence number calculation --- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 6 +++--- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 6b63241..e5ac946 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4049,8 +4049,8 @@ module NGAP_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_PDUSessionResourceSetupRequest( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + vc_AMF_UE_ID, + vc_RAN_UE_ID/*, { mw_pDUSessionResourceSetupItemSUReq( PX_PDU_SESSION_ID, @@ -4063,7 +4063,7 @@ module NGAP_TCFunctions { -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit ) - }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + }*///in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 5182164..8bfe831 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -485,6 +485,8 @@ module LibNGAP_Functions { f_5g_security_context(v_message.security_Mode_Command, vc_ng_nas_security_params_type); vc_previous_nas_count_ul := f_NasCountInit(); vc_previous_nas_count_dl := f_NasCountInit(); + log("f_await_security_mode_command_send_security_mode_complete: vc_previous_nas_count_ul: ", vc_previous_nas_count_ul); + log("f_await_security_mode_command_send_security_mode_complete: vc_previous_nas_count_dl: ", vc_previous_nas_count_dl); // Prepare response for SECURITY_MODE_COMPLETE // 1. Registration Request message with no @@ -1269,7 +1271,8 @@ module LibNGAP_Functions { ? // DaylightSavingTime ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, v_message + vc_previous_nas_count_dl, + v_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_CONFIGURATION_UPDATE_COMMAND mismatch. ***"); setverdict(fail); @@ -1591,7 +1594,6 @@ module LibNGAP_Functions { p_bearerId, p_direction); log("f_EncodeAndCipher_NG_NasPdu_v: v_calculated_mac: ", v_calculated_mac); - p_nas_count := v_calculated_mac; // Security protected NAS message var NG_NAS_DL_Message_Type v := valueof( @@ -1604,7 +1606,6 @@ module LibNGAP_Functions { p_ng_security_protected_nas_message := v.security_Protected_Nas_Message; v_EncodedNasPdu := bit2oct(encvalue(p_ng_security_protected_nas_message)); - log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_ng_security_protected_nas_message: ", p_ng_security_protected_nas_message); log("<<< f_EncodeAndCipher_NG_NasPdu_v: ", v_EncodedNasPdu); return v_EncodedNasPdu; -- GitLab From ae0715cd27e001bd5cd03df07836e27b360258c0 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 26 Mar 2026 08:08:27 +0100 Subject: [PATCH 069/151] Finalyse TC_NGAP_AMF_PDU_01 --- captures/TC_NGAP_AMF_PDU_01.pcap | Bin 0 -> 4068 bytes ttcn/AtsNGAP/NGAP_Steps.ttcn | 9 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 55 ++++++++++- .../lib/LibNGAP_EncdecDeclarations.ttcn | 6 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 14 ++- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 92 +++++++++++------- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 3 + ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 7 +- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 57 +++++++++++ 9 files changed, 196 insertions(+), 47 deletions(-) create mode 100644 captures/TC_NGAP_AMF_PDU_01.pcap diff --git a/captures/TC_NGAP_AMF_PDU_01.pcap b/captures/TC_NGAP_AMF_PDU_01.pcap new file mode 100644 index 0000000000000000000000000000000000000000..870ef117504ec28e1c5d953d7ea115d184af838b GIT binary patch literal 4068 zcmca|c+)~A1{MYcU}0cnU|`sP>qw@^Z%&3F1_m%j$TKi-Ft{=?xG*p{FgUc>sMj+v zu+%d!aK5eMmw~BbWMELq*v0;tfpGx?gWUiBu7x6T3_J{M46F%gWmFfgz&Ft8lCbtKboCL2Q*0|OX?biy#$ zgczs^V)YCRjP(o*tovq8_)Et|8MU)Je7f!fdix#L?2keC<>yv zbQu`Y-43!jWhNU#5F-N^!^{NHAe$MXp<}HFvK3_FG@gAk!L~6lFfcJNs<`gaSqQdS zj)5zk*)4*Bosr}C9ShlZ?n3`fX?ffCg|e7D&)qc}WFj(NsI$j)d+^S3nAi`osX9?X z3nb(ixELbbnA4dU_RR#@2a`vpd8UD4mVu#xi9sdZR>5SGwYr#uYS)^a*|zm-R_WTj ze=t=u%Ol`>(xUb5$olZHDG5bv=E713D1`H8vN4!3GJr9%T5t$!FffABpS35*x1dl4 z#Vt5g85kJ27)C=A6k?!Ite?pS&R?K>1`>l|P$)9M@|Yhe1VJH*oKCr+c`SJz-aN(x ziU%7JkZzDE$nn6y%wPr1S1?OO8PpgUm>HxQI2mUCWDj6qU|?iOW8eizGlE1IK&6YQ z1ET{21IX>g^Vk^d7#P49qy~n;Za1*q1+w{HJIGd$?Z|FtW?&Ei+srus8b}w&G~ShL z3}p-qUWMgP!U;tx~7z~5`RKdUkGR^uMHq#iG8NzPwIy?;=2Ow?y3{DITtPG)`@`*u> zK|;Ka!LgEomvQD#c91j(3+OR@_`p!f!0#~gC%ceIfRF)Ll93_Gfl-2?zyVagfLvw1 zhmBzp0|OX?^uaLLRV}uAK(6{{2=X7uWmw{E8n|o(X=7#xN@sS91XoH73^oib4tAgv z#07RG%&pp5bqrw)ObiT)e#BWJHs{x1~7)X0z`vdvVwsPGALt7jslDfdMqD4eE6Wx#K;)T$bcm{!M^BH zVP|;8zyQV|t6>=IiyOB4K)(2U8{`9!Pq2jN3?yGHO=otCW?%#*HwGI9K8A(~ph62d zx@8#HL3tij27qgOhH?f@83sP6t#J$rJi7Hq;_mJFI(ftV5M?E^CEYHTOKmQR%Jfbv zx!LhP)P+IGfupz~QL**^|Bno64*Gg^Ow6FDe?>an-0aT!Y z^yoPlf}D;VNoow-Ty;$5oNuET>lmD|r5tcd&AYwpFsK#A1~P_0&mjua924U@rj{6K zE2cVzbVdeIJx0cZ|Nl>1sKLlk&A{Hkz{SA8%OJ$qsKm&q%E^(LSCU$kms*0=LXfW) z_;Z0vB~a-Ewi8N#ecfPt0OV`DW#?>I7&0(31f(;&#V{~3Ff%~PP8(3>Lk$H@jXI`D zn>9L^>KH=GZZkSGUPFsGPpAYyE(Wg86*`1usC=!f^(ASIWC4z3=Cilbr_fe zyY7kYL6GbIo&m)NC|;0bn1Pw$a5}SFECVCByJ5p1%h0e6Jutl(8hRKU7{ltAHr9l< zGuJU>FfzF7F)|(!WZ-0EU^6siWc<&_#{5Nv`HPAsD(2ZaK1s)W|xu?&p!eL;Z+GR=mcn<0&X z0gORnFbodQ2nH^&X#&_xV_;^mxV`J}90st{!Ff^z9J}D$2+5P)4uT8}jJyoY4;>gp zJYRCpNMKL^*;=j3hcBNV0@?bn9^`(I&B(C`@&njbP|uD5QkSmPxo3OZfE>gZwNoRJ8V_*dJM;UAwG#LayrCAXJs71%f0JBje zm=D}m1hpAqwt;A{jTsC)ARDd!foucWitH~?C_!vk0MY>R5-6_bF)%Q2f&>&aK`n1) qls1Al1NOK|iREK3V_*PdkX{%DyF!D37vu^XTWqdi1Jz4B3@iXeAOKVV literal 0 HcmV?d00001 diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index d1e5264..cbe3309 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -130,8 +130,13 @@ module NGAP_Steps { /** * @desc */ - function f_postamble_NGAP_AMF() runs on aMFNGAPComponent { - f_postambleNGAP_AMF(); + function f_postamble_NGAP_AMF( + in template (value) Cause p_Cause := m_cause_nas(authentication_failure) + ) runs on aMFNGAPComponent { + + if (not(PICS_OFFLINE_MODE)) { + f_postambleNGAP_AMF(p_Cause); + } // Deactivate defaults deactivate; diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index e5ac946..2b87064 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -17,6 +17,7 @@ module NGAP_TCFunctions { import from LibCommon_Time all; // NG_NAS + import from NG_NAS_TypeDefs all; import from NG_NAS_MsgContainers all; // LibNGAP @@ -3976,8 +3977,8 @@ module NGAP_TCFunctions { group Uplink_RIM_Information_Transfer{ /** - * @desc Testcase function for TC_NGAP_gNB_RIP_01 - */ + * @desc Testcase function for TC_NGAP_gNB_RIP_01 + */ function f_TC_NGAP_GNB_RIP_01() runs on gNBNGAPComponent { // Local variables @@ -4065,10 +4066,60 @@ module NGAP_TCFunctions { ) }*///in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); + var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) + log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, " ***"); + for (var integer i :=0 ; i < numOfIEs; i := i + 1) { // Loop over the protocolIEs found + if ((vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].id) == 74 /*id_NAS_PDU*/) { + var integer numOfItems := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq) + log("*** " & __SCOPE__ & ": DBG: Number of items in pDUSessionResourceSetupListSUReq: ", numOfItems); + if (numOfItems > 0) { + vc_pdu_session_resource_setup_list_su_req := vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq; + for (var integer j :=0; j < numOfItems; j := j + 1) { // Loop over the PDUSessionResourceSetupListSUReq items + log("*** " & __SCOPE__ & ": DBG: pDUSessionNAS_PDU of item ", j, ": ", vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU, + mw_NG_DL_NAS_TRANSPORT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); + var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); + var NG_PDU_SESSION_ESTABLISHMENT_ACCEPT v_ng_pdu_session_establishment_accept; + if (decvalue(v_bs, v_ng_pdu_session_establishment_accept) != 0) { + log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); + setverdict(inconc); + } else { + log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_establishment_accept: ", v_ng_pdu_session_establishment_accept); + var NG_NAS_DL_Message_Type v_expected_message; + v_expected_message.pdu_Session_Establishment_Accept := v_ng_pdu_session_establishment_accept; + if (not(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI))) { + log(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI)); // Log mismatch + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); + setverdict(pass); + } + } + } + } // End of 'for' statement + } else { + log("*** " & __SCOPE__ & ": FAIL: No items in pDUSessionResourceSetupListSUReq. ***"); + setverdict(fail); + } + break; // Break the loop as the relevant IE has been processed + } + } // End of 'for' statement f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble + f_NGAP_amf_UE_PDU_SessionResourceResponse(); // f_send_pdu_session_resource_setup_response f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); diff --git a/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn b/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn index 6a044f3..75e2486 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn @@ -30,8 +30,10 @@ module LibNGAP_EncdecDeclarations { with {extension "prototype(convert) encode(LibNGAP_codec)"} external function fx_dec_NGAP_IEs (inout bitstring pdu, out NGAP_IEs p) return integer with {extension "prototype(sliding) decode(LibNGAP_codec)"}*/ - //external function dec_PDUSessionResourceSetupResponseTransfer(inout bitstring pdu, out NGAP_IEs.PDUSessionResourceSetupResponseTransfer p) return integer - //with {extension "prototype(sliding) decode(LibNGAP_codec)"} + + external function fx_enc_PDUSessionResourceSetupResponseTransfer(NGAP_IEs.PDUSessionResourceSetupResponseTransfer p) return bitstring + with {extension "prototype(convert) encode(PER:ALIGNED)"} + external function fx_dec_PDUSessionResourceSetupResponseTransfer(inout bitstring pdu, out NGAP_IEs.PDUSessionResourceSetupResponseTransfer p) return integer with {extension "prototype(sliding) decode(PER:ALIGNED)"} //with {extension "prototype(sliding) decode(LibNGAP_codec)"} diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 1c1820b..8268832 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -136,7 +136,7 @@ module LibNGAP_Templates { }, { id := id_PDUSessionResourceSetupListSUReq, - criticality := ignore, + criticality := reject, value_ := { PDUSessionResourceSetupListSUReq := p_pDUSessionResourceSetupListSUReq } } } @@ -154,7 +154,8 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_PDUSessionResourceSetupRequest( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, - template (present) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq := ? + template (present) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq := ?, + template (present) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate := ? ) := { procedureCode := id_PDUSessionResourceSetup, criticality := reject, @@ -173,8 +174,13 @@ module LibNGAP_Templates { }, { id := id_PDUSessionResourceSetupListSUReq, - criticality := ignore, + criticality := reject, value_ := { PDUSessionResourceSetupListSUReq := p_pDUSessionResourceSetupListSUReq } + }, + { + id := id_UEAggregateMaximumBitRate, + criticality := ignore, + value_ := { UEAggregateMaximumBitRate := p_uEAggregateMaximumBitRate } } } } @@ -220,7 +226,7 @@ module LibNGAP_Templates { } } } - } // End of template mw_n2_PDUSessionResourceSetupResponse + } // End of template m_n2_PDUSessionResourceSetupResponse } // End of group Send diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 8bfe831..3ac8e06 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -712,7 +712,13 @@ module LibNGAP_Functions { vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -994,7 +1000,12 @@ module LibNGAP_Functions { ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST, + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul + ) == false) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch. ***"); setverdict(fail); } else { @@ -1132,41 +1143,44 @@ module LibNGAP_Functions { }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); // FIXME: Security + vc_pdu_session_resource_setup_list_su_req := valueof(vc_recvNGAP_PDU.initiatingMessage.value_.PDUSessionResourceSetupRequest.protocolIEs[2].value_.PDUSessionResourceSetupListSUReq); } function f_send_pdu_session_resource_setup_response() runs on NGNASComponent { log(">>> f_send_pdu_session_resource_setup_response"); // Send PDUSessionEstablishmentResponse + vc_pdu_session_resource_setup_list_su_res := { + valueof( + m_pDUSessionResourceSetupItemSURes( + vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, // Reuse the same PDU Session ID as in the request + bit2oct(encvalue(m_pDUSessionResourceSetupResponseTransfer( + m_qosFlowPerTNLInformation( + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel( + PX_TRANSPORT_LAYER_ADDRESS, + PX_GTP_TEID, + omit + )), + { + m_associatedQosFlowItem( + PX_QOS_FLOW_IDENTIFIER, + omit, + omit + ) + },//in template (value) AssociatedQosFlowList p_associatedQosFlowList, + omit//in template (omit) QosFlowPerTNLInformation.iE_Extensions p_iE_Extensions := omit + ) + ))))) + }; + log("f_send_pdu_session_resource_setup_response: vc_pdu_session_resource_setup_list_su_res: ", vc_pdu_session_resource_setup_list_su_res); f_send_NGAP_PDU( m_ngap_succMsg( - m_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes/*( - -, - -, - { - m_pDUSessionResourceSetupItemSURes( - PX_PDU_SESSION_ID, - m_pDUSessionResourceSetupResponseTransfer( - m_qosFlowPerTNLInformation( - m_uPTransportLayerInformation_gTPTunnel( - m_gTPTunnel( - PX_TRANSPORT_LAYER_ADDRESS, - PX_GTP_TEID, - omit - )), - { - m_associatedQosFlowItem( - PX_QOS_FLOW_IDENTIFIER, - omit, - omit - ) - },//in template (value) AssociatedQosFlowList p_associatedQosFlowList, - omit//in template (omit) QosFlowPerTNLInformation.iE_Extensions p_iE_Extensions := omit - ), - omit //template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * - )) - } - )*/)); + m_n2_InitialContextSetupResponse( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_pdu_session_resource_setup_list_su_res + ))); } function f_await_pdu_session_resource_setup_response() runs on NGNASComponent { @@ -1194,6 +1208,8 @@ module LibNGAP_Functions { )) } ))); + vc_pdu_session_resource_setup_list_su_res := valueof(vc_recvNGAP_PDU.successfulOutcome.value_.PDUSessionResourceSetupResponse.protocolIEs[2].value_.PDUSessionResourceSetupListSURes); + log("f_await_pdu_session_resource_setup_response: vc_pdu_session_resource_setup_list_su_res: ", vc_pdu_session_resource_setup_list_su_res); } // function f_await_pdu_session_resource_setup_request_await_session_resource_setup_response() runs on NGNASComponent { @@ -1409,12 +1425,20 @@ module LibNGAP_Functions { vc_RAN_UE_ID, p_Cause ))); - // Await UEContextReleaseComplete + // Await UEContextReleaseCommand f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_UEContextReleaseComplete( - vc_AMF_UE_ID, - vc_RAN_UE_ID + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand( + -, + p_Cause + ))); + // Await UEContextReleaseComplete + f_send_NGAP_PDU( + m_ngap_succMsg( + m_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_pdu_session_resource_setup_list_su_res ))); } diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index bcdec9d..afbbd98 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -17,6 +17,7 @@ module LibNGAP_Interface { //Lib3GPP import from CommonDefs all; + import from NG_NAS_TypeDefs all; import from NG_NAS_MsgContainers all; import from NG_NAS_SecurityFunctions all; @@ -72,6 +73,8 @@ module LibNGAP_Interface { var InitialContextSetupRequest vc_initialContextSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupRequest vc_pDUSessionResourceSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupResponse vc_pDUSessionResourceSetupResponse; // TODO Could be useless at the end of the day + var PDUSessionResourceSetupListSUReq vc_pdu_session_resource_setup_list_su_req; // Used to terminate test case execution properly + var PDUSessionResourceSetupListSURes vc_pdu_session_resource_setup_list_su_res; // Used to terminate test case execution properly var NGAP_PDU vc_recvNGAP_PDUDefault ; //global variable defined to save Dimeter message received within default altstep // Init of values at component started diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index 1623e07..ddbd628 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -269,9 +269,10 @@ module LibNGAP_Steps { * @desc * @verdict */ - function f_postambleNGAP_AMF() - runs on aMFNGAPComponent { - // Nothing to do + function f_postambleNGAP_AMF( + in template (value) Cause p_Cause + ) runs on aMFNGAPComponent { + f_send_ue_context_release_request_await_ue_context_release_response(p_Cause); } // End of function f_postambleNGAP_AMF } // End of group postamble_NGAP diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index e5109b3..62565c5 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -1001,6 +1001,63 @@ module Lib_NG_NAS_Templates { } } // End of template mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT + template (present) NG_NAS_DL_Message_Type mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI( + template (present) NG_PDU_SessionId p_PDU_SessionId := ?, + template (present) SSC_Mode p_SSC_Mode := ?, + template (present) PDU_SessionType p_PDU_SessionType := ?, + template (present) QoS_Rules p_QoS_Rules := ?, + template (present) Session_AMBR p_Session_AMBR := ?, + template ProcedureTransactionIdentifier p_PTI := *, + template GMM_GSM_Cause p_Cause := *, + template PDU_Address p_PDU_Address := *, + template GPRS_Timer p_RQTimer := *, + template S_NSSAI_Type p_S_NSSAI := *, + template AlwaysOnPDUSessionInd p_AlwaysOnPDUSessionInd := *, + template MappedEPSBearerContexts p_MappedEPSBearerContexts := *, + template EAP_Message p_EAP := *, + template QoSFlowDescr p_QoSFlowDescr := *, + template ExtdProtocolConfigOptions p_ExtdPCO := *, + template DNN p_DNN := *, + template NGSM_NetworkFeatureSupport p_NGSM_NtwkFeatSupport := *, + template ServingPLMNRateControl p_ServingPLMNRateCtrl := *, + template ATSSSContainer p_ATSSSContainer := *, + template ControlPlaneInd p_ControlPlaneInd := *, + template IPHeaderCompressionConfig p_IPHeaderCompConfig := *, + template EthernetHeaderCompressConfig p_EthernetHeaderCompConfig := *, + template ServiceLvlAAContainer p_ServiceLvlAA := *, + template ReceivedMBSContainer p_ReceivedMBS := * + ) := { /* 24.501 cl. 8.3.2 */ + /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ + pdu_Session_Establishment_Accept := { + protocolDiscriminator := tsc_EPD_GSM, /* cl. 9.2 M V 1 */ + pduSessionId := p_PDU_SessionId, /* cl. 9.4 M V 1 */ + procedureTransactionIdentifier := p_PTI, /* cl. 9.6 M V 1 */ + messageType := tsc_MT_NG_PDUSessionEstablishmentAccept, /* cl. 9.7 M V 1 */ + sscMode := p_SSC_Mode, /* cl. 9.11.4.16 M V 1/2 */ + pduSessionType := p_PDU_SessionType, /* cl. 9.11.4.11 M V 1/2 */ + authorizedQoSRules := p_QoS_Rules, /* cl. 9.11.4.13 M LV-E 7-65538 */ + sessionAMBR := p_Session_AMBR, /* cl. 9.11.4.14 M LV ? */ + gsmCause := p_Cause, /* cl. 9.11.4.2 O TV 2 IEI=59 */ + pduAddress := p_PDU_Address, /* cl. 9.11.4.10 O TLV 7-15 IEI=29 */ + rqTimerValue := p_RQTimer, /* cl. 9.11.2.3 O TLV 2 IEI=56 */ + s_NSSAI := p_S_NSSAI, /* cl. 9.11.2.6 O TLV 3-10 IEI=22 */ + alwaysOnPDUSessionInd := p_AlwaysOnPDUSessionInd, /* c. 9.11.4.3 O TV 1 IEI=8 */ + mappedEPSContexts := p_MappedEPSBearerContexts, /* cl. 9.11.4.9 O TLV-E 7-65538 IEI=7F */ + eapMessage := p_EAP, /* cl. 9.11.2.2 O TLV-E 7-1503 IEI=78 */ + authorizedQoSFlowDescr := p_QoSFlowDescr, /* cl. 9.11.4.12 O TLV-E 6-65538 IEI=79 */ + extdProtocolConfigurationOptions := p_ExtdPCO, /* cl. 9.11.4.6 O TLV-E 4-65538 IEI=0x7B */ + dnn := p_DNN, /* cl. 9.11.2.1A O TLV 3-102 IEI=25 */ + ngs_NetworkFeatureSupport := p_NGSM_NtwkFeatSupport, /* cl. 9.11.4.18 O TLV 3-15 IEI=17 Sep20 @sic R5s201387 Baseline Moving sic@ */ + servingPLMNRateControl := p_ServingPLMNRateCtrl, /* cl. 9.11.4.20 O TLV 4 IEI=18 Sep20 @sic R5s201387 Baseline Moving sic@ */ + atsssContainer := p_ATSSSContainer, /* cl. 9.11.4.22 O TLV-E 3-65538 IEI=77 Sep20 @sic R5s201387 Baseline Moving sic@ */ + controlPlaneOnlyIndication := p_ControlPlaneInd, /* cl. 9.11.4.23 O TV 1 IEI=C Sep20 @sic R5s201387 Baseline Moving sic@ */ + ipHeaderCompressionConfig := p_IPHeaderCompConfig, /* cl. 9.11.4.24 O TLV 5-257 IEI=66 Sep20 @sic R5s201387 Baseline Moving sic@ */ + ethernetHeaderCompressConfig := p_EthernetHeaderCompConfig, /* cl. 9.11.4.28 O TLV 3 IEI=1F Sep20 @sic R5s201387 Baseline Moving sic@ */ + serviceLvlAA := p_ServiceLvlAA, /* cl. 9.11.2.10 O TLV-E 6-n IEI=72 Sep22 @sic R5s221179 Baseline Moving sic@ */ + receivedMBS := p_ReceivedMBS /* cl. 9.11.4.30 O TLV-E 8-65538 IEI=71 Sep22 @sic R5s221179 Baseline Moving sic@ */ + } + } // End of template mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI + template (omit) NG_NAS_DL_Message_Type m_NG_PDU_SESSION_ESTABLISHMENT_REJECT( in template (value) NG_PDU_SessionId p_PDU_SessionId, in template (value) ProcedureTransactionIdentifier p_PTI, -- GitLab From 59d2326468f5d8f38da63bf49c42aa6d7b989763 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Thu, 26 Mar 2026 21:33:39 +0000 Subject: [PATCH 070/151] New TP_5GNAS_AMF_IDN_REQ_01 for Identification procedure added --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 57 ++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 0cc1f52..7fefaed 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -460,7 +460,62 @@ Package TP_AMF { - } // end Group Security mode control procedure + } // end Group Security mode control procedure + + Group "5.4.3 Identification procedure" + { + import all from Ngnas_Common; + + Test Purpose { + + TP Id TP_5GNAS_AMF_IDN_REQ_01 + + Test objective "Verify that the IUT initiates the identification procedure by sending an IDENTITY_REQUEST message with identity type set to SUCI when the IUT receives a REGISTRATION_REQUEST message containing a 5G-GUTI that is not known by the IUT." + + Reference + "ETSI TS 123 502 [2], Clause 4.2.2.2.2" + "ETSI TS 124 501 [1], Clauses 5.4.3.2 and 8.2.21" + + Config Id CF_AMF_N2N1 + + PICS Selection PICS_A4/3 + + Initial conditions with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_mobile_identity containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value PX_5G_TMSI;;; + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED, + message_type set to IDENTITY_REQUEST, + identity_type set to SUCI;; + to the GNB entity + } + } + + } // end TP_5GNAS_AMF_IDN_REQ_01 + + } // end Group Identification procedure Group "5.4.4 Generic UE configuration update procedure" { -- GitLab From 34036a2c210a8bcbff6227890c4e8dd2bf2613cc Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Thu, 26 Mar 2026 21:39:25 +0000 Subject: [PATCH 071/151] Reference added --- test_purposes/References.txt | 1 + test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/test_purposes/References.txt b/test_purposes/References.txt index f0ac772..9591a37 100644 --- a/test_purposes/References.txt +++ b/test_purposes/References.txt @@ -1 +1,2 @@ [1] ETSI TS 138 413: "5G;NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.12.0 Release 16)". +[2] ETSI TS 123 502: "5G;Procedures for the 5G System (5GS) (3GPP TS 23.502 version 16.19.0 Release 16)". \ No newline at end of file diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 7fefaed..018c3f7 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -461,7 +461,7 @@ Package TP_AMF { } // end Group Security mode control procedure - + Group "5.4.3 Identification procedure" { import all from Ngnas_Common; @@ -473,8 +473,8 @@ Package TP_AMF { Test objective "Verify that the IUT initiates the identification procedure by sending an IDENTITY_REQUEST message with identity type set to SUCI when the IUT receives a REGISTRATION_REQUEST message containing a 5G-GUTI that is not known by the IUT." Reference - "ETSI TS 123 502 [2], Clause 4.2.2.2.2" - "ETSI TS 124 501 [1], Clauses 5.4.3.2 and 8.2.21" + "ETSI TS 123 502 [2], Clause 4.2.2.2.2 + ETSI TS 124 501 [1], Clauses 5.4.3.2 and 8.2.21" Config Id CF_AMF_N2N1 -- GitLab From 940811d1337c1956cb093cc93f9ea126c5833c6d Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 27 Mar 2026 13:40:56 +0100 Subject: [PATCH 072/151] Finalize TC_NGAP_AMF_PDU_02 --- captures/TC_NGAP_AMF_CMP_01.pcap | Bin 0 -> 3104 bytes captures/TC_NGAP_AMF_CMP_02.pcap | Bin 0 -> 3490 bytes captures/TC_NGAP_AMF_CMP_03.pcap | Bin 0 -> 3490 bytes captures/TC_NGAP_AMF_PDU_01.pcap | Bin 4068 -> 4068 bytes captures/TC_NGAP_AMF_PDU_02.pcap | Bin 0 -> 4112 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 27 ++ ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 120 ++++--- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 297 +++++++++++++++++- 9 files changed, 380 insertions(+), 68 deletions(-) create mode 100644 captures/TC_NGAP_AMF_CMP_01.pcap create mode 100644 captures/TC_NGAP_AMF_CMP_02.pcap create mode 100644 captures/TC_NGAP_AMF_CMP_03.pcap create mode 100644 captures/TC_NGAP_AMF_PDU_02.pcap diff --git a/captures/TC_NGAP_AMF_CMP_01.pcap b/captures/TC_NGAP_AMF_CMP_01.pcap new file mode 100644 index 0000000000000000000000000000000000000000..2d84e6fa1b4f294ddddabc0988254075f20ea185 GIT binary patch literal 3104 zcmca|c+)~A1{MYcU}0cnU|{&*bTqS)lb0cgfdPyW@(c_d46aNJE({C~3=Sh%l^ zEcFZwoL3zAWniip85mR!*&gX*U|hh!Aou@&Xk+{j1|9}B237`!1_lO}0}Ko-AR8Ju zc^Qlt7{C~&7es??P=VUu4l*5N3%|@2N3f|33=C`x3@rT4M>ExpIKb`$xf7%lhQTIa zxbZ|LsvEsFw0wiPao*q6chTJlvcbuS1MEJKJ7K1SXs``f+;}1rY%0`^!p=uCKTT(4 z$YNjsV~|c52AdEA^`%%n0|R3{0|RUC>1jML6^slFHs`t)$%Ea<_5c5Yow}D9SQ$7# zYC-gY6^x=FnoE~~5#8+|n|WujG6XR)fHBNW5Dl`K5gIzydLUatCQjq&Jq@;vfq{XE zfl-C6dBZQT&2kJ}hRb>D8Q2*)4Cejc63}%cBV2rF59Ksq5 zjG#PX?FsTND3n2Q3l3EV1_myM(a;2i7$_9=X0Q^@V}76z1cfAWI^||yU;&x1bspY4 z#srE78xfFhkSWOVz`)F41$AGXXgBk+^GlMh(C&SF2>;Vi642%qE47?yIMvw>t zs00*sV02($0NH$K9xH<#0|OX?)W9$(1uz)2z5&_1Efi!c$aZA6Gczy7H ziMeS83<(Sz3?Pp%F*q=UIWYcb2w>m<@xdMg`^k76K0h%qgIr-_5AqMlCCH%(@)Ot< zjPp-{90Kyw_8qJYZ43-x3=)H3u%9XzSU{#(f5T=P12aR|ft|Wnz;OW5#?Royz`)87 z3M!u%)EFeh>lhp>8F(3I{$vM9gRp=e(}xcXl??n2Gk>xRnFI(KfF&6jq8u0{7z!Lf z1!N2XZBrSZF|UVZec%x>vykJIEM4 z2O9 zu_ft|Xb+{g?vfkDq9 z88e)0ZR%J~{^U?$sAGsLXW%StPEc%24gC1AkU<$saui@>&|~@V;ll@gCPv0!Mg}aw z3HHVLAU1|)3=Cilwi`--eQ~4p1IQO!SAu*1@(GskyoTh9rH0FSn-~~D$&JB=fsdhK z0;teJj&2zSc2J%Nl>y+|o}rw9Q-*;LYH1vULfFjTwo4cD{AraefB%PJuGm|T)b1Bw zFNOUS>-qJ`T(6!%$$_J|AyKjQ|NoB+Y7Y8(bxg+HJNGiyF*q?YmNRgFn)#ERiNWCj z1M~S1c2HhqU| X22QYzjv)Vm{D~a8Y@qbQ!@vRn$Ui|N literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_AMF_CMP_02.pcap b/captures/TC_NGAP_AMF_CMP_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..04d1c3fabb8c911849f9c73a514168d3600404fd GIT binary patch literal 3490 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 literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_AMF_PDU_01.pcap b/captures/TC_NGAP_AMF_PDU_01.pcap index 870ef117504ec28e1c5d953d7ea115d184af838b..1f21fa20be6a51bc2f28cd1ed7c5f5110db79bde 100644 GIT binary patch delta 2072 zcmaDN|3rR*1lyx;M>3OlOqA0xYYgR=VSoZg1_l+ge}=ml7#A=w$o>DHePY>k1|9}B z237`!1_lO}0}Ko-Af1IfCN}6vH->`MGB7Z(F)*+^|8^vkX)ZTI76SuA)?`L@k%@N& z6`q`$#sf8*fsuj1W)hq353u1}|Njf~Z_1p^$Ed*$(kV8Vd$KK~Zr+nqU?mI;3``7+ zD%Z1%oxsZF7`RLtOFS9a899Eec-eh(jjrcIx0_jMeJ`#UvBrAAtbox@#o5(IbGawaXVQ)V z`5f$g1_lN$hC%FX5wNoj=5kMLR8sS+XJB9jh0HV_L`-l)V^@9=QtYb6FfchVIJDS^ zfRux@A^VttnZXJiziBKcVDmK>aZg^zB5nL_El88=6p#jxMr3=K85jgWniv@8UjxM) zC|#Ud%RTu$i?qtObzptb*z_?lGq{0L$7DTL2e4(g)`BgYJb_g}6WLWD3qT4P80VjY zS+Hw6H$xi(14A1q$xgn@Dky@igMpbLOqhRD)?_BO0A7%LVh(XLfRfcDkaE+OZ|lL% zvcu*qkZmBn-~4*ItnocLjcW}I zg?|>Cs^{kMF))DayY+^9@^3b66=X+&3NY+`K zG?sWze!;FJZ@cut6NWm5SSALh4<8baub_p8JHOk zn>3dAO)lb5XK^y94w*ccr+{hZmdX6Q@?Zz5yMaS&asV&ZOzg+NINulKLy*1iq8J#` z7#JARK=w|a%ZrhTErj_u6-++FYXCMnCZ8D;8J6F+g52lYgUx-QOa{^f^E=3z?0ja1 zFa`#OFpxE>9t_+d?KbkDatveyavo)1X3!Ak-&8ocjZXn=r(+58DF6#$b}}$CsF*aC_)q@B2T4UAs+lLt^J7hV{z#fYzAc)Z$8W$3a&=ohGlLle X1A`gJ)sy%0qXrHe0|N&G4+9GT6bo~K delta 2072 zcmaDN|3rR*1l#^wM>0izPn6R!dt1jZ!vF=03=Aq6yVyT7FfL$Vko*7NwNNCEfro*O zft7)wfq{YL00RRHNT=wbm&d726j)iPHccK5Lw7l*6LRn0n=kA&fvjRph)Y;>@J$Pq1 zjQ>Mys!mkU0tq<=E`|s<=5!{8eKYGB7#JrjGKoxn!^oqMZmVFj$y!}ZLbYp6&TQNI zHLG-O-anYCndK4iJ!#Q;_sNP(@{LyBG17zQQ>28R|K z5s-3_He??&Ff&+z<2Q}P1Z;lsJhsUTS)`3^cY!qhYX@lnX+*Y%nSnt7q=|uX{xwj{ zfzk!}r2*c7|;X3=G>qrcbuz5X9#GC?o^RZ|^!h zV{#FP5{oO-y9bkJaCm_uvP*@1@_a676We_t=l#8n$9Xf5Ok0}H>=r%Qg452MN4Ne+ z+`Tkx-cj?a1=KrDz^Ur|B*q>L0_+qiFwwa z4UBaRPK=D@4BVe){$yuja5%ugBr^FRr#RSATaDQ#-{-^{CDBNZP`H9979@koml1h6=GGJ@k>^c)w%Ck6(FPoQ{LePVkMWcJ@P*gVU?%y2lJ*)4W* z5sx~{#+vZ<$#Z!Mn4%9(=I50MJJ9JIIK(Cg@M6uxu?&p!eL+41g^~?FH$xf&14A0f z-pO-$F*32m?OliGOg_YG05-Z>mk$&fmbQmL?)z7d&3&Lu2GRucJII=~x_k^_3=9lm zAZt`T7`Q>&ZRA1a7|00ZJj%e#pmBTG;klFB_!Pi)&a&d0e4kU=#P%>q)4wQ?29U;S zNChp_&bcr<8JHPV(wW`jCja4sq#})AzRB|ZSd(5Hk|vOE=S|MzHvkt|DY1MEW(*7r VW*}Ej-p`L3IBX0I91J`REC6-{c>w?b diff --git a/captures/TC_NGAP_AMF_PDU_02.pcap b/captures/TC_NGAP_AMF_PDU_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..7c52cc3261f9d54c43fd1db34955961a23d10603 GIT binary patch literal 4112 zcmca|c+)~A1{MYcU}0cnU|`r^c`TFb4HH8U0|OW%4agh z2{BL;#OfIs80#4rSg-D$#sgEq$iQIpu)@d_>_)Et|MhzWn;BRcI6!Ja^nn$Oq9B?} zmw^%8?I4>U?d4<$Vq^egn3*6NWHTc)bgcD2wt`HY#&dNy*fs_R1||kZ6`$ibTfsKV zF>oopSm49J&d8D6Cf5|y)k2uL@`6y$hdU}mra=PQ_{q6}&b49pDD44e!zf3gQKFfcGOq%rV5Wv6z;)6W~_S3Vo`257c4045yJ;*;Gmmr5G$WLHbFwQ>( zatO#z{?|Ae+87wX7$gS6U_Vtbuz*an{)Wvo24;pZ{T{&@$i+~_zyQV|BVicqx}2-6 zAlIcefLsQ0A(rri)GZ)w%na5_FBbSQFoHu66n^TM;U^+o$Na46d@Ms9Lo5>m(}xca z%@~=$sr95b7sECN1~3L02g6{OtYBaRxy1Si$Q2;hUnIJLtHrnXK8bSVqOiL-^1;-dD=AZ_FDX?ib7&t(tSx*9)1TqoX{S3?uuKGQK9SooX z4WviU!4TwhUMvV?U<7wJY#3x28rGo)rWZp)4}$|^SRKliW^8Qk?484n3Ea56Hm85%M&{%2%k{-VPCMMaa9kxQ3>Nr{oMl7Wp;!I6=X zvzmdwfq|EWgM)(uOtG*ag}4wSgMvQD!X^eT9_v}B7z{uJLpK8#gp zJYRCpNMKMnT6rvU(GNy^`LqjUYua{@`$0A%$0EoNU|T^wI|c>@kZHR9d<=CA3}6g% zKZpkVp@4xKWSaGNkVzmD(ef#%?(BxNj==c~d)>)Y-d=x`8Jxe^^cWd0Myd!gV#z@u z*Q`q51J|3N`V-^|7zVp0=V~{|HEC5Kmw;S^#c$n6`Nu}-#eyIPMo_;M-1g7_hcHUp zLsX=WNw7%Mm<60zS@jqhFRKVKf?U#6%LgudL1i$^6(Abyk`M+SkV|ZYK&}9}202_n zp$xHk0Z0SLQc(HZ!@$762@+7ygqFWZE&>> f_NGAP_amf_UE_PDU_SessionResourceReleaseRequest"); + if (PICS_OFFLINE_MODE) { + f_await_pdu_session_resource_release_request(); + } else { + f_send_pdu_session_resource_release_request(); + } + } + /** * @desc */ @@ -323,6 +332,24 @@ module NGAP_Steps { } } // End of function f_NGAP_amf_UE_PDU_InitialContextSetupFailure + function f_NGAP_amf_UE_DeregistrationRequest() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_DeregistrationRequest"); + if (PICS_OFFLINE_MODE) { + f_await_deregistration_request(); + } else { + f_send_deregistration_request(); + } + } + + function f_NGAP_amf_UE_DeregistrationRequest_DeregistrationComplete() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_DeregistrationRequest"); + if (PICS_OFFLINE_MODE) { + f_await_deregistration_request_await_deregistration_accept(); + } else { + f_send_deregistration_request_await_deregistration_accept(); + } + } + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 2b87064..e091f6c 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -19,6 +19,7 @@ module NGAP_TCFunctions { // NG_NAS import from NG_NAS_TypeDefs all; import from NG_NAS_MsgContainers all; + import from NG_NAS_Templates all; // LibNGAP import from NGAP_IEs language "ASN.1:2002" all; @@ -4043,7 +4044,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - //action("Trigger PDU session resource SETUP!"); + action("Trigger PDU session resource SETUP!"); f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command @@ -4051,20 +4052,7 @@ module NGAP_TCFunctions { mw_ngap_initMsg( mw_n2_PDUSessionResourceSetupRequest( vc_AMF_UE_ID, - vc_RAN_UE_ID/*, - { - mw_pDUSessionResourceSetupItemSUReq( - PX_PDU_SESSION_ID, - mw_s_NSSAI( - PX_SST, - -,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - ) - }*///in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + vc_RAN_UE_ID ))); var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, " ***"); @@ -4137,40 +4125,75 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_session_establishment_request_await_session_establishment_response - f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request_send_session_resource_setup_response - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger PDU session resource RELEASE!"); + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request + f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command + f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request + f_NGAP_amf_UE_PDU_SessionResourceResponse(); // f_send_pdu_session_resource_setup_response + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + f_sleep(1.0); // Sleep for a while to ensure the previous procedure is completed before triggering the release + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_PDUSessionResourceReleaseCommand( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - mw_pDUSessionResourceToReleaseItemRelCmd( - PX_PDU_SESSION_ID, - ?,//decmatch(mw_pDUSessionResourceReleaseCommandTransfer(?,-)),OCTETSTRING - -//in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit - ) - } - ))); + // Body + action("Trigger PDU session resource RELEASE!"); + f_NGAP_amf_UE_PDU_SessionResourceReleaseRequest(); // f_send_pdu_session_resource_release_request + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + // { + // mw_pDUSessionResourceToReleaseItemRelCmd( + // vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, + // ?,//decmatch(mw_pDUSessionResourceReleaseCommandTransfer(?,-)),OCTETSTRING + // -//in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit + // ) + // } + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_DL_NAS_TRANSPORT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_PDU_SESSION_RELEASE_COMMAND ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); + var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); + var NG_PDU_SESSION_RELEASE_COMMAND v_ng_pdu_session_release_command; + if (decvalue(v_bs, v_ng_pdu_session_release_command) != 0) { + log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); + setverdict(inconc); + } else { + log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_release_command: ", v_ng_pdu_session_release_command); + var NG_NAS_DL_Message_Type v_expected_message; + v_expected_message.pdu_Session_Release_Command := v_ng_pdu_session_release_command; + if (not(match(v_expected_message, mw_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit))))) { + log(match(v_expected_message, mw_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit)))); // Log mismatch + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_RELEASE_COMMAND mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_RELEASE_COMMAND ***"); + setverdict(pass); + } + } + } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_NGAP_amf_UE_ContextRealeaseComplete(); // f_send_ue_context_release_complete f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4480,7 +4503,6 @@ module NGAP_TCFunctions { // Send error response to release the UE context f_NGAP_amf_UE_PDU_InitialContextSetupFailure(); f_NGAP_amf_UE_ContextRealease_ContextRealeaseComplete(); - f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4522,8 +4544,8 @@ module NGAP_TCFunctions { mw_n2_UEContextReleaseCommand( mw_uE_NGAP_IDs_uE_NGAP_ID_pair( mw_uE_NGAP_ID_pair ( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + vc_AMF_UE_ID, + vc_RAN_UE_ID, * ))))); @@ -4531,9 +4553,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - // Send UEContextComplete response to release the UE context - f_NGAP_amf_UE_ContextRealeaseComplete(); - f_postamble_NGAP_AMF(); + f_NGAP_amf_UE_ContextRealeaseComplete(); // f_send_ue_context_release_complete f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_AMF_CMP_02 @@ -4566,10 +4586,10 @@ module NGAP_TCFunctions { mw_ngap_initMsg( mw_n2_UEContextReleaseCommand( mw_uE_NGAP_IDs_uE_NGAP_ID_pair( - mw_uE_NGAP_ID_pair ( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - * + mw_uE_NGAP_ID_pair( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + * )), mw_cause_radioNetwork(PX_UE_CONTEXT_RELEASE_COMMAND_CAUSE) ))); @@ -4577,7 +4597,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_NGAP_amf_UE_ContextRealeaseComplete(); // f_send_ue_context_release_complete f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4618,8 +4638,8 @@ module NGAP_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_UEContextModificationRequest( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 3ac8e06..1756898 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -860,7 +860,6 @@ module LibNGAP_Functions { m_NG_REGISTRATION_COMPLETE_noSOR ); // 2. Add security if any - // TODO log("f_send_registration_complete: ", v_nas_message); var octetstring v_msg := bit2oct(encvalue(v_nas_message)); log("bit2oct(encvalue(f_send_registration_complete))", v_msg); @@ -890,6 +889,8 @@ module LibNGAP_Functions { m_nR_CGI, m_tAI ))))); + + setverdict(pass); } /** @@ -955,13 +956,12 @@ module LibNGAP_Functions { cs_DNN(-, '08696e7465726e6574'O) // internet )); - // 2. Add security if any - // TODO + // 3. Add security if any log("v_ng_ul_nas_transport: ", v_ng_ul_nas_transport); v_msg := bit2oct(encvalue(v_ng_ul_nas_transport)); log("bit2oct(encvalue(v_ng_ul_nas_transport))", v_msg); - // 3. Add security if any + // 4. Add security if any var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( tsc_SHT_IntegrityProtected_Ciphered, @@ -986,6 +986,8 @@ module LibNGAP_Functions { m_nR_CGI, m_tAI ))))); + + setverdict(pass); } function f_await_pdu_session_establishment_request() runs on NGNASComponent { @@ -1130,20 +1132,67 @@ module LibNGAP_Functions { vc_RAN_UE_ID, { mw_pDUSessionResourceSetupItemSUReq( - PX_PDU_SESSION_ID, - mw_s_NSSAI( - PX_SST, - PX_SD,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - ) + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST/*, + PX_SD, + -*/ + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); - // FIXME: Security - vc_pdu_session_resource_setup_list_su_req := valueof(vc_recvNGAP_PDU.initiatingMessage.value_.PDUSessionResourceSetupRequest.protocolIEs[2].value_.PDUSessionResourceSetupListSUReq); + var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) + log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, " ***"); + for (var integer i :=0 ; i < numOfIEs; i := i + 1) { // Loop over the protocolIEs found + if ((vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].id) == 74 /*id_NAS_PDU*/) { + var integer numOfItems := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq) + log("*** " & __SCOPE__ & ": DBG: Number of items in pDUSessionResourceSetupListSUReq: ", numOfItems); + if (numOfItems > 0) { + vc_pdu_session_resource_setup_list_su_req := vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq; + for (var integer j :=0; j < numOfItems; j := j + 1) { // Loop over the PDUSessionResourceSetupListSUReq items + log("*** " & __SCOPE__ & ": DBG: pDUSessionNAS_PDU of item ", j, ": ", vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU, + mw_NG_DL_NAS_TRANSPORT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); + var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); + var NG_PDU_SESSION_ESTABLISHMENT_ACCEPT v_ng_pdu_session_establishment_accept; + if (decvalue(v_bs, v_ng_pdu_session_establishment_accept) != 0) { + log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); + setverdict(inconc); + } else { + log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_establishment_accept: ", v_ng_pdu_session_establishment_accept); + var NG_NAS_DL_Message_Type v_expected_message; + v_expected_message.pdu_Session_Establishment_Accept := v_ng_pdu_session_establishment_accept; + if (not(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI))) { + log(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI)); // Log mismatch + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); + setverdict(pass); + } + } + } + } // End of 'for' statement + } else { + log("*** " & __SCOPE__ & ": FAIL: No items in pDUSessionResourceSetupListSUReq. ***"); + setverdict(fail); + } + break; // Break the loop as the relevant IE has been processed + } + } // End of 'for' statement } function f_send_pdu_session_resource_setup_response() runs on NGNASComponent { @@ -1212,6 +1261,86 @@ module LibNGAP_Functions { log("f_await_pdu_session_resource_setup_response: vc_pdu_session_resource_setup_list_su_res: ", vc_pdu_session_resource_setup_list_su_res); } + function f_await_pdu_session_resource_release_request() runs on NGNASComponent { + log(">>> f_await_pdu_session_resource_release_request"); + + // Await NG_PDU_SESSION_RELEASE_REQUEST + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU) + if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_RELEASE_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_RELEASE_REQUEST mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_RELEASE_REQUEST ***"); + setverdict(pass); + } + } + + function f_send_pdu_session_resource_release_request() runs on NGNASComponent { + log(">>> f_send_pdu_session_resource_release_request"); + + // Send request for NG_PDU_SESSION_RELEASE_REQUEST + var NG_NAS_UL_Message_Type v_ng_pdu_session_release_request := valueof( + m_NG_PDU_SESSION_RELEASE_REQUEST( + cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit), + tsc_PTI_1, + cs_GMM_GSM_Cause ('59'O, '00100100'B) + )); + v_ng_pdu_session_release_request.pdu_Session_Release_Request.protocolDiscriminator := tsc_EPD_GSM; + // 2. Prepare UL NAS Transport message + log("v_ng_pdu_session_release_request: ", v_ng_pdu_session_release_request); + var octetstring v_msg := bit2oct(encvalue(v_ng_pdu_session_release_request)); + log("bit2oct(encvalue(v_ng_pdu_session_release_request))", v_msg); + var NG_NAS_UL_Message_Type v_ng_ul_nas_transport := valueof( + m_NG_UL_NAS_TRANSPORT( + { iei := omit, container := '0001'B }, // N1 SM information (1) + m_PayloadContainer( + -, + int2oct(lengthof(v_msg), 2), + v_msg + ), + cr_NG_PDU_SessionId('12'O, int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1)) + )); + + // 3. Add security if any + log("f_send_pdu_session_resource_release_request: ", v_ng_ul_nas_transport); + v_msg := bit2oct(encvalue(v_ng_ul_nas_transport)); + log("bit2oct(encvalue(f_send_pdu_session_resource_release_request))", v_msg); + + // 4. Add security if any + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_Ciphered, + v_msg, + tsc_DirectionUL, + PX_BEARER_ID, + vc_previous_nas_count_ul, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_ul: ", vc_previous_nas_count_ul); + vt_NgNasUl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + + setverdict(pass); + } + // function f_await_pdu_session_resource_setup_request_await_session_resource_setup_response() runs on NGNASComponent { // log(">>> f_await_pdu_session_resource_setup_request_await_session_resource_setup_response"); @@ -1442,6 +1571,142 @@ module LibNGAP_Functions { ))); } + /** + * @desc Function to send NAS DeregistrationRequest message + */ + function f_send_deregistration_request() runs on NGNASComponent { + log(">>> f_send_deregistration_request"); + + // Send request for DEREGISTRATION_REQUEST + var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + PX_PLMN_IDENTITY & + '0000'O & // Routing Indicator + '00'O & // Protection scheme + '00'O & // Home network public key identifier + PX_MSIN; + log("f_send_deregistration_request: v_other_digits: ", v_other_digits); + log("f_send_deregistration_request: m_NG_MobileIdentitySUCI: ", m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID)); + + var NG_NAS_UL_Message_Type v_nas_message := valueof( + m_NG_DEREGISTRATION_REQUEST_MO( + crs_DeregisterType ('0'B, '0'B, '01'B), + cs_NAS_KeySetIdentifier_lv('100'B,'0'B), + m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID) + )); + // 2. Add security if any + log("f_send_deregistration_request: ", v_nas_message); + var octetstring v_msg := bit2oct(encvalue(v_nas_message)); + log("bit2oct(encvalue(f_send_deregistration_request))", v_msg); + + // 3. Add security if any + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_Ciphered, + v_msg, + tsc_DirectionUL, + PX_BEARER_ID, + vc_previous_nas_count_ul, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_ul: ", vc_previous_nas_count_ul); + vt_NgNasUl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + + setverdict(pass); + } + + function f_await_deregistration_request() runs on NGNASComponent { + log(">>> f_await_deregistration_request"); + + // Await request for DEREGISTRATION_COMPLETE + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU) + if (match(vc_recvNgNasUl_Msg, mw_NG_DEREGISTRATION_REQUEST_MO)) { + log("Received NG_DEREGISTRATION_REQUEST_MO NAS message"); + } else { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + } + } + + function f_await_deregistration_request_await_deregistration_accept() runs on NGNASComponent { + log(">>> f_await_deregistration_request_await_deregistration_accept"); + + // Await request for DEREGISTRATION_REQUEST + f_await_deregistration_request(); + // Await request for DEREGISTRATION_ACCEPT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_DEREGISTRATION_ACCEPT_MO, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_DEREGISTRATION_ACCEPT_MO ***"); + setverdict(pass); + } + log("v_message: ", v_message); + } + + function f_send_deregistration_request_await_deregistration_accept() runs on NGNASComponent { + log(">>> f_send_deregistration_request_await_deregistration_accept"); + + // Send request for DEREGISTRATION_REQUEST + f_send_deregistration_request(); + // Await request for DEREGISTRATION_ACCEPT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_DEREGISTRATION_ACCEPT_MO, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_DEREGISTRATION_ACCEPT_MO ***"); + setverdict(pass); + } + log("v_message: ", v_message); + + } + function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGNASComponent { vc_recvNGAP_PDU := p_PDU; -- GitLab From e8024dc3f3266dc666c397c04427718b106fc66d Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 30 Mar 2026 09:34:49 +0200 Subject: [PATCH 073/151] Finalize TC_NGAP_AMF_PDU_02 --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 9 ++ ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 6 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 138 +++++++++++++----- 4 files changed, 112 insertions(+), 45 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 2cb8b17..23c3350 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -97,7 +97,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. -NGAP_TestCases.TC_NGAP_AMF_PDU_02 +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_03 # Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. @@ -112,7 +112,7 @@ NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs -###########################################NGAP_TestCases.TC_NGAP_AMF_CMP_04 +NGAP_TestCases.TC_NGAP_AMF_CMP_04 # Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs #NGAP_TestCases.TC_NGAP_AMF_CMP_05 # Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index edb621b..52e0365 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -321,6 +321,15 @@ module NGAP_Steps { } } + function f_NGAP_amf_UE_PDU_SessionResourceReleaseRequest_SessionResourceReleaseCommand() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_PDU_SessionResourceReleaseRequest"); + if (PICS_OFFLINE_MODE) { + f_await_pdu_session_resource_release_request_await_pdu_session_resource_release_command(); + } else { + f_send_pdu_session_resource_release_request_await_pdu_session_resource_release_command(); + } + } + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index e091f6c..ecf4cf9 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4627,10 +4627,10 @@ module NGAP_TCFunctions { if (not(f_NGAP_amf_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - return; + } else { + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); } - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body action("Trigger a PDU UE context modification procedure!"); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 1756898..1269e73 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -298,8 +298,8 @@ module LibNGAP_Functions { // Extract RAN_UE_NGAP_ID vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.initialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; } else { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); } } @@ -330,8 +330,8 @@ module LibNGAP_Functions { vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); } log("v_message: ", v_message); if (not(isbound(v_message))) { @@ -396,8 +396,8 @@ module LibNGAP_Functions { vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_dl_message) == false) { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); } log("v_dl_message: ", v_dl_message); @@ -427,8 +427,8 @@ module LibNGAP_Functions { vc_ng_nas_security_params_type, vc_previous_nas_count_ul ) == false) { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); } setverdict(pass); @@ -473,10 +473,10 @@ module LibNGAP_Functions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND"); setverdict(pass); } log("v_message: ", v_message); @@ -576,10 +576,10 @@ module LibNGAP_Functions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND"); setverdict(pass); } log("v_message: ", v_message); @@ -606,8 +606,8 @@ module LibNGAP_Functions { vc_ng_nas_security_params_type, vc_previous_nas_count_ul ) == false) { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); } // TODO Check plainNASMessage content @@ -656,10 +656,10 @@ module LibNGAP_Functions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_ACCEPT ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_ACCEPT"); setverdict(pass); } log("v_message: ", v_message); @@ -719,10 +719,10 @@ module LibNGAP_Functions { vc_previous_nas_count_dl, v_message ) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_ACCEPT ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_ACCEPT"); setverdict(pass); } log("v_message: ", v_message); @@ -910,8 +910,8 @@ module LibNGAP_Functions { if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_COMPLETE)) { log("Received NG_REGISTRATION_COMPLETE NAS message"); } else { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); } } @@ -1008,10 +1008,10 @@ module LibNGAP_Functions { vc_ng_nas_security_params_type, vc_previous_nas_count_ul ) == false) { - log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_REQUEST ***"); + log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_REQUEST"); setverdict(pass); } } @@ -1070,10 +1070,10 @@ module LibNGAP_Functions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { - log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); + log("*** " & __SCOPE__ & ": PASS: Expected PDU_SESSION_ESTABLISHMENT_ACCEPT"); setverdict(pass); } } @@ -1145,7 +1145,7 @@ module LibNGAP_Functions { }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) - log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, " ***"); + log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, ""); for (var integer i :=0 ; i < numOfIEs; i := i + 1) { // Loop over the protocolIEs found if ((vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].id) == 74 /*id_NAS_PDU*/) { var integer numOfItems := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq) @@ -1162,14 +1162,14 @@ module LibNGAP_Functions { vc_previous_nas_count_dl, v_message ) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch."); setverdict(fail); } else { log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); var NG_PDU_SESSION_ESTABLISHMENT_ACCEPT v_ng_pdu_session_establishment_accept; if (decvalue(v_bs, v_ng_pdu_session_establishment_accept) != 0) { - log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); + log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload"); setverdict(inconc); } else { log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_establishment_accept: ", v_ng_pdu_session_establishment_accept); @@ -1177,17 +1177,17 @@ module LibNGAP_Functions { v_expected_message.pdu_Session_Establishment_Accept := v_ng_pdu_session_establishment_accept; if (not(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI))) { log(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI)); // Log mismatch - log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_ESTABLISHMENT_ACCEPT"); setverdict(pass); } } } } // End of 'for' statement } else { - log("*** " & __SCOPE__ & ": FAIL: No items in pDUSessionResourceSetupListSUReq. ***"); + log("*** " & __SCOPE__ & ": FAIL: No items in pDUSessionResourceSetupListSUReq."); setverdict(fail); } break; // Break the loop as the relevant IE has been processed @@ -1273,10 +1273,10 @@ module LibNGAP_Functions { ))); f_NASPDU_Get(vc_recvNGAP_PDU) if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_RELEASE_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_RELEASE_REQUEST mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_RELEASE_REQUEST mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_RELEASE_REQUEST ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_RELEASE_REQUEST"); setverdict(pass); } } @@ -1341,6 +1341,64 @@ module LibNGAP_Functions { setverdict(pass); } + function f_await_pdu_session_resource_release_command() runs on NGNASComponent { + log(">>> f_await_pdu_session_resource_release_command"); + + // Await NG_PDU_SESSION_RELEASE_COMMAND + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_DL_NAS_TRANSPORT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { + log("f_await_pdu_session_resource_release_command: Unexpected NG_PDU_SESSION_RELEASE_COMMAND"); + setverdict(fail); + } else { + log("f_await_pdu_session_resource_release_command: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); + var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); + var NG_PDU_SESSION_RELEASE_COMMAND v_ng_pdu_session_release_command; + if (decvalue(v_bs, v_ng_pdu_session_release_command) != 0) { + log("f_await_pdu_session_resource_release_command: Failed to decode dl_Nas_Transport payload"); + setverdict(inconc); + } else { + log("f_await_pdu_session_resource_release_command: v_ng_pdu_session_release_command: ", v_ng_pdu_session_release_command); + var NG_NAS_DL_Message_Type v_expected_message; + v_expected_message.pdu_Session_Release_Command := v_ng_pdu_session_release_command; + if (not(match(v_expected_message, mw_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit))))) { + log(match(v_expected_message, mw_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit)))); // Log mismatch + log("f_await_pdu_session_resource_release_command: FAIL: NG_PDU_SESSION_RELEASE_COMMAND mismatch."); + setverdict(fail); + } else { + log("f_await_pdu_session_resource_release_command: PASS: Expected NG_PDU_SESSION_RELEASE_COMMAND"); + setverdict(pass); + } + } + } + } + + function f_await_pdu_session_resource_release_request_await_pdu_session_resource_release_command() runs on NGNASComponent { + // Await NG_PDU_SESSION_RELEASE_REQUEST + f_await_pdu_session_resource_release_request(); + // Await NG_PDU_SESSION_RELEASE_COMMAND + f_await_pdu_session_resource_release_command(); + } + + function f_send_pdu_session_resource_release_request_await_pdu_session_resource_release_command() runs on NGNASComponent { + // Send NG_PDU_SESSION_RELEASE_REQUEST + f_send_pdu_session_resource_release_request(); + // Await NG_PDU_SESSION_RELEASE_COMMAND + f_await_pdu_session_resource_release_command(); + } + // function f_await_pdu_session_resource_setup_request_await_session_resource_setup_response() runs on NGNASComponent { // log(">>> f_await_pdu_session_resource_setup_request_await_session_resource_setup_response"); @@ -1419,10 +1477,10 @@ module LibNGAP_Functions { vc_previous_nas_count_dl, v_message ) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_CONFIGURATION_UPDATE_COMMAND mismatch. ***"); + log("f_await_configuration_update_command: NG_CONFIGURATION_UPDATE_COMMAND mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_CONFIGURATION_UPDATE_COMMAND ***"); + log("f_await_configuration_update_command: PASS: Expected NG_CONFIGURATION_UPDATE_COMMAND"); setverdict(pass); } log("v_message: ", v_message); @@ -1641,8 +1699,8 @@ module LibNGAP_Functions { if (match(vc_recvNgNasUl_Msg, mw_NG_DEREGISTRATION_REQUEST_MO)) { log("Received NG_DEREGISTRATION_REQUEST_MO NAS message"); } else { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); + log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); } } @@ -1667,10 +1725,10 @@ module LibNGAP_Functions { vc_previous_nas_count_dl, v_message ) == false) { - log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_DEREGISTRATION_ACCEPT_MO ***"); + log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_DEREGISTRATION_ACCEPT_MO"); setverdict(pass); } log("v_message: ", v_message); @@ -1697,10 +1755,10 @@ module LibNGAP_Functions { vc_previous_nas_count_dl, v_message ) == false) { - log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch."); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_DEREGISTRATION_ACCEPT_MO ***"); + log("*** " & __SCOPE__ & ": PASS: Expected mw_NG_DEREGISTRATION_ACCEPT_MO"); setverdict(pass); } log("v_message: ", v_message); -- GitLab From 2e9c578050a133f32e535f177037abb494f41b86 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 30 Mar 2026 10:01:43 +0200 Subject: [PATCH 074/151] Replace PX_PLMN by PX_PLMN_IDENTITY --- etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 2 +- etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 2 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 16 ++++++++-------- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ index b71cf03..b8188c3 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ @@ -34,7 +34,7 @@ Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := '00000000000000000000000 Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B -Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_PLMN_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '696d73692d3939393730303030303030'H; // imsi-99970000000 diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ index e0d91b9..9ff4988 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -34,7 +34,7 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B # https://www.binaryhexconverter.com/hex-to-binary-converter -Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_PLMN_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 6a929a2..112f09e 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -35,7 +35,7 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B # https://www.binaryhexconverter.com/hex-to-binary-converter -Lib_NG_NAS_Pixits.PX_PLMN := '00f110'O; +Lib_NG_NAS_Pixits.PX_PLMN_IDENTITY_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 3fcadbe..802477b 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -842,7 +842,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN, + PX_PLMN_IDENTITY, * } ), @@ -967,7 +967,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN, + PX_PLMN_IDENTITY, * } ), @@ -1088,7 +1088,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN, + PX_PLMN_IDENTITY, * } ), @@ -1209,7 +1209,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN, + PX_PLMN_IDENTITY, * } ), @@ -1252,7 +1252,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1434,7 +1434,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1566,7 +1566,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1641,7 +1641,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN & + PX_PLMN_IDENTITY & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier -- GitLab From ae3a473d1dbc68e7137f8c4e188d3c20f6538df0 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 30 Mar 2026 10:16:46 +0200 Subject: [PATCH 075/151] Editorial changes --- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 112f09e..a3bfd3e 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -9,19 +9,20 @@ NGAP_Pics.PICS_NGAP_GNB_IUT := false LibNGAP_Pics.PICS_OFFLINE_MODE := true # 5GRegAuthSec_deReg.pcap -LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" -LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O -LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B -LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B -LibNGAP_Pixits.PX_AMF_POINTER := '000000'B -LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B -LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" -LibNGAP_Pixits.PX_TACode := '000001'O -LibNGAP_Pixits.PX_SST := '01'O -LibNGAP_Pixits.PX_SD := '000009'O -LibNGAP_Pixits.PX_PAGING_DRX := v128 +LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O; +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v128 Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B @@ -35,7 +36,7 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B # https://www.binaryhexconverter.com/hex-to-binary-converter -Lib_NG_NAS_Pixits.PX_PLMN_IDENTITY_IDENTITY := '00f110'O; +LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 @@ -101,7 +102,7 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma # Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE #NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration -NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 +#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_REJ_01 #NG_NAS_TestCases.TC_5GNAS_AMF_DLN_ACC_01 -- GitLab From 2bc0ea87dfe9bde2399b216d2c4eb0fe2ffb6404 Mon Sep 17 00:00:00 2001 From: juvancic Date: Mon, 30 Mar 2026 10:48:26 +0200 Subject: [PATCH 076/151] nochange --- ccsrc/Externals/ia2_128.cc | 6 +++--- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 4 ++-- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn | 5 +++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ccsrc/Externals/ia2_128.cc b/ccsrc/Externals/ia2_128.cc index 245c42b..8d3bf3c 100644 --- a/ccsrc/Externals/ia2_128.cc +++ b/ccsrc/Externals/ia2_128.cc @@ -253,7 +253,7 @@ int ia2_128::mac(const uint8_t algo_id, loggers::get_instance().error("ia2_128::mac: Failed to generate block for CMAC"); return -1; } - + // Compute CMAC using OpenSSL // Note: CMAC functions are deprecated in OpenSSL 3.0+, but we use them for compatibility // with older versions. For OpenSSL 3.0+, consider using EVP_MAC API instead. @@ -261,7 +261,7 @@ int ia2_128::mac(const uint8_t algo_id, // CMAC for AES-128 produces 16 bytes, but we need only 4 bytes (32 bits) for 128-EIA2 unsigned char cmac_output[16]; size_t cmac_len = sizeof(cmac_output); - + // Use deprecated CMAC API for compatibility with OpenSSL 1.x CMAC_CTX* ctx = CMAC_CTX_new(); if (!ctx) { @@ -290,7 +290,7 @@ int ia2_128::mac(const uint8_t algo_id, goto cleanup; } #pragma GCC diagnostic pop - + // 128-EIA2 produces 32-bit (4-byte) MAC // Truncate CMAC output to 4 bytes (take the first 4 bytes) std::memcpy(*mac, cmac_output, MAC_SIZE); diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 6b63241..423374d 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4027,8 +4027,8 @@ module NGAP_TCFunctions { * @desc Testcase function for TC_NGAP_aMF_PDU_01 */ function f_TC_NGAP_AMF_PDU_01() runs on aMFNGAPComponent { - // Local variables - + // Local + // Preamble f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 63f196d..1e0e44c 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -99,7 +99,7 @@ module Lib_NG_NAS_Security_Functions { // Set security algorithm f_5g_security_context(v_ng_security_mode_command, p_NasSecurityByRef); - + log(">>> f_Check_5GAKA_NAS_DL_Message: p_NasSecurityByRef: ", p_NasSecurityByRef); // New context p_previous_nas_count_dl := f_NasCountInit(); @@ -113,7 +113,8 @@ module Lib_NG_NAS_Security_Functions { tsc_DirectionDL); log("f_Check_5GAKA_NAS_DL_Message: v_calculated_mac: ", v_calculated_mac); if (v_calculated_mac != v_message.security_Protected_Nas_Message.messageAuthenticationCode) { - log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed"); + //ORG log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed"); + log("f_Check_5GAKA_NAS_DL_Message: Integrity check failed - mac: ", v_message.security_Protected_Nas_Message.messageAuthenticationCode); return false; } var integer v := oct2int(p_previous_nas_count_dl); -- GitLab From 93804a4cfcf3dfd32b213a9c109781174f809351 Mon Sep 17 00:00:00 2001 From: juvancic Date: Mon, 30 Mar 2026 14:25:42 +0200 Subject: [PATCH 077/151] insert test sets for integrity algorithm 133401 c2.1-c2.4 --- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 49 ++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index d6a2a10..7813fb0 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2995,12 +2995,59 @@ module NG_NAS_TestCases { var octetstring v_mac_text_computed := fx_NG_NasIntegrityAlgorithm(v_plain_text, v_nas_enc_alg, oct2bit(v_ik), v_nas_count, v_bearer_id, 1) if (not(match(v_mac_text_computed, v_mac_text))) { - log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed' did not return the expected value. ***"); + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed-2' did not return the expected value. ***"); setverdict(fail); } else { log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); } + //@see ETSI TS 133 401 V18.3.0 (2025-04) C.2.1 Test Set 1 + var O16_Type v_ik1 := '2bd6459f82c5b300952c49104881ff48'O; // Integrity key + var NasCount_Type v_nas_count1 := '38a6f056'O; // NAS Count + var bitstring v_nas_enc_alg1 := '0010'B ; // 128-NEA3 128-bit AES algorithm + var B5_Type v_bearer_id1 := '11000'B; // Bearer ID (Signalling) + var octetstring v_plain_text1 := '3332346263393840'O; + var O4_Type v_mac_text1 := '118c6eb8'O; // Expected mac text + + var octetstring v_mac_text_computed1 := fx_NG_NasIntegrityAlgorithm(v_plain_text1, v_nas_enc_alg1, oct2bit(v_ik1), v_nas_count1, v_bearer_id1, 0) + if (not(match(v_mac_text_computed1, v_mac_text1))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed-1' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed-1' returned the expected value ***"); + } + + //@see ETSI TS 133 401 V18.3.0 (2025-04) C.2.3 Test Set 3 + var O16_Type v_ik3 := '7e5e94431e11d73828d739cc6ced4573'O; // Integrity key + var NasCount_Type v_nas_count3 := '36af6144'O; // NAS Count + var bitstring v_nas_enc_alg3 := '0010'B ; // 128-NEA3 128-bit AES algorithm + var B5_Type v_bearer_id3 := '11000'B; // Bearer ID (Signalling) + var octetstring v_plain_text3 := 'b3d3c9170a4e1632f60f861013d22d84b726b6a278d802d1eeaf1321ba5929dc'O; + var O4_Type v_mac_text3 := '1f60b01d'O; // Expected mac text + + var octetstring v_mac_text_computed3 := fx_NG_NasIntegrityAlgorithm(v_plain_text3, v_nas_enc_alg3, oct2bit(v_ik3), v_nas_count3, v_bearer_id3, 1) + if (not(match(v_mac_text_computed3, v_mac_text3))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed-3' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed-3' returned the expected value ***"); + } + + //@see ETSI TS 133 401 V18.3.0 (2025-04) C.2.3 Test Set 4 + var O16_Type v_ik4 := 'd3419be821087acd02123a9248033359'O; // Integrity key + var NasCount_Type v_nas_count4 := 'c7590ea9'O; // NAS Count + var bitstring v_nas_enc_alg4 := '0010'B ; // 128-NEA3 128-bit AES algorithm + var B5_Type v_bearer_id4 := '10111'B; // Bearer ID (Signalling) + var octetstring v_plain_text4 := 'bbb057038809496bcff86d6fbc8ce5b135a06b166054f2d565be8ace75dc851e0bcdd8f07141c495872fb5d8c0c66a8b6da556663e4e461205d84580bee5bc7e'O; + var O4_Type v_mac_text4 := '6846a2f0'O; // Expected mac text + + var octetstring v_mac_text_computed4 := fx_NG_NasIntegrityAlgorithm(v_plain_text4, v_nas_enc_alg4, oct2bit(v_ik4), v_nas_count4, v_bearer_id4, 0) + if (not(match(v_mac_text_computed4, v_mac_text4))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed-4' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_mac_text_computed-4' returned the expected value ***"); + } setverdict(pass) } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01 -- GitLab From 21eb3ef18720abcca85ca9c7482edddafea0e68b Mon Sep 17 00:00:00 2001 From: juvancic Date: Mon, 30 Mar 2026 14:40:41 +0200 Subject: [PATCH 078/151] insert test sets for integrity algorithm 133401 c2.1-c2.4 --- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 7813fb0..f6cfe7c 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2998,7 +2998,7 @@ module NG_NAS_TestCases { log("*** " & __SCOPE__ & ": ERROR: 'v_mac_text_computed-2' did not return the expected value. ***"); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": 'v_mac_text_computed' returned the expected value ***"); + log("*** " & __SCOPE__ & ": 'v_mac_text_computed-2' returned the expected value ***"); } //@see ETSI TS 133 401 V18.3.0 (2025-04) C.2.1 Test Set 1 -- GitLab From c75c00be107dd6f6e6ba0139de2c10bd73c3db4a Mon Sep 17 00:00:00 2001 From: pintar Date: Wed, 8 Apr 2026 00:23:39 +0200 Subject: [PATCH 079/151] PDU test updated --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 45 ++++++++++--------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 018c3f7..389156c 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -157,6 +157,7 @@ Package TP_AMF { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing security_header_type set to INTEGRITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, authentication_parameter_AUTN containing AUTN indicating value PX_WRONG_MAC_CODE;;; to the GNB entity @@ -577,7 +578,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DLN_ACC_01 - Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_REQUEST from the UE and responds with a DL NAS transport message containing a PDU SESSION ESTABLISHMENT ACCEPT." + Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_REQUEST from the UE and responds with a DL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_ACCEPT." Reference "ETSI TS 124 501 [1], Clauses 5.4.5, 6.4.1, 8.2.10 and 8.2.11" @@ -592,38 +593,26 @@ Package TP_AMF { Expected behaviour ensure that { - when { + when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to UL_NAS_TRANSPORT, - payload_container containing - payload_container_type set to "N1 SM information", - number_of_optional_IEs set to 1, - optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_REQUEST;, - old_PDU_session_ID;; - from the GNB entity -// BPIN: Above expected behaviour need to be checked once again, and updated (one sample is below but need to be checked again) -// the IUT entity receives an UPLINK_NAS_TRANSPORT containing -// NAS_PDU containing -// extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, -// security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, -// message_type set to UL_NAS_TRANSPORT, -// payload_container_type set to "N1 SM information", -// payload_container containing -// 5GSM_PDU containing -// extended_protocol_discriminator set to 5GS_SESION_MANAGEMENT_MESSAGES, -// message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, -// PDU_session_type set to "IPv4", -// SSC_mode set to "SSC mode 1";;, -// pDU_session_identity set to PX_PDU_session_identity, -// request_type set to "Initial request", -// s_NSSAI containing -// sst set to PX_SST, -// sd set to PX_SD;, -// dNN set to PX_DNN;; -// from the GNB entity + payload_container_type set to "N1 SM information", + payload_container containing + 5GSM_PDU containing + extended_protocol_discriminator set to 5GS_SESION_MANAGEMENT_MESSAGES, + message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, + PDU_session_type set to "IPv4", + SSC_mode set to "SSC mode 1";;, + pDU_session_identity set to PX_PDU_session_identity, + request_type set to "Initial request", + s_NSSAI containing + sst set to PX_SST, + sd set to PX_SD;, + dNN set to PX_DNN;; + from the GNB entity } then { the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing -- GitLab From 4c24ded9c4fc7d932deaab4f8dcb4ec47128f6d0 Mon Sep 17 00:00:00 2001 From: pintar Date: Fri, 10 Apr 2026 08:32:36 +0200 Subject: [PATCH 080/151] Update of *IDN and *CNF TPs --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 38 ++++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 389156c..0b5a93c 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -133,7 +133,7 @@ Package TP_AMF { (.) at time point start_trigger_T3560 : event AUTHENTICATION_REQUEST occurs } then { - (!) 6s after start_trigger_T3560 : the IUT entity aborts AUTHENTICATION_REQUEST procedure + (!) 6s after start_trigger_T3560 : the IUT entity aborts an AUTHENTICATION_REQUEST procedure (Note 1: "It is not expected to receive another AUTHENTICATION message on the N2N1 interface.") } } @@ -500,7 +500,7 @@ Package TP_AMF { AMF_Region_ID indicating value PX_AMF_REGION_ID, AMF_Set_ID indicating value PX_AMF_SET_ID, AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value PX_5G_TMSI;;; + 5G_TMSI indicating value PX_UNASSIGNED_5G_TMSI;;; from the GNB entity } then { @@ -525,7 +525,8 @@ Package TP_AMF { Test Purpose { TP Id TP_5GNAS_AMF_CNF_COM_01 - Test objective "Verify that the IUT initiates the generic UE configuration update procedure by sending a CONFIGURATION_UPDATE_COMMAND message including only NITZ-related information elements, and either does not include the Configuration update indication IE or includes it with the Acknowledgement requested bit set to '0'." + //Test objective "Verify that the IUT initiates the generic UE configuration update procedure by sending a CONFIGURATION_UPDATE_COMMAND message including only NITZ-related information elements, and either does not include the Configuration update indication IE or includes it with the Acknowledgement requested bit set to '0'." + Test objective "Verify that the IUT does not retransmit CONFIGURATION_UPDATE_COMMAND containing only NITZ-related information elements when acknowledgement has not been requested." // Example trigger observed in implementation: CONFIGURATION_UPDATE_COMMAND sent after PDU_SESSION_ESTABLISHMENT_REQUEST; // note that the base specification does not explicitly define when the CONFIGURATION_UPDATE_COMMAND shall be sent. @@ -543,28 +544,37 @@ Package TP_AMF { Expected behaviour ensure that { when { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + (.) at time point start_CUC_event :the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to CONFIGURATION_UPDATE_COMMAND, - Full_name_for_network indicating value RV_FULL_NAME_FOR_NETWORK, - Short_name_for_network indicating value RV_SHORT_NAME_FOR_NETWORK, - Local_time_zone indicating value RV_LOCAL_TIME_ZONE, - Universal_time_and_local_time_zone indicating value RV_UTC_TIME_ZONE, - Daylight_saving_time indicating value RV_DAYLIGHT_SAVING_TIME, + Full_name_for_network, + Short_name_for_network, + Local_time_zone, + Universal_time_and_local_time_zone, + Daylight_saving_time, not Configuration_update_indication OR Configuration_update_indication containing Acknowledgement_requested set to 0 ;;; to the GNB entity } - then { - the IUT entity does not receive an UPLINK_NAS_TRANSPORT containing +// then { +// the IUT entity does not receive an UPLINK_NAS_TRANSPORT containing +// NAS_PDU containing +// message_type set to CONFIGURATION_UPDATE_COMPLETE;; +// from the GNB entity +// } + then { + (!) 6s after start_CUC_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - message_type set to CONFIGURATION_UPDATE_COMPLETE;; - from the GNB entity - } + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to CONFIGURATION_UPDATE_COMMAND;; + to the GNB entity + (Note 1: "It is not expected to receive another CONFIGURATION_UPDATE_COMMAND message on the N2N1 interface.") + } } } // end TP_5GNAS_AMF_CNF_COM_01 -- GitLab From dd7bbd72cedf595983e6b92d1ae5517aecfc940f Mon Sep 17 00:00:00 2001 From: pintar Date: Mon, 20 Apr 2026 17:25:41 +0200 Subject: [PATCH 081/151] Update of AUT_REQ_02 and *CNF TPs --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 0b5a93c..003e1ed 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -93,7 +93,8 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_RESPONSE, authentication_response_parameter containing - Authentication_response_parameter_IEI indicating value PX_INVALID_AUTHENTICATION_RESOINSE_VALUE;;; + //Authentication_response_parameter_IEI indicating value PX_INVALID_AUTHENTICATION_RESOINSE_VALUE;;; + RES indicating value PX_INVALID_RES_VALUE;;; from the GNB entity } then { @@ -560,14 +561,9 @@ Package TP_AMF { ;;; to the GNB entity } -// then { -// the IUT entity does not receive an UPLINK_NAS_TRANSPORT containing -// NAS_PDU containing -// message_type set to CONFIGURATION_UPDATE_COMPLETE;; -// from the GNB entity -// } then { - (!) 6s after start_CUC_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing + // PX_CUC_TWAIT value for timer awaiting no response after CUC message + (!) PX_CUC_TWAIT after start_CUC_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, -- GitLab From 7238dba7a8e13ea7e4fc72c3f70c5e037eeaee4d Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Mon, 20 Apr 2026 19:27:02 +0000 Subject: [PATCH 082/151] More detailed TP_5GNAS_AMF_CNF_COM_01 --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 003e1ed..68a642b 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -526,8 +526,7 @@ Package TP_AMF { Test Purpose { TP Id TP_5GNAS_AMF_CNF_COM_01 - //Test objective "Verify that the IUT initiates the generic UE configuration update procedure by sending a CONFIGURATION_UPDATE_COMMAND message including only NITZ-related information elements, and either does not include the Configuration update indication IE or includes it with the Acknowledgement requested bit set to '0'." - Test objective "Verify that the IUT does not retransmit CONFIGURATION_UPDATE_COMMAND containing only NITZ-related information elements when acknowledgement has not been requested." + Test objective "Verify that the IUT does not retransmit a CONFIGURATION_UPDATE_COMMAND containing only NITZ-related information elements when the Configuration update indication IE is absent or indicates that acknowledgement is not requested." // Example trigger observed in implementation: CONFIGURATION_UPDATE_COMMAND sent after PDU_SESSION_ESTABLISHMENT_REQUEST; // note that the base specification does not explicitly define when the CONFIGURATION_UPDATE_COMMAND shall be sent. @@ -569,7 +568,7 @@ Package TP_AMF { security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to CONFIGURATION_UPDATE_COMMAND;; to the GNB entity - (Note 1: "It is not expected to receive another CONFIGURATION_UPDATE_COMMAND message on the N2N1 interface.") + (Note 1: "It is not expected to receive a retransmission of the same NITZ-only CONFIGURATION_UPDATE_COMMAND on the N2N1 interface.") } } } // end TP_5GNAS_AMF_CNF_COM_01 -- GitLab From a31c5cffaa64c76e1fbe9e8b3a98e77ce1fdca7d Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Mon, 20 Apr 2026 19:40:09 +0000 Subject: [PATCH 083/151] TP_5GNAS_AMF_AUT_REQ_02 - Test Objective change and removal of old commented line --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 68a642b..c038f8b 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -70,7 +70,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_AUT_REQ_02 - Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message correctly upon receipt of an AUTHENTICATION_RESPONSE containing invalid authentication response parameters." + Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value." Reference "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" @@ -93,7 +93,6 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_RESPONSE, authentication_response_parameter containing - //Authentication_response_parameter_IEI indicating value PX_INVALID_AUTHENTICATION_RESOINSE_VALUE;;; RES indicating value PX_INVALID_RES_VALUE;;; from the GNB entity } -- GitLab From d2e77284ae201a8ddd924ab96ba3c560833c42e1 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 21 Apr 2026 07:43:06 +0200 Subject: [PATCH 084/151] Add template mw_NG_REGISTRATION_COMPLETE_noSOR --- Makefile | 4 +- NAS_ETSI.code-workspace | 3 + captures/TC_NGAP_AMF_CMP_01.pcap | Bin 3104 -> 2940 bytes captures/TC_NGAP_AMF_CMP_02.pcap | Bin 3490 -> 3490 bytes captures/TC_NGAP_AMF_CMP_03.pcap | Bin 3490 -> 3818 bytes captures/TC_NGAP_AMF_PDU_01.pcap | Bin 4068 -> 4232 bytes captures/TC_NGAP_AMF_PDU_02.pcap | Bin 4112 -> 4030 bytes etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 2 +- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 8 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 8 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 70 ++---- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 5 +- .../lib/LibNGAP_EncdecDeclarations.ttcn | 3 +- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 30 ++- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 211 +++++++++--------- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 160 +++++++++---- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 14 +- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 2 + ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 14 ++ 20 files changed, 296 insertions(+), 240 deletions(-) diff --git a/Makefile b/Makefile index e3d4a61..1a04595 100644 --- a/Makefile +++ b/Makefile @@ -118,11 +118,11 @@ $(bindir)/$(ATS)$(EXE): $(gen_objects) $(cc_objects) g++ -g -O0 -std=c++17 -o $@ $(LDFLAGS) $(gen_objects) $(cc_objects) $(libs) $(gen_objects) :%.o :%.cc - g++ -g -O0 -std=c++17 -c $(addprefix -D, $(defines)) $(addprefix -I, $(includes)) -o $@ $< + g++ -g -O0 -std=c++17 -Wno-long-long -flarge-source-files -Wmisleading-indentation -fPIC -c $(addprefix -D, $(defines)) $(addprefix -I, $(includes)) -o $@ $< $(cc_objects) : $(outdir)/%.o : %.cc mkdir -p $(dir $@) - g++ -g -O0 -std=c++17 -c $(addprefix -D, $(defines)) $(addprefix -I, $(includes)) -o $@ $< + g++ -g -O0 -std=c++17 -Wno-long-long -flarge-source-files -Wmisleading-indentation -fPIC -c $(addprefix -D, $(defines)) $(addprefix -I, $(includes)) -o $@ $< #$(gen_sources): # $(TTCN3_DIR)/bin/asn1_compiler $(TTCN3_COMPILER_OPTIONS) -o $(outdir) $(tt_sources) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index a72cd0f..8b89674 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -11,6 +11,9 @@ }, { "path": "../UERANSIM" + }, + { + "path": "../../tmp/titan_5gngap_per_issue" } ], "settings": { diff --git a/captures/TC_NGAP_AMF_CMP_01.pcap b/captures/TC_NGAP_AMF_CMP_01.pcap index 2d84e6fa1b4f294ddddabc0988254075f20ea185..0cebcdfd4508579d17a7c0ecfc62c3f0d875e098 100644 GIT binary patch literal 2940 zcmca|c+)~A1{MYcU}0cnU|`t!;Yy}WI~PL`0|OW%l%g&0^FI6!Ja^nn$Oq9B?} zmw^%8?I4?%hVe24F*1NL%uEmsvY8PYI@Wq1TR|pHswOTvN)x&dBj${nF?P?ILMIng44Ke~td!KilIt$V6mZd}#KW^1iPrFtNW*c3i50 zOC;nNxEM;;6rN^cm@^S%A50#Z=9vbHSq6p%CI*#5@$A1+%x7MR6o`NQ_oaz^lFoW(F&8zJggQ%Am%;z|0`cz{xQ4Cwl+`0|O&N8Urs#nh_+z04iNX z9T*)L7(i}MZ{TIHV_*PdkQx{UyWQY%G05hKb0Awmwj;ZpnSnt7Y%}BhYam@9(-$;aA|Uyzz-nqI7%n44z6 zkifvf0P+YEg9AgD1LJ>&00s^aAM7!(pTsBQ^AiIz$Q3sBApd||f*hJ4KY?ArIR6yL zAs{~`?BZo;V_*PdkQfYu{Zzrg0y53|8#dDzm>I&3IXo8z#{oziKZ6qk11m!)sC;5j zV~`N9V{oiw;ANcolN}@t!UB3sA3iWtGVnXh{K+n45+Gy%mSkjza$uBTC~yFkFCbSP zdd15yiGcx(LHb}A?5dW>r65;DRDk>kav7F*69$)!AZ^SHL8lAXlz}TH1_m1j76&^} z3gQC066RKItvZG<1||ju#l;NA)4axGTQ zfuyV!Wj=;J1_m$&Sp&mh7d9}kf?R0*7UVjRE3w2v8IlVFjyXIR0T=8bWAq$s7#LU> zP+ce{TE`HsE3o>3?}YDejzP;>_SCNQdS=Q{>3|-VpzzBG;$x^{U;tx~kuVH)UC!e& zkn1A)K`sNi5KH)pAi2)^bm5wE21alQg2GQ7GyFt^>zLhGDQTZagjr`65CIh%l^ zEcFZwoL3zAWniip85mR!*&gX*U|hh!Aou@&Xk+{j1|9}B237`!1_lO}0}Ko-AR8Ju zc^Qlt7{C~&7es??P=VUu4l*5N3%|@2N3f|33=C`x3@rT4M>ExpIKb`$xf7%lhQTIa zxbZ|LsvEsFw0wiPao*q6chTJlvcbuS1MEJKJ7K1SXs``f+;}1rY%0`^!p=uCKTT(4 z$YNjsV~|c52AdEA^`%%n0|R3{0|RUC>1jML6^slFHs`t)$%Ea<_5c5Yow}D9SQ$7# zYC-gY6^x=FnoE~~5#8+|n|WujG6XR)fHBNW5Dl`K5gIzydLUatCQjq&Jq@;vfq{XE zfl-C6dBZQT&2kJ}hRb>D8Q2*)4Cejc63}%cBV2rF59Ksq5 zjG#PX?FsTND3n2Q3l3EV1_myM(a;2i7$_9=X0Q^@V}76z1cfAWI^||yU;&x1bspY4 z#srE78xfFhkSWOVz`)F41$AGXXgBk+^GlMh(C&SF2>;Vi642%qE47?yIMvw>t zs00*sV02($0NH$K9xH<#0|OX?)W9$(1uz)2z5&_1Efi!c$aZA6Gczy7H ziMeS83<(Sz3?Pp%F*q=UIWYcb2w>m<@xdMg`^k76K0h%qgIr-_5AqMlCCH%(@)Ot< zjPp-{90Kyw_8qJYZ43-x3=)H3u%9XzSU{#(f5T=P12aR|ft|Wnz;OW5#?Royz`)87 z3M!u%)EFeh>lhp>8F(3I{$vM9gRp=e(}xcXl??n2Gk>xRnFI(KfF&6jq8u0{7z!Lf z1!N2XZBrSZF|UVZec%x>vykJIEM4 z2O9 zu_ft|Xb+{g?vfkDq9 z88e)0ZR%J~{^U?$sAGsLXW%StPEc%24gC1AkU<$saui@>&|~@V;ll@gCPv0!Mg}aw z3HHVLAU1|)3=Cilwi`--eQ~4p1IQO!SAu*1@(GskyoTh9rH0FSn-~~D$&JB=fsdhK z0;teJj&2zSc2J%Nl>y+|o}rw9Q-*;LYH1vULfFjTwo4cD{AraefB%PJuGm|T)b1Bw zFNOUS>-qJ`T(6!%$$_J|AyKjQ|NoB+Y7Y8(bxg+HJNGiyF*q?YmNRgFn)#ERiNWCj z1M~S1c2HhqU| X22QYzjv)Vm{D~a8Y@qbQ!@vRn$Ui|N diff --git a/captures/TC_NGAP_AMF_CMP_02.pcap b/captures/TC_NGAP_AMF_CMP_02.pcap index 04d1c3fabb8c911849f9c73a514168d3600404fd..fc6a545f25036eef3bfb70eff5892ecaf40e3ce7 100644 GIT binary patch literal 3490 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 hlj2}7V_*PduvJh3Y@-GP57sMj+v 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 diff --git a/captures/TC_NGAP_AMF_PDU_01.pcap b/captures/TC_NGAP_AMF_PDU_01.pcap index 1f21fa20be6a51bc2f28cd1ed7c5f5110db79bde..eb642ea79397e5238ba025265e2200a7f0817ebb 100644 GIT binary patch literal 4232 zcmca|c+)~A1{MYcU}0cnU|@JtcRq90A~uE~1_m%j$TKi-Ft{=?xG*p{FgUc>sMj+v zu+%d!aBk(|mw~BbWMELa_LFTg1LFb)2D$(L*Y24+g@K2Gje(Vcp@D&c97#P49rWZtmZBT*Q;0`h!WDCE{RxYrq3=9lx3=Ax6_2)BLw=ptgF))BJNGA+~ zO^AV-AXd-7z*x_~z&g`(8V^hbBLjm?*`LWgU^jC8|8IXu@CgGe0|!Vgh(54_Q4~aT z=`t{)yB%b+1 z$H4XGLHT+Hc1DhLBZ)d5*?Id;ZCqY>l8dJ%dG20Qkcr6H*Ujw}&*VR4FfqP>vn@-` zERv98;9^)`{@@K0!%S05)=U-+qR_m$2}Sm}E3Izx5a(hIJ8 z7?}RMO4RY{a-X^T16dzFHYK5m&0JXO0EMv9Hbw?BMg}lORtpYc4F*O~`m^=~`4$w) zptuExDgy%p7sF_1f`f0!kfpK zK=EKB0@4jK1vwrVm>I0V`3h#KD1#aU12cm(11H1GpX>n)3=E76X$-s|X-1F;1E_Qn zbzpR0U;w#2WEUfY9RmXxgVew<*zE=z=YnkRS^}~aWIM9knHd-az&10^zXs9;GA-y7 zBSRSj0~mwEU>Iy##>RPI)3ULd#=y+r2F|4rEj9|Gpdba6lzglW`30$Yrs>7HiMeS8 z3<(Sz3?Pp%F*q=UIWYcb2w>m<@xdMg`zhlTK0h%qgIr-_5AqMlCCH%(@)Otm^2pHUUZ zae-Y4bE~#i9YYuc69a=Hi%b5`z6~wUiq||STyL@VzJh@F**xX$QwY)u`ptv#jSP(75CnyvI%fEZ2-h*+Vra5tsAGs_Vqp64 z;h`BL6F9XR+c7b0V_*PdkZ~{!cF76`HjqoKkAPeOat)T$x)I4G<@T2ZpEH202N|R1 zkc=5lwl;MvW@a0HGSo4|l{0XbHYX@HrUrieSjeD^B{>Q(GU%~<`0(L_J`*EjFe3w& z-~{_3Fp`M@6hR;ivKofLzPPb*A;=eso=GvwRqB>>&D8d*R7!>#z_(4A7a$sU$WC#V5ARF&Bv4YELP?-(33QB-&G}yQZ zWMkKSkZmAav4ryrn2jLQzBjSri8TfekZIPFKqi4qM0P&|GlQ%BCBc^rpaKo#20aHu zkkgSPNsWP>lmD|r5tcd&9lEG_=*AC;ACK6&~u2wG{?laj!EOys*Ox_ z4C#yvqI!&s2mk+{xKM+Up_+lcfq{#GftNvuu~CVUQI(S;Gp{7IC@-}HtA!w6Z)j%) zmr9`03FLGb28Ut8#>F6C<1IU1!NQP%nIYiKgYwM`j10^Skh0STl=)CYK~tlSX-Vn- zt4wtaA;y(8m2Hdcrr4ATzB<4E5j!S1~7)X3`B!n z_hjP|kn1{Mg5m=dFUT>>z|3&?&4cnS42$uOz|6 zT*r{X$l$KW$aqMQfs>Je&CrmM@joLQ^A{E7FDja>j9j`5OiGN5l?-f*3XY77oYf5c z4Gg?292^`RV2XtWDa3^s85HzE7B(?(@mS9~#b5v;7`hp_7(diAFt9T)%#&tl0~M1U z4D29^lhJ`8&jDF2C-+|EuWQ)H!C%AM2m2x1{VHj*n z$i`(LTe`|YHh^rx;^sFkZmAak^KbNL2 z4F+DYjkefqWCPVpJPa({_2)DB&oP4g@u2=Z%mfe(HU-*SMfBxg{Xp%@-}xq`0uCv; g|NoPj&qSd2he0-Io+F~4fz+3O^#g1wq-bRU0E=7ung9R* literal 4068 zcmca|c+)~A1{MYcU}0cnU|@Lk?MPsMj+v zu+%d!a5jeW%fM7IGBBu^{WILfz_@^cLGJ(m>=VnTGw?95F|aZ)G%zr*9AIEz0ohQv zgOkCCfdPzRdO4agh z2{BL;#OfIs80#4rSf8Al#sgEq$iQGTiB0zh*o|EO{|obP%4A?=-~g!w(FayAih^h^ zT?R&Uw}WgJo6F4*#K-`~Ff&0k$Yw@p=veE4Yz3J(jpxZJux$(s3``7+D%Z1%oxnEB zF>skQmUuF-GjjY`@v{5o8ePwaZa1^i`d(ZyVvY3znTU*?inFi(&}Ewh6JyuR4S621 zKthgzi@~#`(S(WN$tjS1FnMH}XBsGG85kOv7*y7NWGu)_o_4cxU&VoFnNA7M{x-Yn z{OfP*<&%#8Z%Zyf)`yQxNho477nV9eA*?W$o575c0gRE=f|ocpvJ(!%plFc$uRRLdjJCi10zEk120IL5hTI@DqTb! z7#$cGKyKGu#LZyGzyQV|H82czyTP}$Ae&vMfNTZXj_h`31_lAJ&5ZM}fpmdPJGGXZ zp^Sk6j6q^B3^py}+d8mm(b!C5U}kUw=Te9k8wF8Nkb+7|KGuf(g48_I^kUt_+%yA* z1O^TUkVlvp92mkJ82>W_FmQnQV2^?QbZad>KQS@ZUW^q4+;V5nr^cbNH;UC1Or$N((K$PnegD8W$R05S;Vs+dFE z44@(kgkgF?G}u)w-`0a%dIIgM)#426Fdo2uvL@j+77 ztvB2ZeGCj>46+7>!7glIU$jZw5wi2!g^-9W(qygzK1Xmp*vHP{$C<#K837!$UJhCU9!~ zE5pOEje!A-VXgqtV3(|5U<0|t`UuDsAlG0CCvPN|lne83%3%Om4>Cf}AsI8AY;EdT z6tfk6G1M`{l{0XbHYX@HrUrieSjeD^B{>Q(GU%~<`0(L_J`*EjFe3w&-~{`^$)1Pd z83O|tgRF*OurF?W+X(W7%L|YXKt90|o;gUqSZdN(;={lQN^T4`415d?6F`L)a&*fu zu!HhEs0;wt_6+3=oH7i2P+Q{|6bi1b;Bt|V_J4cF|Hi}rx6~?+s+=p5S-YY+xkPTm z#t9V+N)8;w4T*}a|NnnvP;=1Nt7H0k=Dj^*9fK1iV>tu&rgm-Z35Zo+7Ge~ zWGj|%&V|_sGHszUB*s872Q>&xfla%?zyUJNdJ@Pakcr6dXJBS<73SZR#{eqOKzj5X z3_(sujwCe(Zmv3}ccQscjCBmo*isHSrRE9qZ^~x?H#iv>81x*XFwHSBu4B4=yfKcc zjv<|qK~#^C@!!+%a zQVCQ#ft(J*U|%3!EO%jNd`$10$dzC85uyX6LVu=_{0FgFqeU7u8JLt987mps7!@2D89A#N_!}5_ zSvWX2IKUJO3sQ&+F)}FVgDh-f;Nr2Kb&A0NL@;zSa4~+UXJBAwV3@gup$$|_b}+Dm zC{9KPhCBykwV)7Ccf*&)88|^9U}FjLJt!2AQzf+i_G4h2?+XeukZJFt7#PwRAQ&VD z!{G3YVBi9qCVE*~o)T0-1;$A`Hw78p8aW3L&i{1_lN#1`+fW%J0DF0&=rs2{X7P1C?kX(_t8F zOUSovAX{A1K{kMF!s6yaqW-#!8Y_$FdvJGS_vcEu~1hHWONCU`AptvexU|`?`2`Fen;|i%2R diff --git a/captures/TC_NGAP_AMF_PDU_02.pcap b/captures/TC_NGAP_AMF_PDU_02.pcap index 7c52cc3261f9d54c43fd1db34955961a23d10603..028238c85cb69583a2de6f50a5fdc39e1ce7fae2 100644 GIT binary patch literal 4030 zcmca|c+)~A1{MYcU}0cnU|=vibw1PMH77$50|OW%kFNg-)paQkQ9b`Jl7JixL`(RTU7#P?X7+7phozHCF!pM-tzyQV|oiGeG zAqHxKSUm#+V?6@{>(0(;JTMiE3=B5g-oL*Db|csS|LW5lKQpj0aDdc;=mRSlML{%| zE(0UF+d($Z-onTb#K-`~Ff&0k$Yw@p=veE4Yz3J(jb~>k*fs_R1||kZ6{d3INno4h z7`WVCy9h9_Gjja3-@@9Tzp?$8zO|G;M;K4NzS&lgiO6`8aXHha_wTpC#9Srk6sX@@ zBq7JZ#USAF+Kq`}XD7%$m^?DgGYu583=9oS3@Tq|vu0{$N%Jjx9Am$yhUd6I=`7Es zXR^vTl+ToRbGdpU>%+&UBowik3riiK5MHu{k-?0S0gRE=f69Cq$82}t&0|cU zc(4%x=?0mC91jf43|8QL1+!F?L5+cdnL(O?lVRph_5cP321bT7240XfBS?e+RJw>d zFgh?WfZXn~gOS0GfdPy`YG4@bc7vV4Ae)=sfouiYj_h`31_lAJ&5ZM}fpmdPdwi6U zp^Sk6j6q^B3^pxeX9(D|t=LRsU}kUw=Te9k8wF8Nkb+7|KGuf(g48_I^kUt_+%yA* z1O^TUkVlvp92mkJ82>W_FmQnQV2^?Q^zJA=KQS#$|nXj z1_|*x2FFSUUdEX}*+J4EETG5q;R8b@1HZ$}pX@>=0YU~~Nk)b!2Sy2o0tZm}0&-R1 zO-6=E3=Cil(g(v}SGDX61-Yte2FQOPmtl#wFW|Bfq>Y&&$nCX@Ah=RuV6b6eaj*lW zATF>gVQ$sds$&RaU}9iUd@%XUbA2Xufxm^1rqnFBsiq(xD!3@yWo84z|FbLZxSsmH z5t6dj|6ye4V_*PdkToz2c3}epE69b`Z$YjDxe`k(2qL*KKz(}SS8%}&GDgqAhJk^F z0o8?KqIC@6x&n$;dRDpznVR_;dG9(J%SAC%I-rLoDEuz4F)>szFn}@0NEimYE@x*L z$aPKYK`sNi5KH)dMRJ|B+iMpg21alQg2GQ7GyFt^>zFnF=09PmV~Ay9VEXXkp&26+ zIJE|17~S-f?{K8;Kz@J49ZxNqW~j=9?ORhA3o?aF){`-GGGZ#urGGl zGci14U;tx~)i4b9#f_ceAYU{&fqVe+36}8uhUAN-Zm(U085lvyjlqV2kD*}#sL(== zZW#u4P@V^s0pQx6p`3wJhJg=iYaD|@$JMHenLz?+2a=C$S@vAe@IvO+T!*L0_+qDMQC9k+F`!iIK6Kf&0_UpX^Kw4hI<6^F!D{ zd69vEQIv_1QIUy}A&wE0^FXQSa3B*y5(5JmL+u7rU|)wYu!DSUBM$O0$mdw%P8iA8 z%Ieb_zcYX$jDdkcfscV7DCVFBfhn+QHyAiTrddw{nFKNs+5HU646f?a8-Fl>3N(-& zJqJUO(~%=dje(o1j_Gk3V?SdZgEO|215T-V>eCy4GJqSL3=9l<4pErqm>AbF&B!gj z#8k(S&d4CD$H;i_|Nn^#H5eJH8Q2>bxEL6C8H5-cl^7XSIXN=(N>YpRQcJK}2=evi zY*uio1S*|CPKRNzuN!tof_#m)?EDD}Lk4Ds0JqmJA`FZS%nXpS(*~6JP(wjeqmJoz z{KC0RbqpcS{1X`b844Iu8S)rR8Qd9y-5T7J91I*89U43t89}bof5^)4iGcx(VJ-vF zVAnm_83lHoF(^Jj@q!$~49pCN-CnzhGBAR>8#WBG3=Qkh1JjG4p@+eNF|3a1g@=wG za~(qlBZIphBjX`K22Mr>HbX;3#{Z0L%wJTPzo=-kGIHrMFex!IRx+?LDmXGSa#l0& zH!$$BaBy&NfGHLhq!1TkWKhrtS=hwD#bZ6|6oUbXVCZJxV*F6gz`)MHu-=HF4OC2a zFtCFtPDTfYJO^a8pb!Xsh%b#ZaDqa>#uDUvP$(d$N@)Ep%D_0^7Zhe7(>PVxz@ zvBZ0tZT Q0=W!1jMzXm4i5th0QNHQG5`Po literal 4112 zcmca|c+)~A1{MYcU}0cnU|`r^c`TFb4HH8U0|OW%4agh z2{BL;#OfIs80#4rSg-D$#sgEq$iQIpu)@d_>_)Et|MhzWn;BRcI6!Ja^nn$Oq9B?} zmw^%8?I4>U?d4<$Vq^egn3*6NWHTc)bgcD2wt`HY#&dNy*fs_R1||kZ6`$ibTfsKV zF>oopSm49J&d8D6Cf5|y)k2uL@`6y$hdU}mra=PQ_{q6}&b49pDD44e!zf3gQKFfcGOq%rV5Wv6z;)6W~_S3Vo`257c4045yJ;*;Gmmr5G$WLHbFwQ>( zatO#z{?|Ae+87wX7$gS6U_Vtbuz*an{)Wvo24;pZ{T{&@$i+~_zyQV|BVicqx}2-6 zAlIcefLsQ0A(rri)GZ)w%na5_FBbSQFoHu66n^TM;U^+o$Na46d@Ms9Lo5>m(}xca z%@~=$sr95b7sECN1~3L02g6{OtYBaRxy1Si$Q2;hUnIJLtHrnXK8bSVqOiL-^1;-dD=AZ_FDX?ib7&t(tSx*9)1TqoX{S3?uuKGQK9SooX z4WviU!4TwhUMvV?U<7wJY#3x28rGo)rWZp)4}$|^SRKliW^8Qk?484n3Ea56Hm85%M&{%2%k{-VPCMMaa9kxQ3>Nr{oMl7Wp;!I6=X zvzmdwfq|EWgM)(uOtG*ag}4wSgMvQD!X^eT9_v}B7z{uJLpK8#gp zJYRCpNMKMnT6rvU(GNy^`LqjUYua{@`$0A%$0EoNU|T^wI|c>@kZHR9d<=CA3}6g% zKZpkVp@4xKWSaGNkVzmD(ef#%?(BxNj==c~d)>)Y-d=x`8Jxe^^cWd0Myd!gV#z@u z*Q`q51J|3N`V-^|7zVp0=V~{|HEC5Kmw;S^#c$n6`Nu}-#eyIPMo_;M-1g7_hcHUp zLsX=WNw7%Mm<60zS@jqhFRKVKf?U#6%LgudL1i$^6(Abyk`M+SkV|ZYK&}9}202_n zp$xHk0Z0SLQc(HZ!@$762@+7ygqFWZE&>> f_NGAP_amf_UE_PDU_SessionResourceResponse"); + function f_NGAP_amf_UE_PDU_SessionResourceSetupResponse() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_PDU_SessionResourceSetupResponse"); if (PICS_OFFLINE_MODE) { f_await_pdu_session_resource_setup_response(); } else { diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 739faa4..be5cd2a 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -997,14 +997,7 @@ module NGAP_TCFunctions { mw_ngap_succMsg( mw_n2_InitialContextSetupResponse( PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - { - PX_PDU_SESSION_ID, - ?, - * - } - } + PX_RAN_UE_NGAP_ID ) )); @@ -1145,14 +1138,7 @@ module NGAP_TCFunctions { mw_ngap_succMsg( mw_n2_InitialContextSetupResponse( PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - { - PX_PDU_SESSION_ID, - ?, - * - } - } + PX_RAN_UE_NGAP_ID ) )); @@ -1240,14 +1226,7 @@ module NGAP_TCFunctions { mw_ngap_succMsg( mw_n2_InitialContextSetupResponse( PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - { - PX_PDU_SESSION_ID, - ?, - * - } - } + PX_RAN_UE_NGAP_ID ) )); @@ -1368,14 +1347,7 @@ module NGAP_TCFunctions { mw_ngap_succMsg( mw_n2_InitialContextSetupResponse( PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - { - PX_PDU_SESSION_ID, - ?, - * - } - } + PX_RAN_UE_NGAP_ID ) )); @@ -1469,14 +1441,7 @@ module NGAP_TCFunctions { mw_ngap_succMsg( mw_n2_InitialContextSetupResponse_Failed( -, - -, - { - { - PX_PDU_SESSION_ID, - ?, - * - } - } + - ) )); @@ -4107,7 +4072,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_NGAP_amf_UE_PDU_SessionResourceResponse(); // f_send_pdu_session_resource_setup_response + f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -4135,7 +4100,7 @@ module NGAP_TCFunctions { f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request - f_NGAP_amf_UE_PDU_SessionResourceResponse(); // f_send_pdu_session_resource_setup_response + f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); f_sleep(1.0); // Sleep for a while to ensure the previous procedure is completed before triggering the release log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -4146,22 +4111,15 @@ module NGAP_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - vc_AMF_UE_ID, - vc_RAN_UE_ID - // { - // mw_pDUSessionResourceToReleaseItemRelCmd( - // vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, - // ?,//decmatch(mw_pDUSessionResourceReleaseCommandTransfer(?,-)),OCTETSTRING - // -//in template (omit) PDUSessionResourceToReleaseItemRelCmd.iE_Extensions p_iE_Extensions := omit - // ) - // } + mw_n2_PDUSessionResourceReleaseCommand( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, - mw_NG_DL_NAS_TRANSPORT, + mw_NG_PDU_SESSION_RELEASE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message @@ -4616,6 +4574,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); @@ -4711,6 +4670,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); @@ -4756,6 +4716,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); @@ -4810,6 +4771,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); @@ -4861,6 +4823,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); @@ -4964,6 +4927,7 @@ module NGAP_TCFunctions { // Local variables // Preamble + f_NGAP_amf_init(); f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_send_registration_request(); f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index f6cfe7c..0a0db59 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -2984,7 +2984,7 @@ module NG_NAS_TestCases { * @see ETSI TS 133 401 V18.3.0 (2025-04) C.2.2 Test Set 2 * @see RFC4493 */ - testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_02() runs on gNB_NGNAS_NGAPComponent system TestAdapter { var O16_Type v_ik := 'd3c5d592327fb11c4035c6680af8c6d1'O; // Integrity key var NasCount_Type v_nas_count := '398a59b4'O; // NAS Count @@ -3050,8 +3050,7 @@ module NG_NAS_TestCases { } setverdict(pass) - } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_01 - + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_02 /** * @desc Verify that the NAS integrity protection function is working correctly - 128-EEI3 (ZUC) diff --git a/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn b/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn index 75e2486..53bd800 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn @@ -36,11 +36,12 @@ module LibNGAP_EncdecDeclarations { external function fx_dec_PDUSessionResourceSetupResponseTransfer(inout bitstring pdu, out NGAP_IEs.PDUSessionResourceSetupResponseTransfer p) return integer with {extension "prototype(sliding) decode(PER:ALIGNED)"} - //with {extension "prototype(sliding) decode(LibNGAP_codec)"} external function fx_enc_PDUSessionResourceSetupRequestTransfer(NGAP_IEs.PDUSessionResourceSetupRequestTransfer p) return bitstring with {extension "prototype(convert) encode(PER:ALIGNED)"} + external function fx_dec_PDUSessionResourceSetupRequestTransfer(inout bitstring pdu, out NGAP_IEs.PDUSessionResourceSetupRequestTransfer p) return integer + with {extension "prototype(sliding) decode(PER:ALIGNED)"} external function fx_dec_PDUSessionResourceSetupUnsuccessfulTransfer(inout bitstring pdu, out NGAP_IEs.PDUSessionResourceSetupUnsuccessfulTransfer p) return integer with {extension "prototype(sliding) decode(PER:ALIGNED)"} diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 4695251..4fa70fe 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -14,6 +14,10 @@ module LibNGAP_Pixits { // LibCommon import from LibCommon_DataStrings all; + // Lib3GPP + import from CommonDefs all; + import from NAS_CommonTypeDefs all; + // LibNGAP import from NGAP_IEs language "ASN.1:1997" all; import from NGAP_CommonDataTypes language "ASN.1:1997" all; @@ -93,25 +97,25 @@ module LibNGAP_Pixits { * @desc * @see ETSI TS 138 413 V16.12.0 (2023-05) */ - modulepar TransportLayerAddress PX_TRANSPORT_LAYER_ADDRESS := oct2bit('0a0000a2'O); // 10.0.0.162 + modulepar TransportLayerAddress PX_TRANSPORT_LAYER_ADDRESS := oct2bit('7f000001'O); // 127.0.0.1 /** * @desc * @see ETSI TS 138 413 V16.12.0 (2023-05) */ - modulepar TransportLayerAddress PX_SOURCE_TRANSPORT_LAYER_ADDRESS := oct2bit('0a0000a2'O); // 10.0.0.162 + modulepar TransportLayerAddress PX_SOURCE_TRANSPORT_LAYER_ADDRESS := oct2bit('7f000001'O); // 127.0.0.1 /** * @desc * @see ETSI TS 138 413 V16.12.0 (2023-05) */ - modulepar TransportLayerAddress PX_MC_TRANSPORT_LAYER_ADDRESS := oct2bit('0a0000a2'O); // 10.0.0.162 + modulepar TransportLayerAddress PX_MC_TRANSPORT_LAYER_ADDRESS := oct2bit('7f000001'O); // 127.0.0.1 /** * @desc GPRS Tunneling Protocol - Tunnel Endpoint Identifier * @see ETSI TS 138 413 V16.12.0 (2023-05) */ - modulepar GTP_TEID PX_GTP_TEID := '4f485cc3'O; + modulepar GTP_TEID PX_GTP_TEID := '00000001'O; /** * @desc To identify QoS flow @@ -137,16 +141,18 @@ module LibNGAP_Pixits { */ modulepar RelativeAMFCapacity PX_M_RELATIVE_AMF_CAP := 255; - /** - * @desc The Mobile Country Code (MCC) and Mobile Network Code (MNC) - * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.5 PLMN Identity - */ + /** + * @desc The Mobile Country Code (MCC) and Mobile Network Code (MNC) + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.5 PLMN Identity + */ modulepar PLMNIdentity PX_PLMN_IDENTITY := '00f110'O; // MCC: 1, MNC: 01 - /** - * @desc The leftmost bits of the E-UTRA Cell Identity IE correspond to the ng-eNB ID - * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.9 E-UTRA CGI - */ + modulepar O1_Type PX_TIME_ZONE := '80'O; // 0x40 for GMT+1, 0x80 for GMT+2 + + /** + * @desc The leftmost bits of the E-UTRA Cell Identity IE correspond to the ng-eNB ID + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.9 E-UTRA CGI + */ modulepar EUTRACellIdentity PX_EUTRA_CELL_IDENTITY := hex2bit('1234501'H); modulepar NRCellIdentity PX_NR_CELL_IDENTITY := hex2bit('123450123'H); diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 8268832..d6c47cf 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -201,7 +201,8 @@ module LibNGAP_Templates { template (value) SuccessfulOutcome m_n2_PDUSessionResourceSetupResponse( in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - in template (value) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes + in template (value) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes, + in template (value) UserLocationInformation p_userLocationInformation ) := { procedureCode := id_PDUSessionResourceSetup, criticality := reject, @@ -210,18 +211,23 @@ module LibNGAP_Templates { protocolIEs := { { id := id_AMF_UE_NGAP_ID, - criticality := reject, + criticality := ignore, value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } }, { id := id_RAN_UE_NGAP_ID, - criticality := reject, + criticality := ignore, value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { id := id_PDUSessionResourceSetupListSURes, criticality := ignore, value_ := { PDUSessionResourceSetupListSURes := p_pDUSessionResourceSetupListSURes } + }, + { + id := id_UserLocationInformation, + criticality := ignore, + value_ := { UserLocationInformation := p_userLocationInformation } } } } @@ -238,7 +244,8 @@ module LibNGAP_Templates { template (present) SuccessfulOutcome mw_n2_PDUSessionResourceSetupResponse( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, - template (present) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSUReq := ? + template (present) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSUReq := ?, + template (present) UserLocationInformation p_userLocationInformation := ? ) := { procedureCode := id_PDUSessionResourceSetup, criticality := reject, @@ -259,6 +266,11 @@ module LibNGAP_Templates { id := id_PDUSessionResourceSetupListSURes, criticality := ignore, value_ := { PDUSessionResourceSetupListSURes := p_pDUSessionResourceSetupListSUReq} + }, + { + id := id_UserLocationInformation, + criticality := ignore, + value_ := { UserLocationInformation := p_userLocationInformation } } } } @@ -266,10 +278,10 @@ module LibNGAP_Templates { } // End of template mw_n2_PDUSessionResourceSetupResponse template (present) SuccessfulOutcome mw_n2_PDUSessionResourceSetupResponseFailed( - template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, - template (present) PDUSessionResourceFailedToSetupListSURes p_pDUSessionResourceFailedToSetupListSUReq := ? - ) := { + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) PDUSessionResourceFailedToSetupListSURes p_pDUSessionResourceFailedToSetupListSUReq := ? + ) := { procedureCode := id_PDUSessionResourceSetup, criticality := reject, value_ := { @@ -311,7 +323,7 @@ module LibNGAP_Templates { in template (value) PDUSessionResourceToReleaseListRelCmd p_pDUSessionResourceToReleaseListRelCmd ) := { - procedureCode := id_PDUSessionResourceToReleaseListRelCmd, + procedureCode := id_PDUSessionResourceRelease, criticality := reject, value_ := { PDUSessionResourceReleaseCommand := { @@ -345,10 +357,11 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_PDUSessionResourceReleaseCommand( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template (present) NAS_PDU p_nasPdu := ?, template (present) PDUSessionResourceToReleaseListRelCmd p_pDUSessionResourceToReleaseListRelCmd := ? ) := { - procedureCode := id_PDUSessionResourceToReleaseListRelCmd, + procedureCode := id_PDUSessionResourceRelease, criticality := reject, value_ := { PDUSessionResourceReleaseCommand := { @@ -363,6 +376,12 @@ module LibNGAP_Templates { criticality := reject, value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { NAS_PDU := p_nasPdu } + }, + { id := id_PDUSessionResourceToReleaseListRelCmd, criticality := reject, @@ -1543,31 +1562,25 @@ module LibNGAP_Templates { */ template (value) SuccessfulOutcome m_n2_InitialContextSetupResponse( in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, - in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - in template (value) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID ) := { procedureCode := id_InitialContextSetup, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { - protocolIEs := { - { - id := id_AMF_UE_NGAP_ID, - criticality := ignore, - value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } - }, - { - id := id_RAN_UE_NGAP_ID, - criticality := ignore, - value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } - }, - { - id := id_PDUSessionResourceSetupListSURes, - criticality := ignore, - value_ := { PDUSessionResourceSetupListSURes := p_pDUSessionResourceSetupListSURes } - } + InitialContextSetupResponse := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := ignore, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := ignore, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } } - } + } + } } } // End of template m_n2_InitialContextSetupResponse @@ -1578,7 +1591,7 @@ module LibNGAP_Templates { procedureCode := id_InitialContextSetup, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { + InitialContextSetupResponse := { protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -1604,13 +1617,12 @@ module LibNGAP_Templates { */ template (present) SuccessfulOutcome mw_n2_InitialContextSetupResponse( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - template (present) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes := ? + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID ) := { procedureCode := id_InitialContextSetup, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { + InitialContextSetupResponse := { protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -1621,11 +1633,6 @@ module LibNGAP_Templates { id := id_RAN_UE_NGAP_ID, criticality := ignore, value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } - }, - { - id := id_PDUSessionResourceSetupListSURes, - criticality := ignore, - value_ := { PDUSessionResourceSetupListSURes := p_pDUSessionResourceSetupListSURes } } } } @@ -1637,13 +1644,12 @@ module LibNGAP_Templates { */ template (present) SuccessfulOutcome mw_n2_InitialContextSetupResponse_Failed( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - template (present) PDUSessionResourceFailedToSetupListSURes p_pDUSessionResourceFailedToSetupListURes := ? + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID ) := { procedureCode := id_InitialContextSetup, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { + InitialContextSetupResponse := { protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -1654,11 +1660,6 @@ module LibNGAP_Templates { id := id_RAN_UE_NGAP_ID, criticality := ignore, value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } - }, - { - id := id_PDUSessionResourceFailedToSetupListSURes, - criticality := ignore, - value_ := { PDUSessionResourceFailedToSetupListSURes := p_pDUSessionResourceFailedToSetupListURes } } } } @@ -1672,7 +1673,7 @@ module LibNGAP_Templates { procedureCode := id_InitialContextSetup, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { + InitialContextSetupResponse := { protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -2002,31 +2003,25 @@ module LibNGAP_Templates { */ template (value) SuccessfulOutcome m_n2_UEContextReleaseComplete( in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, - in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - in template (value) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID ) := { procedureCode := id_UEContextRelease, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { - protocolIEs := { - { - id := id_AMF_UE_NGAP_ID, - criticality := reject, - value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } - }, - { - id := id_RAN_UE_NGAP_ID, - criticality := reject, - value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } - }, - { - id := id_PDUSessionResourceSetupListSURes, - criticality := reject, - value_ := { PDUSessionResourceSetupListSURes := p_pDUSessionResourceSetupListSURes } - } - } - } + UEContextReleaseComplete := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } } } // End of template m_n2_UEContextReleaseComplete @@ -2040,7 +2035,7 @@ module LibNGAP_Templates { procedureCode := id_UEContextRelease, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { + UEContextReleaseComplete := { protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -2066,31 +2061,25 @@ module LibNGAP_Templates { */ template (present) SuccessfulOutcome mw_n2_UEContextReleaseComplete( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, - template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, - template (present) PDUSessionResourceSetupListSURes p_pDUSessionResourceSetupListSURes := ? + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ? ) := { - procedureCode := id_InitialContextSetup, + procedureCode := id_UEContextRelease, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { - protocolIEs := { - { - id := id_AMF_UE_NGAP_ID, - criticality := reject, - value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } - }, - { - id := id_RAN_UE_NGAP_ID, - criticality := reject, - value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } - }, - { - id := id_PDUSessionResourceSetupListSURes, - criticality := reject, - value_ := { PDUSessionResourceSetupListSURes := p_pDUSessionResourceSetupListSURes } - } - } - } + UEContextReleaseComplete := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } } } // End of template mw_n2_UEContextReleaseComplete @@ -2101,10 +2090,10 @@ module LibNGAP_Templates { template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ? ) := { - procedureCode := id_InitialContextSetup, + procedureCode := id_UEContextRelease, criticality := reject, value_ := { - PDUSessionResourceSetupResponse := { + UEContextReleaseComplete := { protocolIEs := { { id := id_AMF_UE_NGAP_ID, @@ -5453,7 +5442,7 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_initialUeMessage_base_nas:= { procedureCode := id_InitialUEMessage, - criticality := ignore, + criticality := reject, value_ := { InitialUEMessage := { protocolIEs := {*, @@ -5476,7 +5465,7 @@ module LibNGAP_Templates { template (present) UEContextRequest p_uEContextRequest := ? ) := { procedureCode := id_InitialUEMessage, - criticality := ignore, + criticality := reject, value_ := { InitialUEMessage := { protocolIEs := {permutation( @@ -14832,8 +14821,8 @@ module LibNGAP_Templates { } // End of template m_pDUSessionResourceSetupRequestTransfer_id_RedundantPDUSessionInformation template (value) PDUSessionResourceSetupRequestTransfer.protocolIEs m_pDUSessionResourceSetupRequestTransfer_id_MBSSessionSetupRequestList( - in template (value) MBSSessionSetupRequestList p_mBSSessionSetupRequestList - ) := { + in template (value) MBSSessionSetupRequestList p_mBSSessionSetupRequestList + ) := { { id := id_MBSSessionSetupRequestList, criticality := ignore, @@ -14842,12 +14831,12 @@ module LibNGAP_Templates { } // End of template m_pDUSessionResourceSetupRequestTransfer_id_MBSSessionSetupRequestList template (omit) PDUSessionResourceSetupResponseTransfer m_pDUSessionResourceSetupResponseTransfer( - in template (value) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation, - in template (omit) QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := omit, - in template (omit) SecurityResult p_securityResult := omit, - in template (omit) QosFlowListWithCause p_qosFlowFailedToSetupList := omit, - in template (omit) PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := omit - ) := { + in template (value) QosFlowPerTNLInformation p_dLQosFlowPerTNLInformation, + in template (omit) QosFlowPerTNLInformationList p_additionalDLQosFlowPerTNLInformation := omit, + in template (omit) SecurityResult p_securityResult := omit, + in template (omit) QosFlowListWithCause p_qosFlowFailedToSetupList := omit, + in template (omit) PDUSessionResourceSetupResponseTransfer.iE_Extensions p_iE_Extensions := omit + ) := { dLQosFlowPerTNLInformation := p_dLQosFlowPerTNLInformation, additionalDLQosFlowPerTNLInformation := p_additionalDLQosFlowPerTNLInformation, securityResult := p_securityResult, @@ -16891,21 +16880,21 @@ module LibNGAP_Templates { template (value) ULForwarding m_uLForwarding(in ULForwarding p_value := ul_forwarding_proposed) := p_value; template (value) UPTransportLayerInformation m_uPTransportLayerInformation_gTPTunnel( - in template (value) GTPTunnel p_gTPTunnel - ) := { + in template (value) GTPTunnel p_gTPTunnel + ) := { gTPTunnel := p_gTPTunnel } // End of template m_uPTransportLayerInformation_gTPTunnel template (value) UPTransportLayerInformation m_uPTransportLayerInformation_choice_Extensions( - in template (value) UPTransportLayerInformation.choice_Extensions p_choice_Extensions - ) := { + in template (value) UPTransportLayerInformation.choice_Extensions p_choice_Extensions + ) := { choice_Extensions := p_choice_Extensions } // End of template m_uPTransportLayerInformation_choice_Extensions template (omit) UPTransportLayerInformationItem m_uPTransportLayerInformationItem( - in template (value) UPTransportLayerInformation p_nGU_UP_TNLInformation, - in template (omit) UPTransportLayerInformationItem.iE_Extensions p_iE_Extensions := omit - ) := { + in template (value) UPTransportLayerInformation p_nGU_UP_TNLInformation, + in template (omit) UPTransportLayerInformationItem.iE_Extensions p_iE_Extensions := omit + ) := { nGU_UP_TNLInformation := p_nGU_UP_TNLInformation, iE_Extensions := p_iE_Extensions } // End of template m_uPTransportLayerInformationItem diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 1269e73..b8de87c 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -208,9 +208,9 @@ module LibNGAP_Functions { { mw_sliceSupportItem( mw_s_NSSAI( - PX_SST, - PX_SD,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + PX_SST/*, + PX_SD, + -*/ ), -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit ) @@ -655,7 +655,13 @@ module LibNGAP_Functions { vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch."); setverdict(fail); } else { @@ -667,8 +673,10 @@ module LibNGAP_Functions { // Await InitialContextSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( - mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes - )); + mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); log("<<< f_await_initial_context_setup_request_await_initial_context_setup_resonse"); } @@ -907,11 +915,17 @@ module LibNGAP_Functions { vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU) - if (match(vc_recvNgNasUl_Msg, mw_NG_REGISTRATION_COMPLETE)) { - log("Received NG_REGISTRATION_COMPLETE NAS message"); + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_REGISTRATION_COMPLETE_noSOR, + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_COMPLETE mismatch."); + setverdict(fail); } else { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); - setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_COMPLETE"); + setverdict(pass); } } @@ -998,8 +1012,7 @@ module LibNGAP_Functions { mw_ngap_initMsg( mw_n2_DownlinkNASTransport( vc_AMF_UE_ID, - vc_RAN_UE_ID, - ? // SecurityModeCommand + vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message( @@ -1069,7 +1082,7 @@ module LibNGAP_Functions { ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { + if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch."); setverdict(fail); } else { @@ -1082,6 +1095,7 @@ module LibNGAP_Functions { log(">>> f_send_pdu_session_resource_setup_request"); // Send PDUSessionResourceSetupRequest + // TODO FSCOM Set vc_pdu_session_resource_setup_list_su_req f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceSetupRequest( @@ -1144,6 +1158,7 @@ module LibNGAP_Functions { ) }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq ))); + var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, ""); for (var integer i :=0 ; i < numOfIEs; i := i + 1) { // Loop over the protocolIEs found @@ -1199,37 +1214,60 @@ module LibNGAP_Functions { log(">>> f_send_pdu_session_resource_setup_response"); // Send PDUSessionEstablishmentResponse + var NGAP_IEs.PDUSessionResourceSetupResponseTransfer v_pDUSessionResourceSetupResponseTransfer := { + dLQosFlowPerTNLInformation := { + uPTransportLayerInformation := { + gTPTunnel := { + transportLayerAddress := PX_TRANSPORT_LAYER_ADDRESS, + gTP_TEID := PX_GTP_TEID, + iE_Extensions := omit + } + }, + associatedQosFlowList := { + { + qosFlowIdentifier := 1, + qosFlowMappingIndication := omit, + iE_Extensions := omit + } + }, + iE_Extensions := omit + }, + additionalDLQosFlowPerTNLInformation := omit, + securityResult := omit, + qosFlowFailedToSetupList := omit, + iE_Extensions := omit + }; + log( + "f_send_pdu_session_resource_setup_response:v_pDUSessionResourceSetupResponseTransfer: ", + v_pDUSessionResourceSetupResponseTransfer + ); + // TITAN issue workaround bit2oct(encvalue(v_pDUSessionResourceSetupResponseTransfer, "PER:ALIGNED", "PER:ALIGNED")); + // I cannot reproduce the issue with a simpler structure, but it seems that encoding v_pDUSessionResourceSetupResponseTransfer with PER aligned is not working in TITAN. The workaround is to directly use the expected encoded value (which is also the one generated by asn1c and Wireshark) instead of encoding the structure in TTCN3. + var octetstring v_os := bit2oct(encvalue(v_pDUSessionResourceSetupResponseTransfer)); + log( + "f_send_pdu_session_resource_setup_response:encvalue v_pDUSessionResourceSetupResponseTransfer: ", + v_os + ); + v_os := '0003E07F000001000000010001'O; // So, force with the correct encoded value vc_pdu_session_resource_setup_list_su_res := { valueof( m_pDUSessionResourceSetupItemSURes( vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, // Reuse the same PDU Session ID as in the request - bit2oct(encvalue(m_pDUSessionResourceSetupResponseTransfer( - m_qosFlowPerTNLInformation( - m_uPTransportLayerInformation_gTPTunnel( - m_gTPTunnel( - PX_TRANSPORT_LAYER_ADDRESS, - PX_GTP_TEID, - omit - )), - { - m_associatedQosFlowItem( - PX_QOS_FLOW_IDENTIFIER, - omit, - omit - ) - },//in template (value) AssociatedQosFlowList p_associatedQosFlowList, - omit//in template (omit) QosFlowPerTNLInformation.iE_Extensions p_iE_Extensions := omit - ) - ))))) + v_os + )) }; log("f_send_pdu_session_resource_setup_response: vc_pdu_session_resource_setup_list_su_res: ", vc_pdu_session_resource_setup_list_su_res); f_send_NGAP_PDU( m_ngap_succMsg( - m_n2_InitialContextSetupResponse( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - vc_pdu_session_resource_setup_list_su_res - ))); + m_n2_PDUSessionResourceSetupResponse( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_pdu_session_resource_setup_list_su_res, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); } function f_await_pdu_session_resource_setup_response() runs on NGNASComponent { @@ -1255,8 +1293,12 @@ module LibNGAP_Functions { )),// Decode&Match - In ASN1 it is OCTET STRING - PDUSessionResourceSetupResponseTransfer *//template PDUSessionResourceSetupItemSURes.iE_Extensions p_iE_Extensions := * )) - } - ))); + }, + mw_uPTransportLayerInformation_userLocationInformationNR( + mw_userLocationInformationNR( + mw_nR_CGI, + mw_tAI + ))))); vc_pdu_session_resource_setup_list_su_res := valueof(vc_recvNGAP_PDU.successfulOutcome.value_.PDUSessionResourceSetupResponse.protocolIEs[2].value_.PDUSessionResourceSetupListSURes); log("f_await_pdu_session_resource_setup_response: vc_pdu_session_resource_setup_list_su_res: ", vc_pdu_session_resource_setup_list_su_res); } @@ -1347,9 +1389,9 @@ module LibNGAP_Functions { // Await NG_PDU_SESSION_RELEASE_COMMAND f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - vc_AMF_UE_ID, - vc_RAN_UE_ID + mw_n2_PDUSessionResourceReleaseCommand( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; @@ -1469,7 +1511,7 @@ module LibNGAP_Functions { -//unichar2oct(oct2unichar(char2oct(PX_NETWORK_NAME))) ), -, - cs_TimeZone('40'O), + cs_TimeZone(PX_TIME_ZONE), ?, // TimeZoneAndTime ? // DaylightSavingTime ), @@ -1619,13 +1661,41 @@ module LibNGAP_Functions { -, p_Cause ))); - // Await UEContextReleaseComplete + // Send UEContextReleaseComplete f_send_NGAP_PDU( m_ngap_succMsg( m_n2_UEContextReleaseComplete( vc_AMF_UE_ID, - vc_RAN_UE_ID, - vc_pdu_session_resource_setup_list_su_res + vc_RAN_UE_ID + ))); + } + + function f_await_ue_context_release_request_await_ue_context_release_response( + in template (value) Cause p_Cause + ) runs on NGNASComponent { + log(">>> f_await_ue_context_release_request_await_ue_context_release_response"); + + // Send UEContextReleaseRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + p_Cause + ))); + // Await UEContextReleaseCommand + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseCommand( + -, + p_Cause + ))); + // await UEContextReleaseComplete + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); } diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index ddbd628..26198cf 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -24,6 +24,7 @@ module LibNGAP_Steps { import from LibNGAP_TypesAndValues all; import from LibNGAP_Interface all; import from NGAP_TestSystem all; + import from LibNGAP_Pics all; import from LibNGAP_Pixits all; import from LibNGAP_Templates all; import from LibNGAP_Functions all; @@ -272,7 +273,11 @@ module LibNGAP_Steps { function f_postambleNGAP_AMF( in template (value) Cause p_Cause ) runs on aMFNGAPComponent { + if (PICS_OFFLINE_MODE) { + f_await_ue_context_release_request_await_ue_context_release_response(p_Cause); + } else { f_send_ue_context_release_request_await_ue_context_release_response(p_Cause); + } } // End of function f_postambleNGAP_AMF } // End of group postamble_NGAP @@ -362,7 +367,8 @@ module LibNGAP_Steps { f_selfOrClientSyncAndVerdict("error", e_timeout); } else { - stop; + //stop; + testcase.stop("*** " & __SCOPE__ & ": INCONC: Error indication received. ***"); } } [] N2_gNBaMF_P.receive (NGAP_PDU:{initiatingMessage := ?}) -> value vc_recvNGAP_PDUDefault { @@ -379,7 +385,8 @@ module LibNGAP_Steps { f_selfOrClientSyncAndVerdict("error", e_error); } else { - stop; + //stop; + testcase.stop("*** " & __SCOPE__ & ": INCONC: Unexpected NGAP message received. ***"); } } [] N2_gNBaMF_P.receive { @@ -387,7 +394,8 @@ module LibNGAP_Steps { f_selfOrClientSyncAndVerdict("error", e_error); } else { - stop; + //stop; + testcase.stop("*** " & __SCOPE__ & ": INCONC: Unexpected message received. ***"); } } [] a_shutdown() { diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 1e0e44c..189166c 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -168,6 +168,7 @@ module Lib_NG_NAS_Security_Functions { } else { log("f_Check_5GAKA_NAS_DL_Message: Message is not security protected"); } + log("f_Check_5GAKA_NAS_DL_Message: v_message: ", v_message); log("f_Check_5GAKA_NAS_DL_Message: p_NG_NAS_DL_Message_Type: ", p_NG_NAS_DL_Message_Type); if (not(match(v_message, p_NG_NAS_DL_Message_Type))) { log(match(v_message, p_NG_NAS_DL_Message_Type)); @@ -279,6 +280,7 @@ module Lib_NG_NAS_Security_Functions { return false; } } + log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); log("f_Check_5GAKA_NAS_UL_Message: p_NG_NAS_UL_Message_Type: ", p_NG_NAS_UL_Message_Type); if (not(match(v_message, p_NG_NAS_UL_Message_Type))) { log(match(v_message, p_NG_NAS_UL_Message_Type)); diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 62565c5..704dc46 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -542,6 +542,20 @@ module Lib_NG_NAS_Templates { } } // End of template mw_NG_REGISTRATION_COMPLETE + template (present) NG_NAS_UL_Message_Type mw_NG_REGISTRATION_COMPLETE_noSOR( + template SORTransparentContainer p_SOR := omit + ) modifies cr_NG_REGISTRATION_COMPLETE := { /* 24.501 cl. 8.2.8 */ + /* @status APPROVED (IMS, NR5GC, NR5GC_IRAT, POS) */ + registration_Complete := { + protocolDiscriminator := tsc_EPD_GMM, /* cl. 9.2 M V 1 */ + spareHalfOctet := tsc_SpareHalfOctet, /* cl. 9.3 M V 1/2 */ + securityHeaderType := tsc_SHT_NoSecurityProtection, + messageType := tsc_MT_NG_RegistrationComplete, /* cl. 9.7 M V 1 */ + sorTransparentContainer := p_SOR /* cl. 9.11.3.49 O TLV-E 20-2048 IEI=7F */ + } + } // End of template template (present) NG_NAS_UL_Message_Type mw_NG_REGISTRATION_COMPLETE_noSOR( + + template (omit) NG_NAS_DL_Message_Type m_NG_REGISTRATION_REJECT( in template (value) GMM_GSM_Cause p_Cause, in template (omit) GPRS_Timer2 p_T3346 := omit, -- GitLab From 2196f584dbc79e43b505a49c969e57b2090f53ce Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 21 Apr 2026 08:51:42 +0200 Subject: [PATCH 085/151] Remove TC_NGAP_AMF_NAS_02; Bug fixed in NGAP_TCFunctions module --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 6 +- test_purposes/References.txt | 1 - ttcn/AtsNGAP/NGAP_Steps.ttcn | 10 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 96 ++++++------------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 32 ------- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 8 +- 6 files changed, 44 insertions(+), 109 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 7cfcce8..0381938 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -108,7 +108,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #NGAP_TestCases.TC_NGAP_AMF_PDU_05 # Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed -NGAP_TestCases.TC_NGAP_AMF_CMP_01 +#NGAP_TestCases.TC_NGAP_AMF_CMP_01 # Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID #NGAP_TestCases.TC_NGAP_AMF_CMP_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons @@ -152,9 +152,7 @@ NGAP_TestCases.TC_NGAP_AMF_CMP_01 #NGAP_TestCases.TC_NGAP_AMF_MMP_09 # Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. -#NGAP_TestCases.TC_NGAP_AMF_NAS_01 -# Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF. -#NGAP_TestCases.TC_NGAP_AMF_NAS_02 +NGAP_TestCases.TC_NGAP_AMF_NAS_01 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. #NGAP_TestCases.TC_NGAP_AMF_IMP_01 diff --git a/test_purposes/References.txt b/test_purposes/References.txt index 9591a37..f0ac772 100644 --- a/test_purposes/References.txt +++ b/test_purposes/References.txt @@ -1,2 +1 @@ [1] ETSI TS 138 413: "5G;NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.12.0 Release 16)". -[2] ETSI TS 123 502: "5G;Procedures for the 5G System (5GS) (3GPP TS 23.502 version 16.19.0 Release 16)". \ No newline at end of file diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 154c9f0..3f3e256 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -202,8 +202,14 @@ module NGAP_Steps { /** * @desc */ - function f_NGAP_amf_UE_NAS_Initiate() runs on gNBNGAPComponent { - // FIXME + function f_NGAP_amf_UE_NAS_Initiate() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_NAS_Initiate"); + if (PICS_OFFLINE_MODE) { + f_await_registration_request(); + } else { + f_send_registration_request(); + } + log("<<< f_NGAP_amf_UE_NAS_Initiate"); } // End of function f_NGAP_amf_UE_NAS_Initiate /** diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index be5cd2a..2ff72c7 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -5404,31 +5404,43 @@ module NGAP_TCFunctions { // Preamble f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_initialUeMessage( - -, - ''O, // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???)) - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - )) - ))); - f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_RerouteNASRequest( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ''O // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???))) + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + ?,//'100'B, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + } + log("v_message: ", v_message); + if (not(isbound(v_message))) { + setverdict(fail); + return; + } + // Extract AMF_UE_NGAP_ID for termination + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -5447,54 +5459,6 @@ module NGAP_TCFunctions { //8.6.4 group NAS_Non_Delivery_Indication{ } // End of group NAS_Non_Delivery_Indication - //8.6.5 - group Rerout_NAS_Request{ - - /** - * @desc Testcase function for TC_NGAP_AMF_NAS_02 - */ - function f_TC_NGAP_AMF_NAS_02() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_initialUeMessage( - -, - ''O, // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???)) - m_uPTransportLayerInformation_userLocationInformationEUTRA( - m_userLocationInformationEUTRA( - m_uUTRA_CGI, - m_tAI - )) - ))); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ''O // FIXME FSCOM NAS_PDU field shall be bit2oct(enc(???))) - ))); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_NAS_02 - - } // End of group Rerout_NAS_Request } // End of group Transport_of_NAS_Messages_Procedures //8.7 group Interface_Management_Procedures{ diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 468774a..3009f8d 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -2967,38 +2967,6 @@ module NGAP_TestCases { //8.6.4 group NAS_Non_Delivery_Indication{ } // End of group NAS_Non_Delivery_Indication - //8.6.5 - group Rerout_NAS_Request{ - - - /** - * @desc "Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF." - */ - testcase TC_NGAP_AMF_NAS_02() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_5_5)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_5_5' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_NAS_02()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_NAS_02 - - } // End of group Rerout_NAS_Request } // End of group Transport_of_NAS_Messages_Procedures //8.7 group Interface_Management_Procedures{ diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index b8de87c..5ed8262 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -85,10 +85,10 @@ module LibNGAP_Functions { m_ngap_initMsg( m_n2_NGSetupRequest( m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - PX_PLMN_IDENTITY, - PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit + m_ie_globalGnbId( + PX_PLMN_IDENTITY, + PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, + -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit )), { m_supportedTAItem( -- GitLab From bce5a261990bd9cdfc3bc2639f23a0a2a8819928 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 21 Apr 2026 08:54:03 +0200 Subject: [PATCH 086/151] Validate TC_NGAP_AMF_NAS_01 --- captures/TC_NGAP_AMF_NAS_01.pcap | Bin 0 -> 2196 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 captures/TC_NGAP_AMF_NAS_01.pcap diff --git a/captures/TC_NGAP_AMF_NAS_01.pcap b/captures/TC_NGAP_AMF_NAS_01.pcap new file mode 100644 index 0000000000000000000000000000000000000000..ccbde8bc4acf52e375c93d9be1767c0fd3065250 GIT binary patch literal 2196 zcmca|c+)~A1{MYcU}0cnU|?7+_dK)hIy*xU0|OW%_)Et|MibcPhwzY-~g!w(FayAih^h^ zT?R&Uw}Win^O2Duh>-z|VP=A8kj;$H(6QD7*$Ogo8qbYaVA~iN7?>CsRrr-c!@xGn zF>o0vE3ao@XXFr0k3Y|0peDEYacPx#UBKT-wV%&}Ohm?Ep-TMQ+pfyO#M(X@vhMa- zAtA@W#jsvk*@%hZ#w(D0FnMH}XBsGG85kOv7*yJl%oMp2iy!}sU2<=ohy>&BTUuek zz4NxtUEoaU}lhJ;AEKjlRbcefq{`Bje!>=%?J`<0F^GH z4vY>A3?R3!`o_p$$G`x_AT=-ycDum@e~`_qKY?ro*^caXW(EcUu+5C~uYq)dOqeyF)%Z@fpaNDi;aRPC`dsiB_C@;enD!UX?n44Vs4rN zLjnT_1IQyx3=Rxo4vha90vI?ze6YvBep{iJ^^w0gORnFbp=Wf`J8On)NqqrZF%xgy|obo(zry zkT!k>Ck6&qhEP!X#Gu9?AzsJeSjoW4IP)hvNE(C%^q4+;V5nr^cbNH;UC1Or$N((K z$PnegD8W$R04iTVu9_jj#4w400gOTVU>NMGmI;9%SFN4{@*l`$SmJFmxNHPzV`d04 zQdZsou9O%UY#3M^>_91q3+zgmTeY?77{VBs7#I})-q_AEb>e?XUY*NA5BFSptRQeO zdeV}hKMf48l0Iln%oGrXq^w36CWbTy1~3L$1H)h!Mli5~TxcT-avjK(SYlxVk_$ET zk4sMh7wjNov=~ItUC8gi=mH8Cepx1lBnAdB1}TMMu&p5zf+d#Hr@#jV)8 Date: Tue, 21 Apr 2026 09:11:57 +0000 Subject: [PATCH 087/151] add chapter 7 - Protocol Data error cases --- TP_ideas_and_status.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TP_ideas_and_status.md b/TP_ideas_and_status.md index 2502fba..6af24b8 100644 --- a/TP_ideas_and_status.md +++ b/TP_ideas_and_status.md @@ -332,5 +332,6 @@ Potential Procedures to be tested - for the sake of total test coverage - 5.6.2 Paging procedure - 5.6.3 Notification procedure - 6.3.2 Network-requested PDU session modification +- 7 Handling of unknown, unforeseen, and erroneous protocol data -- GitLab From c0448206433577a767c921bb352cdcbba685a397 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 21 Apr 2026 10:05:40 +0000 Subject: [PATCH 088/151] Reviewed/updated tests TP_5GNAS_AMF_AUT_REQ_01 and *_02 --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 31 ++++++++++++++++++++----- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index c038f8b..817af09 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -27,14 +27,14 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_AUT_REQ_01 - Test objective "Verify that the IUT sends an AUTHENTICATION_REQUEST message correctly upon receipt of a NAS Registration without an active security context." + Test objective "Verify that the IUT sends an AUTHENTICATION_REQUEST message upon receipt of an initial REGISTRATION_REQUEST containing a SUCI, when no active 5G NAS security context exists." Reference "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" Config Id CF_AMF_N2N1 - PICS Selection NONE + PICS Selection PICS_A4/1_2 Initial conditions with { the UE entity isNotRegisteredToAMF @@ -48,8 +48,17 @@ Package TP_AMF { extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, - 5GS_registration_type, - 5GS_mobile_identity;; + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION;, + 5GS_mobile_identity containing + SUPI_format indicating value IMSI, + Type_of_identity indicating value SUCI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + Routing_indicator indicating value PX_ROUTING_INDICATOR, + Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN indicating value PX_MSIN;;; } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing @@ -59,6 +68,7 @@ Package TP_AMF { message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, + ABBA, Authentication_parameter_RAND, Authentication_parameter_AUTN;; to the GNB entity @@ -70,17 +80,26 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_AUT_REQ_02 - Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value." + Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message." Reference "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" Config Id CF_AMF_N2N1 - PICS Selection NONE + PICS Selection PICS_A4/1_2 Initial conditions with { the UE entity isNotRegisteredToAMF and + the IUT entity receives an INITIAL_UE_MESSAGE containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing + 5GS_registration_type_value set to INITIAL_REGISTRATION;, + 5GS_mobile_identity containing + Type_of_identity set to SUCI;;; and event AUTHENTICATION_REQUEST occurs } -- GitLab From c8fe61b10e71b31da7fcf41b13b8165d94debd6d Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 21 Apr 2026 10:27:27 +0000 Subject: [PATCH 089/151] Another TP idea --- TP_ideas_and_status.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TP_ideas_and_status.md b/TP_ideas_and_status.md index 6af24b8..074d687 100644 --- a/TP_ideas_and_status.md +++ b/TP_ideas_and_status.md @@ -334,4 +334,7 @@ Potential Procedures to be tested - for the sake of total test coverage - 6.3.2 Network-requested PDU session modification - 7 Handling of unknown, unforeseen, and erroneous protocol data +## +[BPIN] Another test might be added based on TP_5GNAS_AMF_AUT_REQ_02 but to check option "when the UE was identified with GUTI" + -- GitLab From 06065d21620f5fc0866db4b7804a767336e7f758 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 21 Apr 2026 14:24:42 +0200 Subject: [PATCH 090/151] Remove PX_PLMN_IDENTITY and use PX_MCC/PX_MNC --- etc/AtsNGAP/AtsNGAP_AMF.cfg_ | 24 +- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 25 +- etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ | 23 +- etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 6 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 11 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 2 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 383 +++--------------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 168 -------- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 18 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 48 ++- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 3 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 43 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 169 ++------ .../lib/Lib_NG_NAS_Security_Functions.ttcn | 128 ++++++ .../lib_system/Lib_NG_NAS_Functions.ttcn | 6 +- 15 files changed, 324 insertions(+), 733 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ index c242d4a..889ecad 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF.cfg_ @@ -12,7 +12,8 @@ LibNGAP_Pics.PICS_OFFLINE_MODE := true LibNGAP_Pixits.PX_AMF_NAME := "Kontron5G-amf" LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 0 LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 22 #8934 -LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O +LibNGAP_Pixits.PX_NAS_MCC := '999'H +LibNGAP_Pixits.PX_NAS_MNC := '70'H LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B LibNGAP_Pixits.PX_AMF_POINTER := '011111'B @@ -34,7 +35,6 @@ Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := '00000000000000000000000 Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'B -Lib_NG_NAS_Pixits.PX_PLMN_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '696d73692d3939393730303030303030'H; // imsi-99970000000 @@ -150,8 +150,6 @@ NGAP_TestCases.TC_NGAP_AMF_CMP_04 # Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. #NGAP_TestCases.TC_NGAP_AMF_NAS_01 -# Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF. -#NGAP_TestCases.TC_NGAP_AMF_NAS_02 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. #NGAP_TestCases.TC_NGAP_AMF_IMP_01 @@ -178,24 +176,6 @@ NGAP_TestCases.TC_NGAP_AMF_CMP_04 # Verify that the AMF can send a OVERLOAD STOP to the GNB. #NGAP_TestCases.TC_NGAP_AMF_IMP_12 -# Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages. -#NGAP_TestCases.TC_NGAP_AMF_WTP_01 -#Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages. -#NGAP_TestCases.TC_NGAP_AMF_WTP_02 - -# Verify that the IUT can send a TRACE_START to initiate a trace session for a UE. -#NGAP_TestCases.TC_NGAP_AMF_TRP_01 -# Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE. -#NGAP_TestCases.TC_NGAP_AMF_TRP_02 - -# Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure. -#NGAP_TestCases.TC_NGAP_AMF_UBP_01 -# Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping. -#NGAP_TestCases.TC_NGAP_AMF_URP_02 - -# Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER. -#NGAP_TestCases.TC_NGAP_AMF_RIP_01 - [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the # [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 0381938..4b3d70a 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -8,7 +8,8 @@ NGAP_Pics.PICS_NGAP_GNB_IUT := false LibNGAP_Pics.PICS_OFFLINE_MODE := false # true for offline mode with pcap files, false for online mode with SCTP server -LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +LibNGAP_Pixits.PX_NAS_MCC := '999'H +LibNGAP_Pixits.PX_NAS_MNC := '70'H LibNGAP_Pixits.PX_RAN_NODE_NAME := "gnb0012345" LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" @@ -152,10 +153,10 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #NGAP_TestCases.TC_NGAP_AMF_MMP_09 # Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. -NGAP_TestCases.TC_NGAP_AMF_NAS_01 +#NGAP_TestCases.TC_NGAP_AMF_NAS_01 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. -#NGAP_TestCases.TC_NGAP_AMF_IMP_01 +NGAP_TestCases.TC_NGAP_AMF_IMP_01 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. #NGAP_TestCases.TC_NGAP_AMF_IMP_02 # Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup. @@ -179,24 +180,6 @@ NGAP_TestCases.TC_NGAP_AMF_NAS_01 # Verify that the AMF can send a OVERLOAD STOP to the GNB. #NGAP_TestCases.TC_NGAP_AMF_IMP_12 -# Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages. -#NGAP_TestCases.TC_NGAP_AMF_WTP_01 -#Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages. -#NGAP_TestCases.TC_NGAP_AMF_WTP_02 - -# Verify that the IUT can send a TRACE_START to initiate a trace session for a UE. -#NGAP_TestCases.TC_NGAP_AMF_TRP_01 -# Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE. -#NGAP_TestCases.TC_NGAP_AMF_TRP_02 - -# Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure. -#NGAP_TestCases.TC_NGAP_AMF_UBP_01 -# Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping. -#NGAP_TestCases.TC_NGAP_AMF_URP_02 - -# Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER. -#NGAP_TestCases.TC_NGAP_AMF_RIP_01 - [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the # [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. diff --git a/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ index 46bc83d..0e01769 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_sintesio.cfg_ @@ -8,7 +8,8 @@ NGAP_Pics.PICS_NGAP_GNB_IUT := false LibNGAP_Pics.PICS_OFFLINE_MODE := true # true for offline mode with pcap files, false for online mode with SCTP server -LibNGAP_Pixits.PX_PLMN_IDENTITY := '00F110'O # '99f907'O +LibNGAP_Pixits.PX_NAS_MCC := '001'H +LibNGAP_Pixits.PX_NAS_MNC := '01'H LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" LibNGAP_Pixits.PX_GNB_ID := '0000000000000000000001'B LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" @@ -150,8 +151,6 @@ NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. #NGAP_TestCases.TC_NGAP_AMF_NAS_01 -# Verify that the IUT can send an REROUTE NAS REQUEST message to reroute the INITIAL UE MESSAGE message to another AMF. -#NGAP_TestCases.TC_NGAP_AMF_NAS_02 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. #NGAP_TestCases.TC_NGAP_AMF_IMP_01 @@ -178,24 +177,6 @@ NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the AMF can send a OVERLOAD STOP to the GNB. #NGAP_TestCases.TC_NGAP_AMF_IMP_12 -# Verify that the IUT can send a WRITE REPLACE WARNING REQUEST to start broadcasting of warning messages. -#NGAP_TestCases.TC_NGAP_AMF_WTP_01 -#Verify that the IUT can send a PWS CANCEL REQUEST to cancel broadcasting of warning messages. -#NGAP_TestCases.TC_NGAP_AMF_WTP_02 - -# Verify that the IUT can send a TRACE_START to initiate a trace session for a UE. -#NGAP_TestCases.TC_NGAP_AMF_TRP_01 -# Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE. -#NGAP_TestCases.TC_NGAP_AMF_TRP_02 - -# Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure. -#NGAP_TestCases.TC_NGAP_AMF_UBP_01 -# Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping. -#NGAP_TestCases.TC_NGAP_AMF_URP_02 - -# Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER. -#NGAP_TestCases.TC_NGAP_AMF_RIP_01 - [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the # [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. diff --git a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ index 9ff4988..02dac53 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB.cfg_ @@ -10,7 +10,9 @@ LibNGAP_Pics.PICS_OFFLINE_MODE := true LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +# https://www.binaryhexconverter.com/hex-to-binary-converter +LibNGAP_Pixits.PX_NAS_MCC := '999'H +LibNGAP_Pixits.PX_NAS_MNC := '70'H LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B LibNGAP_Pixits.PX_AMF_POINTER := '000000'B @@ -33,8 +35,6 @@ Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B -# https://www.binaryhexconverter.com/hex-to-binary-converter -Lib_NG_NAS_Pixits.PX_PLMN_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 28d814b..e5ef0d5 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -9,11 +9,12 @@ NGAP_Pics.PICS_NGAP_GNB_IUT := false LibNGAP_Pics.PICS_OFFLINE_MODE := true # 5GRegAuthSec_deReg.pcap -LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O; LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_PLMN_IDENTITY := '99f907'O +# https://www.binaryhexconverter.com/hex-to-binary-converter +LibNGAP_Pixits.PX_NAS_MCC := '999'H +LibNGAP_Pixits.PX_NAS_MNC := '70'H LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B LibNGAP_Pixits.PX_AMF_POINTER := '000000'B @@ -35,8 +36,6 @@ Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B -# https://www.binaryhexconverter.com/hex-to-binary-converter -LibNGAP_Pixits.PX_PLMN_IDENTITY := '00f110'O; Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 @@ -148,7 +147,7 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_11 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02 -#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01 @@ -175,7 +174,7 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_02 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 [GROUPS] diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 3f3e256..19be5e3 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -498,7 +498,7 @@ module NGAP_Steps { function f_NGAP_gnb_UE_Register() runs on gNBNGAPComponent { log(">>> f_NGAP_gnb_UE_Register"); if (PICS_OFFLINE_MODE) { - f_send_NGSetupRequest_await_NGSetupResponse(); + f_await_NGSetupRequest_await_NGSetupResponse(); } else { f_await_NGSetupRequest_send_NGSetupRespone(); } diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 2ff72c7..5dba386 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -1217,7 +1217,7 @@ module NGAP_TCFunctions { m_uESecurityCapabilities, -, m_mobilityRestrictionList( - PX_PLMN_IDENTITY + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) ) ))); @@ -2251,7 +2251,7 @@ module NGAP_TCFunctions { ), m_cEmodeBrestricted, m_uE_UP_CIoT_Support, - { PX_PLMN_IDENTITY } + { fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) } ))); f_recv_NGAP_PDU( @@ -2868,7 +2868,7 @@ module NGAP_TCFunctions { //NOTUSED in template (value) AMFName p_AMFName, { m_servedGUAMIItem( m_gUAMI( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_AMF_REGION_ID, PX_AMF_SET_ID, PX_AMF_POINTER, @@ -2881,7 +2881,7 @@ module NGAP_TCFunctions { //NOT USED in template (value) RelativeAMFCapacity p_relativeAMFCapacity, { m_pLMNSupportItem( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), { m_sliceSupportItem( m_s_NSSAI( @@ -2959,7 +2959,7 @@ module NGAP_TCFunctions { //NOTUSED in template (value) AMFName p_AMFName, { m_servedGUAMIItem( m_gUAMI( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_AMF_REGION_ID, PX_AMF_SET_ID, PX_AMF_POINTER, @@ -2972,7 +2972,7 @@ module NGAP_TCFunctions { //NOT USED in template (value) RelativeAMFCapacity p_relativeAMFCapacity, { m_pLMNSupportItem( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), { m_sliceSupportItem( m_s_NSSAI( @@ -4419,7 +4419,7 @@ module NGAP_TCFunctions { vc_RAN_UE_ID, mw_gUAMI ( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_AMF_REGION_ID, PX_AMF_SET_ID, PX_AMF_POINTER, @@ -5468,91 +5468,57 @@ module NGAP_TCFunctions { * @desc Testcase function for TC_NGAP_AMF_IMF_01 */ function f_TC_NGAP_AMF_IMP_01() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Local variables - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - PX_PLMN_IDENTITY, - PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit - ) - ), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit - ) - }, - PX_PAGING_DRX - ) - ) - ); + // Preamble + f_NGAP_amf_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Body + // Send NGSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + ) + ) + } + ) + } + ) + }, + PX_PAGING_DRX + ))); + // Await NGSetupResponse f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGSetupResponse( - ?, - { - mw_servedGUAMIItem( - mw_gUAMI( - ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, - ?,//template (present) AMFRegionID p_aMFRegionID := ?, - ?,//template (present) AMFSetID p_aMFSetID := ?, - ?,//template (present) AMFPointer p_aMFPointer := ?, - *//template GUAMI.iE_Extensions p_iE_Extensions := * - ),//template (present) GUAMI p_gUAMI := ?, - *,//template AMFName p_backupAMFName := *, - *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * - ) - },//template (present) ServedGUAMIList p_servedGUAMIList := ?, - ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, - { - mw_pLMNSupportItem( - ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, - { - mw_sliceSupportItem( - mw_s_NSSAI( - ?,//template (present) SST p_sST := ?, - *,//template SD p_sD := *, - *//template S_NSSAI.iE_Extensions p_iE_Extensions := * - ),//template (present) S_NSSAI p_s_NSSAI := ?, - ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * - ) - },//template (present) SliceSupportList p_sliceSupportList := ?, - *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * - ) - }//template (present) PLMNSupportList p_plmnSuppList := ? - ) - ) - ); - + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + } + ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -5583,7 +5549,7 @@ module NGAP_TCFunctions { m_n2_NGSetupRequest( m_globalRANNodeID_globalGNB_ID( m_ie_globalGnbId( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit ) @@ -5593,7 +5559,7 @@ module NGAP_TCFunctions { PX_TACode, { m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { m_sliceSupportItem( m_s_NSSAI( @@ -5652,7 +5618,7 @@ module NGAP_TCFunctions { m_n2_NGSetupRequest_UERetentionInf( m_globalRANNodeID_globalGNB_ID( m_ie_globalGnbId( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), '0000000000000000000000'B,//in template (value) bitstring p_gnbId, -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit ) @@ -5662,7 +5628,7 @@ module NGAP_TCFunctions { PX_TACode, { m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { m_sliceSupportItem( m_s_NSSAI( @@ -5753,7 +5719,7 @@ module NGAP_TCFunctions { m_n2_NGSetupRequest_ExtRanNodeName( m_globalRANNodeID_globalGNB_ID( m_ie_globalGnbId( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), '0000000000000000000000'B,//in template (value) bitstring p_gnbId, -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit ) @@ -5763,7 +5729,7 @@ module NGAP_TCFunctions { PX_TACode, { m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { m_sliceSupportItem( m_s_NSSAI( @@ -5867,7 +5833,7 @@ module NGAP_TCFunctions { PX_TACode, { m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { m_sliceSupportItem( m_s_NSSAI( @@ -5927,7 +5893,7 @@ module NGAP_TCFunctions { PX_TACode, { m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { m_sliceSupportItem( m_s_NSSAI( @@ -6473,86 +6439,12 @@ module NGAP_TCFunctions { group Trace_Procedures{ //8.11.1 group Trace_Start{ - - /** - * @desc Testcase function for TC_NGAP_aMF_TRP_01 - */ - function f_TC_NGAP_AMF_TRP_01() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger TRACE START!"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_TraceStart( - ?, - ?, - ? - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_TRP_01 - } // End of group Trace_Start //8.11.2 group Trace_Failure_Indication{ } // End of group Trace_Failure_Indication //8.11.3 group Deactivate_Trace{ - - /** - * @desc Testcase function for TC_NGAP_aMF_TRP_02 - */ - function f_TC_NGAP_AMF_TRP_02() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger DEACTIVATE TRACE!"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DeactivateTrace( - ?, - ?, - ? - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_TRP_02 - } // End of group Deactivate_Trace //8.11.4 group Cell_Traffic_Trace{ @@ -6607,42 +6499,6 @@ module NGAP_TCFunctions { group UE_TNLA_Binding_Procedures{ //8.13.1 group UE_TNLA_Binding_Release{ - - /** - * @desc Testcase function for TC_NGAP_aMF_UBP_01 - */ - function f_TC_NGAP_AMF_UBP_01() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger UE TNLA BINDING procedure !"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UETNLABindingReleaseRequest( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_UBP_01 - } // End of group UE_TNLA_Binding_Release } // End of group UE_TNLA_Binding_Procedures //8.14 @@ -6652,87 +6508,9 @@ module NGAP_TCFunctions { } // End of group UE_Radio_Capability_Info_Indication //8.14.2 group UE_Radio_Capability_Check{ - - /** - * @desc Testcase function for TC_NGAP_aMF_URP_01 - */ - function f_TC_NGAP_AMF_URP_01() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger UE RADIO CAPABILITY CHECK management procedure !"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UERadioCapabilityCheckRequest( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_URP_01 - } // End of group UE_Radio_Capability_Check //8.14.3 group UE_Radio_Capability_ID_Mapping{ - - /** - * @desc Testcase function for TC_NGAP_aMF_URP_02 - */ - function f_TC_NGAP_AMF_URP_02() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UERadioCapabilityIDMappingRequest( - '0000000000'O//in template (value) UERadioCapabilityID p_uERadioCapabilityID == OCTETSTRING - ) - ) - ); - - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_UERadioCapabilityIDMappingResponse( - ?,//template (present) UERadioCapabilityID p_uERadioCapabilityID := ?, - ?//template (present) UERadioCapability p_uERadioCapability := ? - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_URP_02 - } // End of group UE_Radio_Capability_ID_Mapping } // End of group UE_Radio_Capability_Management_Procedures //8.15 @@ -6748,41 +6526,6 @@ module NGAP_TCFunctions { } // End of group Uplink_RIM_Information_Transfer //8.16.2 group Downlink_RIM_Information_Transfer{ - - /** - * @desc Testcase function for TC_NGAP_aMF_RIP_01 - */ - function f_TC_NGAP_AMF_RIP_01() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger RIM Information Transfer procedure !"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_DownlinkRIMInformationTransfer( - ?//template (present) RIMInformationTransfer p_rIMInformationTransfer := ? - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_RIP_01 - } // End of group Downlink_RIM_Information_Transfer } // End of group RIM_Information_Transfer_Procedures } // End of group aMF_Role diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 3009f8d..52256bb 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -3469,68 +3469,12 @@ module NGAP_TestCases { group Trace_Procedures{ //8.11.1 group Trace_Start{ - - /** - * @desc "Verify that the IUT can send a TRACE_START to initiate a trace session for a UE." - */ - testcase TC_NGAP_AMF_TRP_01() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_10_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_10_1' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_TRP_01()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_TRP_01 - } // End of group Trace_Start //8.11.2 group Trace_Failure_Indication{ } // End of group Trace_Failure_Indication //8.11.3 group Deactivate_Trace{ - - /** - * @desc "Verify that the IUT can send a DEACTIVATE_TRACE to deactivate a trace session for a UE." - */ - testcase TC_NGAP_AMF_TRP_02() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_10_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_10_3' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_TRP_02()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_TRP_02 - } // End of group Deactivate_Trace //8.11.4 group Cell_Traffic_Trace{ @@ -3579,34 +3523,6 @@ module NGAP_TestCases { group UE_TNLA_Binding_Procedures{ //8.13.1 group UE_TNLA_Binding_Release{ - - /** - * @desc "Verify that the IUT can send a UE TNLA BINDING RELEASE REQUEST to initiate a UE TNLA Binding Release procedure." - */ - testcase TC_NGAP_AMF_UBP_01() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_12_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_12_1' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_UBP_01()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_UBP_01 - } // End of group UE_TNLA_Binding_Release } // End of group UE_TNLA_Binding_Procedures //8.14 @@ -3616,65 +3532,9 @@ module NGAP_TestCases { } // End of group UE_Radio_Capability_Info_Indication //8.14.2 group UE_Radio_Capability_Check{ - - /** - * @desc "Verify that the IUT can send a UE RADIO CAPABILITY CHECK REQUEST to initiate UE Radio Capability Management procedure." - */ - testcase TC_NGAP_AMF_URP_01() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_13_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_13_2' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_URP_01()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_URP_01 - } // End of group UE_Radio_Capability_Check //8.14.3 group UE_Radio_Capability_ID_Mapping{ - - /** - * @desc "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING RESPONSE message that contains mandatory IEs to provide the UE radio capabilities id mapping." - */ - testcase TC_NGAP_AMF_URP_02() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_13_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_13_3' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_URP_02()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_URP_02 - } // End of group UE_Radio_Capability_ID_Mapping } // End of group UE_Radio_Capability_Management_Procedures //8.15 @@ -3690,34 +3550,6 @@ module NGAP_TestCases { } // End of group Uplink_RIM_Information_Transfer //8.16.2 group Downlink_RIM_Information_Transfer{ - - /** - * @desc "Verify that the IUT can send a DOWNLINK RIM INFORMATION TRANSFER." - */ - testcase TC_NGAP_AMF_RIP_01() runs on aMFNGAPComponent system TestAdapter { - - // Local variables - var aMFNGAPComponent v_ngap_gnb; - - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_15_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_15_2' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); - - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_RIP_01()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_AMF_RIP_01 - } // End of group Downlink_RIM_Information_Transfer } // End of group RIM_Information_Transfer_Procedures } // End of group aMF_Role diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 802477b..11466be 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -720,7 +720,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), * } ), @@ -842,7 +842,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), * } ), @@ -967,7 +967,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), * } ), @@ -1088,7 +1088,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), * } ), @@ -1209,7 +1209,7 @@ module NG_NAS_TCFunctions { -, -, { *, - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), * } ), @@ -1252,7 +1252,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1434,7 +1434,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1566,7 +1566,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1641,7 +1641,7 @@ module NG_NAS_TCFunctions { // Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 0a0db59..3f06347 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -1769,7 +1769,53 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02 - // 13: fl_GetNAI + /** + * @desc Verify that the fl_GetServingNetworkName function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.2 KAUSF derivation function + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + var NAS_Mcc v_nas_mcc := '001'H; // MCC: Mobile Country Code, + var hexstring v_nas_mnc := '01'H; // MNC: Mobile Network Code + var NAS_PlmnId v_plmn := fl_NasNN_MCC2PlmnId(v_nas_mcc, v_nas_mnc); + if (v_plmn != '00f110'O) { + log("*** " & __SCOPE__ & ": ERROR: 'fl_NasNN_MCC2PlmnId' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fl_NasNN_MCC2PlmnId' returned: ", v_plmn, " ***"); + } + + v_nas_mcc := '505'H; // MCC: Mobile Country Code, + v_nas_mnc := '93'H; // MNC: Mobile Network Code + v_plmn := fl_NasNN_MCC2PlmnId(v_nas_mcc, v_nas_mnc); + if (v_plmn != '05f539'O) { + log("*** " & __SCOPE__ & ": ERROR: 'fl_NasNN_MCC2PlmnId' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fl_NasNN_MCC2PlmnId' returned: ", v_plmn, " ***"); + } + + v_nas_mcc := '999'H; // MCC: Mobile Country Code, + v_nas_mnc := '70'H; // MNC: Mobile Network Code + v_plmn := fl_NasNN_MCC2PlmnId(v_nas_mcc, v_nas_mnc); + if (v_plmn != '99f907'O) { + log("*** " & __SCOPE__ & ": ERROR: 'fl_NasNN_MCC2PlmnId' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fl_NasNN_MCC2PlmnId' returned: ", v_plmn, " ***"); + } + + v_nas_mcc := '732'H; // MCC: Mobile Country Code, + v_nas_mnc := '123'H; // MNC: Mobile Network Code + v_plmn := fl_NasNN_MCC2PlmnId(v_nas_mcc, v_nas_mnc); + if (v_plmn != '373221'O) { + log("*** " & __SCOPE__ & ": ERROR: 'fl_NasNN_MCC2PlmnId' returned an unexpected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'fl_NasNN_MCC2PlmnId' returned: ", v_plmn, " ***"); + } + + setverdict(pass); + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 /** * @desc Verify that the fx__CalculateFCS32 function is working correctly diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 4fa70fe..1fade87 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -145,7 +145,8 @@ module LibNGAP_Pixits { * @desc The Mobile Country Code (MCC) and Mobile Network Code (MNC) * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.5 PLMN Identity */ - modulepar PLMNIdentity PX_PLMN_IDENTITY := '00f110'O; // MCC: 1, MNC: 01 + modulepar NAS_Mcc PX_NAS_MCC := '001'H; // MCC: 1 + modulepar hexstring PX_NAS_MNC := '01'H; // MNC: 01 modulepar O1_Type PX_TIME_ZONE := '80'O; // 0x40 for GMT+1, 0x80 for GMT+2 diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index d6c47cf..72b86a9 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -18,7 +18,10 @@ module LibNGAP_Templates { // Lib3GPP/NAS import from NAS_CommonTypeDefs all; - // LibNGAP + // Lib_NG_NAS + import from Lib_NG_NAS_Security_Functions all; + + // LibNGAP import from NGAP_Constants language "ASN.1:2002" all; import from NGAP_CommonDataTypes language "ASN.1:2002" all; import from NGAP_IEs language "ASN.1:2002" all; @@ -5326,7 +5329,7 @@ module LibNGAP_Templates { in template (value) RRCEstablishmentCause p_rrcEstCause := PX_RRC_ESTABLISHMENT_CAUSE ) := { procedureCode := id_InitialUEMessage, - criticality := reject, + criticality := ignore, value_ := { InitialUEMessage := { protocolIEs := { @@ -5442,7 +5445,7 @@ module LibNGAP_Templates { template (present) InitiatingMessage mw_n2_initialUeMessage_base_nas:= { procedureCode := id_InitialUEMessage, - criticality := reject, + criticality := ignore, value_ := { InitialUEMessage := { protocolIEs := {*, @@ -5465,7 +5468,7 @@ module LibNGAP_Templates { template (present) UEContextRequest p_uEContextRequest := ? ) := { procedureCode := id_InitialUEMessage, - criticality := reject, + criticality := ignore, value_ := { InitialUEMessage := { protocolIEs := {permutation( @@ -10272,7 +10275,7 @@ module LibNGAP_Templates { ) := p_list; template (omit) BroadcastPLMNItem m_ie_broadcastPLMNItem( - in template (value) PLMNIdentity p_plmnId := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_plmnId := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) SliceSupportList p_ssl, in template (omit) BroadcastPLMNItem.iE_Extensions p_iE_Extensions := omit ) := { @@ -11077,7 +11080,7 @@ module LibNGAP_Templates { template (value) EndIndication m_endIndication(in EndIndication p_value := no_further_data) := p_value; template (omit) EPS_TAI m_ePS_TAI( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) EPS_TAC p_ePS_TAC := PX_EPS_TAC, in template (omit) EPS_TAI.iE_Extensions p_iE_Extensions := omit ) := { @@ -11133,7 +11136,7 @@ module LibNGAP_Templates { } // End of template m_e_RABInformationItem_full template (omit) EUTRA_CGI m_uUTRA_CGI( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) EUTRACellIdentity p_eUTRACellIdentity := PX_EUTRA_CELL_IDENTITY, in template (omit) EUTRA_CGI.iE_Extensions p_iE_Extensions := omit ) := { @@ -11367,7 +11370,7 @@ module LibNGAP_Templates { } // End of template m_fiveG_S_TMSI template (omit) ForbiddenAreaInformation_Item m_forbiddenAreaInformation_Item( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) ForbiddenTACs p_forbiddenTACs, in template (omit) ForbiddenAreaInformation_Item.iE_Extensions p_iE_Extensions := omit ) := { @@ -11437,7 +11440,7 @@ module LibNGAP_Templates { } // End of template m_globalCable_ID_new template (omit) GlobalGNB_ID m_ie_globalGnbId( - in template (value) PLMNIdentity p_plmnId := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_plmnId := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) bitstring p_gnbId := PX_GNB_ID, in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit ) := { @@ -11447,7 +11450,7 @@ module LibNGAP_Templates { } // End of template m_ie_globalGnbId template (omit) GlobalN3IWF_ID m_globalN3IWF_ID( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) N3IWF_ID p_n3IWF_ID, in template (omit) GlobalN3IWF_ID.iE_Extensions p_iE_Extensions := omit ) := { @@ -11475,7 +11478,7 @@ module LibNGAP_Templates { } // End of template m_globalLine_ID_id_TAI template (omit) GlobalNgENB_ID m_globalNgENB_ID( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) NgENB_ID p_ngENB_ID, in template (omit) GlobalNgENB_ID.iE_Extensions p_iE_Extensions := omit ) := { @@ -11555,7 +11558,7 @@ module LibNGAP_Templates { // } // End of template m_globalRANNodeID_all template (omit) GlobalTNGF_ID m_globalTNGF_ID( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) TNGF_ID p_tNGF_ID, in template (omit) GlobalTNGF_ID.iE_Extensions p_iE_Extensions := omit ) := { @@ -11565,7 +11568,7 @@ module LibNGAP_Templates { } // End of template m_globalTNGF_ID template (omit) GlobalTWIF_ID m_globalTWIF_ID( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) TWIF_ID p_tWIF_ID, in template (omit) GlobalTWIF_ID.iE_Extensions p_iE_Extensions := omit ) := { @@ -11575,7 +11578,7 @@ module LibNGAP_Templates { } // End of template m_globalTWIF_ID template (omit) GlobalW_AGF_ID m_GlobalW_AGF_ID( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) W_AGF_ID p_w_AGF_ID, in template (omit) GlobalW_AGF_ID.iE_Extensions p_iE_Extensions := omit ) := { @@ -11607,7 +11610,7 @@ module LibNGAP_Templates { } // End of template m_gTPTunnel template (omit) GUAMI m_gUAMI( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) AMFRegionID p_aMFRegionID := PX_AMF_REGION_ID, in template (value) AMFSetID p_aMFSetID := PX_AMF_SET_ID, in template (value) AMFPointer p_aMFPointer := PX_AMF_POINTER, @@ -13535,7 +13538,7 @@ module LibNGAP_Templates { } // End of template m_nPN_Support_choice_Extensions template (omit) NR_CGI m_nR_CGI( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) NRCellIdentity p_nRCellIdentity := PX_NR_CELL_IDENTITY, in template (omit) NR_CGI.iE_Extensions p_iE_Extensions := omit ) := { @@ -15013,7 +15016,7 @@ module LibNGAP_Templates { } // End of template m_pLMNAreaBasedQMC template (omit) PLMNSupportItem m_pLMNSupportItem( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) SliceSupportList p_sliceSupportList, in template (omit) PLMNSupportItem.iE_Extensions p_iE_Extensions := omit ) := { @@ -15505,7 +15508,7 @@ module LibNGAP_Templates { template (value) RAT_Information m_rAT_Information(in RAT_Information p_value := unlicensed) := p_value; template (omit) RATRestrictions_Item m_rATRestrictions_Item( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) RATRestrictionInformation p_rATRestrictionInformation, in template (omit) RATRestrictions_Item.iE_Extensions p_iE_Extensions := omit ) := { @@ -15780,7 +15783,7 @@ module LibNGAP_Templates { } // End of template m_servedGUAMIItem_id_GUAMIType template (omit) ServiceAreaInformation_Item m_serviceAreaInformation_Item( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (omit) AllowedTACs p_allowedTACs := omit, in template (omit) NotAllowedTACs p_notAllowedTACs := omit, in template (omit) ServiceAreaInformation_Item.iE_Extensions p_iE_Extensions := omit @@ -16117,7 +16120,7 @@ module LibNGAP_Templates { template (value) Suspend_Response_Indication m_suspend_Response_Indication(in Suspend_Response_Indication p_value := suspend_indicated) := p_value; template (omit) TAI m_tAI( - in template (value) PLMNIdentity p_pLMNIdentity := PX_PLMN_IDENTITY, + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), in template (value) TAC p_tAC := PX_TACode, in template (omit) TAI.iE_Extensions p_iE_Extensions := omit ) := { diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 5ed8262..be930d2 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -63,7 +63,7 @@ module LibNGAP_Functions { PX_M_RELATIVE_AMF_CAP, { m_pLMNSupportItem( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), { m_sliceSupportItem( m_s_NSSAI( @@ -86,28 +86,25 @@ module LibNGAP_Functions { m_n2_NGSetupRequest( m_globalRANNodeID_globalGNB_ID( m_ie_globalGnbId( - PX_PLMN_IDENTITY, - PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit - )), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), { m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST/*, - PX_SD*/ - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + ) + ) + } + ) + } ) }, PX_PAGING_DRX @@ -122,7 +119,7 @@ module LibNGAP_Functions { *, mw_servedGUAMIItem( mw_gUAMI( - PX_PLMN_IDENTITY + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) )), * } @@ -139,7 +136,7 @@ module LibNGAP_Functions { mw_n2_NGSetupRequest( mw_globalRANNodeID_globalGNB_ID( mw_ie_globalGnbId( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_GNB_ID )), -, @@ -150,7 +147,7 @@ module LibNGAP_Functions { { *, mw_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { *, mw_sliceSupportItem( @@ -178,7 +175,7 @@ module LibNGAP_Functions { *, mw_servedGUAMIItem( mw_gUAMI( - PX_PLMN_IDENTITY + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) )), * } @@ -195,7 +192,7 @@ module LibNGAP_Functions { mw_n2_NGSetupRequest_noRANNodeName( mw_globalRANNodeID_globalGNB_ID( mw_ie_globalGnbId( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit )), @@ -204,7 +201,7 @@ module LibNGAP_Functions { PX_TACode, { mw_ie_broadcastPLMNItem( - PX_PLMN_IDENTITY,//m_ie_pLMNIdentity('00f110'O), + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), { mw_sliceSupportItem( mw_s_NSSAI( @@ -233,7 +230,7 @@ module LibNGAP_Functions { *, mw_servedGUAMIItem( mw_gUAMI( - PX_PLMN_IDENTITY + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) )), * } @@ -248,7 +245,7 @@ module LibNGAP_Functions { // Send REGISTRATION_REQUEST var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -344,7 +341,7 @@ module LibNGAP_Functions { log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -406,7 +403,7 @@ module LibNGAP_Functions { log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // Compute RES/XRES - if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { setverdict(fail); return; } @@ -491,7 +488,7 @@ module LibNGAP_Functions { // Prepare response for SECURITY_MODE_COMPLETE // 1. Registration Request message with no var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -629,7 +626,7 @@ module LibNGAP_Functions { vc_RAN_UE_ID, mw_gUAMI ( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_AMF_REGION_ID, PX_AMF_SET_ID, PX_AMF_POINTER, @@ -694,7 +691,7 @@ module LibNGAP_Functions { vc_RAN_UE_ID, mw_gUAMI ( - PX_PLMN_IDENTITY, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), PX_AMF_REGION_ID, PX_AMF_SET_ID, PX_AMF_POINTER, @@ -1707,7 +1704,7 @@ module LibNGAP_Functions { // Send request for DEREGISTRATION_REQUEST var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -1926,106 +1923,4 @@ module LibNGAP_Functions { } // End of function f_NASPDU_Get - function f_NG_Imeisv2MobileIdentity_v( - in hexstring p_IMEISV - ) return NG_MobileIdentity { - var integer v_ImeiLength := lengthof(p_IMEISV); - var integer v_Odd := (v_ImeiLength rem 2); - var octetstring v_Other := f_ImsiImei2Octetstring (p_IMEISV); - var B4_Type v_FirstDigit := hex2bit(p_IMEISV[0]); - var B1_Type v_OddEvenInd := int2bit(v_Odd, 1); - - return valueof({ - iei := '77'O, - iel := int2oct(1+v_ImeiLength, 2), - idDigit1 := v_FirstDigit, - oddEvenInd := v_OddEvenInd, - typeOfId := tsc_IdType_NG_IMEISV, - otherDigits := v_Other - }); - } - - // TODO To be moved in Lib_NG_NAS_Security_Functions.ttcn - // See NG_NasEmu_Common.f_EncodeAndCipher_NG_NasPdu - // This function needs to be reworked for ciphering - function f_EncodeAndCipher_NG_NasPdu_v( // TODO To be renamed - in SecurityHeaderType p_security_header_type, - in octetstring p_nAS_PDU, - in MAC_Direction_Type p_direction, - in B5_Type p_bearerId, - inout NasCount_Type p_nas_count, - inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type, - out NG_SECURITY_PROTECTED_NAS_MESSAGE p_ng_security_protected_nas_message - ) return octetstring { - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nAS_PDU: ", p_nAS_PDU); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_direction: ", p_direction); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_bearerId: ", p_bearerId); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); - - //v_EncodedNasPdu := f_NG_NasEmu_EncodePiggybacked(p_NAS_MSG_Request.Pdu); - - if (p_ng_nas_security_params_type.NAS_Integrity.Algorithm == tsc_SHT_NoSecurityProtection) { - log("f_EncodeAndCipher_NG_NasPdu_v: No security applied"); - return p_nAS_PDU; - } - - // Increment NAS count - p_nas_count := f_NasSecurity_IncrementCOUNT(p_nas_count); - - // Apply ciphering if necessary - var octetstring v_EncodedNasPdu := p_nAS_PDU; - if ( - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) - ) { - log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); - v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, - p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, - p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, - p_nas_count, - p_bearerId); - } - if ( - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) - ) { - log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); - v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, - p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, - p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, - p_nas_count, - p_bearerId); - } - - // Apply integrity protection - log("f_EncodeAndCipher_NG_NasPdu_v: Apply integrity protection"); - var NAS_SequenceNumber v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(p_nas_count); - log("f_EncodeAndCipher_NG_NasPdu_v: v_SequenceNumber: ", v_SequenceNumber); - var octetstring v_Octet7toN := v_SequenceNumber & v_EncodedNasPdu; - log("f_EncodeAndCipher_NG_NasPdu_v: v_Octet7toN: ", v_Octet7toN); - var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, - p_ng_nas_security_params_type.NAS_Integrity.Algorithm, - p_ng_nas_security_params_type.NAS_Integrity.K_NAS, - p_nas_count, - p_bearerId, - p_direction); - log("f_EncodeAndCipher_NG_NasPdu_v: v_calculated_mac: ", v_calculated_mac); - - // Security protected NAS message - var NG_NAS_DL_Message_Type v := valueof( - m_NG_SecurityProtected_NasMsg( - p_security_header_type, - v_calculated_mac, - v_SequenceNumber, - v_EncodedNasPdu - )); - p_ng_security_protected_nas_message := v.security_Protected_Nas_Message; - v_EncodedNasPdu := bit2oct(encvalue(p_ng_security_protected_nas_message)); - - log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_ng_security_protected_nas_message: ", p_ng_security_protected_nas_message); - log("<<< f_EncodeAndCipher_NG_NasPdu_v: ", v_EncodedNasPdu); - return v_EncodedNasPdu; - } - } // End of module LibNGAP_Functions diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 189166c..0762755 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -15,6 +15,7 @@ module Lib_NG_NAS_Security_Functions { import from NAS_CommonTemplates all; import from NG_NAS_Common all; import from NAS_AuthenticationCommon all; + import from NAS_AuxiliaryDefsAndFunctions all; import from NG_NAS_SecurityFunctions all; import from NG_SecurityDefinitionsAndExternalFunctions all; import from EUTRA_NR_SecurityFunctions all; @@ -639,4 +640,131 @@ module Lib_NG_NAS_Security_Functions { } // End of function fiveg_aka_security_network + function f_NG_Imeisv2MobileIdentity_v( + in hexstring p_IMEISV + ) return NG_MobileIdentity { + var integer v_ImeiLength := lengthof(p_IMEISV); + var integer v_Odd := (v_ImeiLength rem 2); + var octetstring v_Other := f_ImsiImei2Octetstring (p_IMEISV); + var B4_Type v_FirstDigit := hex2bit(p_IMEISV[0]); + var B1_Type v_OddEvenInd := int2bit(v_Odd, 1); + + return valueof({ + iei := '77'O, + iel := int2oct(1+v_ImeiLength, 2), + idDigit1 := v_FirstDigit, + oddEvenInd := v_OddEvenInd, + typeOfId := tsc_IdType_NG_IMEISV, + otherDigits := v_Other + }); + } + + // TODO To be moved in Lib_NG_NAS_Security_Functions.ttcn + // See NG_NasEmu_Common.f_EncodeAndCipher_NG_NasPdu + // This function needs to be reworked for ciphering + function f_EncodeAndCipher_NG_NasPdu_v( // TODO To be renamed + in SecurityHeaderType p_security_header_type, + in octetstring p_nAS_PDU, + in MAC_Direction_Type p_direction, + in B5_Type p_bearerId, + inout NasCount_Type p_nas_count, + inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type, + out NG_SECURITY_PROTECTED_NAS_MESSAGE p_ng_security_protected_nas_message + ) return octetstring { + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nAS_PDU: ", p_nAS_PDU); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_direction: ", p_direction); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_bearerId: ", p_bearerId); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); + + //v_EncodedNasPdu := f_NG_NasEmu_EncodePiggybacked(p_NAS_MSG_Request.Pdu); + + if (p_ng_nas_security_params_type.NAS_Integrity.Algorithm == tsc_SHT_NoSecurityProtection) { + log("f_EncodeAndCipher_NG_NasPdu_v: No security applied"); + return p_nAS_PDU; + } + + // Increment NAS count + p_nas_count := f_NasSecurity_IncrementCOUNT(p_nas_count); + + // Apply ciphering if necessary + var octetstring v_EncodedNasPdu := p_nAS_PDU; + if ( + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) + ) { + log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); + v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, + p_nas_count, + p_bearerId); + } + if ( + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) + ) { + log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); + v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, + p_nas_count, + p_bearerId); + } + + // Apply integrity protection + log("f_EncodeAndCipher_NG_NasPdu_v: Apply integrity protection"); + var NAS_SequenceNumber v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(p_nas_count); + log("f_EncodeAndCipher_NG_NasPdu_v: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_EncodedNasPdu; + log("f_EncodeAndCipher_NG_NasPdu_v: v_Octet7toN: ", v_Octet7toN); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_ng_nas_security_params_type.NAS_Integrity.Algorithm, + p_ng_nas_security_params_type.NAS_Integrity.K_NAS, + p_nas_count, + p_bearerId, + p_direction); + log("f_EncodeAndCipher_NG_NasPdu_v: v_calculated_mac: ", v_calculated_mac); + + // Security protected NAS message + var NG_NAS_DL_Message_Type v := valueof( + m_NG_SecurityProtected_NasMsg( + p_security_header_type, + v_calculated_mac, + v_SequenceNumber, + v_EncodedNasPdu + )); + p_ng_security_protected_nas_message := v.security_Protected_Nas_Message; + v_EncodedNasPdu := bit2oct(encvalue(p_ng_security_protected_nas_message)); + + log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_ng_security_protected_nas_message: ", p_ng_security_protected_nas_message); + log("<<< f_EncodeAndCipher_NG_NasPdu_v: ", v_EncodedNasPdu); + return v_EncodedNasPdu; + } + + function fl_NasNN_MCC2PlmnId( + in NAS_Mcc p_nas_mcc, + in hexstring p_nas_mnc + ) return NAS_PlmnId { + log(">>> fl_NasNN_MCC2PlmnId: p_nas_mcc=", p_nas_mcc); + log(">>> fl_NasNN_MCC2PlmnId: p_nas_mnc=", p_nas_mnc); + + log("fl_NasNN_MCC2PlmnId: p_nas_mcc[0]=", p_nas_mcc[0]); + log("fl_NasNN_MCC2PlmnId: p_nas_mcc[1]=", p_nas_mcc[1]); + log("fl_NasNN_MCC2PlmnId: p_nas_mcc[2]=", p_nas_mcc[2]); + log("fl_NasNN_MCC2PlmnId: p_nas_mnc[0]=", p_nas_mnc[0]); + log("fl_NasNN_MCC2PlmnId: p_nas_mnc[1]=", p_nas_mnc[1]); + + var hexstring v_plmn_hexstring; + if (lengthof(p_nas_mnc) == 2) { + v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & 'f'H & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; + } else { + v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & p_nas_mnc[2] & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; + } + log("fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", v_plmn_hexstring); + log("fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", hex2oct(v_plmn_hexstring)); + + return hex2oct(v_plmn_hexstring); + } + } // End of module Lib_NG_NAS_Security_Functions \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index 1069d50..e3e8877 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -36,7 +36,7 @@ module Lib_NG_NAS_Functions { */ function f_send_NasRegistrationRequest() runs on NGNASComponent { var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - PX_PLMN_IDENTITY & + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator '00'O & // Protection scheme '00'O & // Home network public key identifier @@ -108,7 +108,7 @@ module Lib_NG_NAS_Functions { // -, -, // { // *, - // PX_PLMN_IDENTITY, + // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), // * // } // ), @@ -161,7 +161,7 @@ module Lib_NG_NAS_Functions { // log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // // Compute RES/XRES - // if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, PX_PLMN_IDENTITY, -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + // if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { // setverdict(fail); // return; // } -- GitLab From 71ab28539c1346f5e4fcdf9525b97ced10b1140a Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 21 Apr 2026 15:56:41 +0200 Subject: [PATCH 091/151] Review TC_NGAP_AMF_IMP_01; Add TC_NGAP_AMF_IMP_01_02 --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 6 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 12 +++ ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 81 ++++++++++++++++--- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 74 +++++++++++++++++ .../lib_system/Lib_NG_NAS_Functions.ttcn | 2 +- 5 files changed, 163 insertions(+), 12 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 4b3d70a..f354fdf 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -153,10 +153,12 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #NGAP_TestCases.TC_NGAP_AMF_MMP_09 # Verify that the IUT can send an DOWNLINK NAS TRANSPORT message to carry NAS information over the NG interface. -#NGAP_TestCases.TC_NGAP_AMF_NAS_01 +NGAP_TestCases.TC_NGAP_AMF_NAS_01 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. -NGAP_TestCases.TC_NGAP_AMF_IMP_01 +#NGAP_TestCases.TC_NGAP_AMF_IMP_01 +# Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing the PLMN identity, TAC, supported slice IEs and Extended RAN Node Name, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup. +#NGAP_TestCases.TC_NGAP_AMF_IMP_01_02 # Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup. #NGAP_TestCases.TC_NGAP_AMF_IMP_02 # Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup. diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 19be5e3..2789ade 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -224,6 +224,18 @@ module NGAP_Steps { } } // End of function f_NGAP_amf_UE_Authentication + /** + * @desc + */ + function f_NGAP_amf_UE_Authentication_Failure() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_UE_Authentication"); + if (PICS_OFFLINE_MODE) { + f_await_authentication_request_await_authentication_response_failure(); + } else { + f_await_authentication_request_send_authentication_response_failure(); + } + } // End of function f_NGAP_amf_UE_Authentication + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 5dba386..7af4cfb 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -5441,6 +5441,9 @@ module NGAP_TCFunctions { // Extract AMF_UE_NGAP_ID for termination vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID for termination + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -5493,15 +5496,13 @@ module NGAP_TCFunctions { fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), { m_sliceSupportItem( - m_s_NSSAI( - PX_SST/*, - PX_SD*/ - ) + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + ) ) - } - ) - } - ) + }) + }) }, PX_PAGING_DRX ))); @@ -5523,12 +5524,74 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_AMF(); + f_NGAP_amf_UE_Authentication_Failure(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_AMF_IMP_01 + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_01_02 + */ + function f_TC_NGAP_AMF_IMP_01_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + // Send NGSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD + )) + }) + }) + }, + PX_PAGING_DRX + ))); + // Await NGSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + } + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_NGAP_amf_UE_Authentication_Failure(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_01_02 + /** * @desc Testcase function for TC_NGAP_AMF_IMP_02 */ diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index be930d2..153a154 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -294,6 +294,7 @@ module LibNGAP_Functions { // Extract RAN_UE_NGAP_ID vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.initialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); } else { log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); @@ -339,6 +340,9 @@ module LibNGAP_Functions { // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); // Compute RES/XRES if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { @@ -401,6 +405,9 @@ module LibNGAP_Functions { // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); // Compute RES/XRES if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { @@ -444,6 +451,73 @@ module LibNGAP_Functions { // TODO Await response for AUTHENTICATION_RESPONSE } + /** + * @desc Function to await NAS AuthenticationRequest message and await for ErrorIndication message + */ + function f_await_authentication_request_await_authentication_response_failure() runs on NGNASComponent { + log(">>> f_await_authentication_request_await_authentication_response_failure"); + + // Await request for DOWNLINK_NAS_TRANSPORT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))); + + // Extract AMF_UE_NGAP_ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + + // Await response for AUTHENTICATION_RESPONSE failure + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_ErrorIndication_ids( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + + setverdict(pass); + } + + /** + * @desc Function to await NAS AuthenticationRequest message and send for ErrorIndication message + */ + function f_await_authentication_request_send_authentication_response_failure() runs on NGNASComponent { + log(">>> f_await_authentication_request_send_authentication_response_failure"); + + // Await request for DOWNLINK_NAS_TRANSPORT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))); + + // Extract AMF_UE_NGAP_ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + + // Await response for AUTHENTICATION_RESPONSE failure + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_ErrorIndication_ids( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_cause_nas(authentication_failure) + ))); + + setverdict(pass); + } + /** * @desc Function to send NAS SecurityModeCommand message and await for SecurityModeComplete message */ diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index e3e8877..17caa0f 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -77,7 +77,7 @@ module Lib_NG_NAS_Functions { // log("Received NG_REGISTRATION_REQUEST NAS message"); // // Extract ID-RAN-UE-NGAP-ID -// vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; +// vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.InitialUEMessage.protocolIEs[1].value_.rAN_UE_NGAP_ID; // log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); // } else { // log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message ***"); -- GitLab From 7c22eeeb653f1c94938e8243eafe1b92cbdff98f Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 21 Apr 2026 17:41:46 +0200 Subject: [PATCH 092/151] corected index for ue_ngap_ran_id --- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 153a154..f6ced48 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -341,7 +341,7 @@ module LibNGAP_Functions { vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); // Extract RAN_UE_NGAP_ID - vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.rAN_UE_NGAP_ID; + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); // Compute RES/XRES @@ -405,8 +405,8 @@ module LibNGAP_Functions { // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); - // Extract RAN_UE_NGAP_ID - vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.rAN_UE_NGAP_ID; + // Extract + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); // Compute RES/XRES -- GitLab From b560d9979e655020423692b7881cbd0785de25c3 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 21 Apr 2026 16:11:52 +0000 Subject: [PATCH 093/151] Updates up to TP_5GNAS_AMF_AUT_SEQ_01 --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 69 ++++++++++++------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 817af09..842de50 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -68,9 +68,10 @@ Package TP_AMF { message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; + ABBA containing + ABBA_contents set to '0000'H;, + Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN indicating value RV_Authentication_parameter_AUTN;; to the GNB entity } } @@ -165,7 +166,7 @@ Package TP_AMF { Test objective "Verify that the IUT sends an IDENTITY_REQUEST message correctly upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #20 - MAC failure." Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c) and 8.2.4" + "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c), 5.4.3 and 8.2.4" Config Id CF_AMF_N2N1 @@ -224,14 +225,13 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, //value for nas_key_set_identifier was already used before - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; + ABBA containing + ABBA_contents set to '0000'H;, + Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN indicating value RV_Authentication_parameter_AUTN;; to the GNB entity } @@ -248,17 +248,16 @@ Package TP_AMF { } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - message_type set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI;, - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing + nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI;, + ABBA containing + ABBA_contents set to '0000'H;, + Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN indicating value RV_Authentication_parameter_AUTN;; to the GNB entity } } @@ -270,14 +269,14 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_AUT_ABN_01 - Test objective "Verify that the IUT sends a new IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." + Test objective "Verify that the IUT sends an IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." Reference "ETSI TS 124 501 [1], Clauses 5.4.1.3.7, 8.2.4, 5.4.3.2 and 8.2.21.1" Config Id CF_AMF_N2N1 - PICS Selection NONE + PICS Selection PICS_A4/1_2_3_1 Initial conditions with { the UE entity isNotRegisteredToAMF and @@ -285,14 +284,13 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, message_type set to AUTHENTICATION_REQUEST, ngKSI containing nas_key_set_identifier set to "111";, - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN;; //the "separation bit" in the AMF field of AUTN is set to 0 + ABBA containing + ABBA_contents set to '0000'H;, + Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE;; //the "separation bit" in the AMF field of AUTN is set to 0 to the GNB entity } @@ -312,9 +310,8 @@ Package TP_AMF { NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, message_type set to IDENTITY_REQUEST, - 5GS_identity_type_IEI set to "SUCI";; + identity_type set to SUCI;; to the GNB entity } } @@ -330,16 +327,16 @@ Package TP_AMF { Test Purpose { - TP Id TP_NGNAS_AMF_AUT_SEQ_01 + TP Id TP_5GNAS_AMF_AUT_SEQ_01 - Test objective "Verify that the IUT sends a SECURITY_MODE_COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION_RESPONSE." + Test objective "Verify that the IUT sends a SECURITY_MODE_COMMAND message to initiate the NAS security mode control procedure upon receipt of an AUTHENTICATION_RESPONSE message in a 5G AKA based primary authentication procedure." Reference "ETSI TS 124 501 [1], Clauses 5.4.2.2, 5.4.2.3 and 8.2.25" Config Id CF_AMF_N2N1 - PICS Selection NONE + PICS Selection PICS_A4/2_1 Initial conditions with { the UE entity isNotRegisteredToAMF and @@ -365,14 +362,16 @@ Package TP_AMF { extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_COMMAND, - selected_NAS_security_algorithms, + selected_NAS_security_algorithms containing + type_of_ciphering_algorithm indicating value PX_SELECTED_NAS_CIPHERING_ALGORITHM, + type_of_integrity_algorithm indicating value PX_SELECTED_NAS_INTEGRITY_ALGORITHM;, ngKSI containing nas_key_set_identifier set to "111";, - replayed_UE_security_capabilities;; // UE security capability 9.11.3.54 + replayed_UE_security_capabilities indicating value PX_UE_SECURITY_CAPABILITIES;; // UE security capability 9.11.3.54 to the GNB entity } } - } // end TP_NGNAS_AMF_AUT_SEQ_01 + } // end TP_5GNAS_AMF_AUT_SEQ_01 Test Purpose { -- GitLab From a06a463abd954c0b68bdcf0340041e14550b254b Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 22 Apr 2026 09:55:41 +0200 Subject: [PATCH 094/151] corrected template downlink to uplink for PDUSessionEstablismentReq for offline mode --- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index f6ced48..041fc07 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1081,7 +1081,7 @@ module LibNGAP_Functions { // Await PDUSessionEstablishmentRequest f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_DownlinkNASTransport( + mw_n2_UplinkNASTransport( vc_AMF_UE_ID, vc_RAN_UE_ID ))); -- GitLab From 26a59b6398f669228a1fd1bc3739221ea1dfa933 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Wed, 22 Apr 2026 08:37:32 +0000 Subject: [PATCH 095/151] Additional IE name or value update --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 47 ++++++++++--------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 842de50..366ebc8 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -419,8 +419,6 @@ Package TP_AMF { 5G_TMSI indicating value RV_5G_TMSI;, TAI_list containing Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, MCC indicating value PX_MCC, MNC indicating value PX_MNC, TAC indicating value PX_TAC;;, @@ -646,7 +644,7 @@ Package TP_AMF { payload_container_type set to "N1 SM information", number_of_optional_IEs set to 1, optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_ACCEPT;, - pDU_session_ID;; + pDU_session_ID RV_PDU_SESSION_ID;; to the GNB entity } @@ -718,8 +716,6 @@ Package TP_AMF { 5G_TMSI indicating value RV_5G_TMSI;, TAI_list containing Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, MCC indicating value PX_MCC, MNC indicating value PX_MNC, TAC indicating value PX_TAC;;, @@ -791,8 +787,6 @@ Package TP_AMF { 5G_TMSI indicating value RV_5G_TMSI;, TAI_list containing Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, MCC indicating value PX_MCC, MNC indicating value PX_MNC, TAC indicating value PX_TAC;;, @@ -864,8 +858,6 @@ Package TP_AMF { 5G_TMSI indicating value RV_5G_TMSI;, TAI_list containing Partial_tracking_area_list_1 containing - Type_of_list, - Number_of_elements, MCC indicating value PX_MCC, MNC indicating value PX_MNC, TAC indicating value PX_TAC;;, @@ -932,9 +924,7 @@ Package TP_AMF { Allowed_NSSAI containing S_NSSAI_1 containing SST set to PX_SST_1, - SD set to PX_SD_1, - Mapped_HPLMN_SST set to PX_MAPPED_HPLMN_SST_1, - Mapped_HPLMN_SD set to PX_MAPPED_HPLMN_SD_1;;;; + SD set to PX_SD_1;;;; to the GNB entity } } @@ -995,7 +985,6 @@ Package TP_AMF { 5G_TMSI indicating value RV_5G_TMSI;, Rejected_NSSAI containing Rejected_S_NSSAI_1 containing - Cause_value, SST set to PX_SST_Rejected, SD set to PX_SD_Rejected;;;; to the GNB entity @@ -1030,7 +1019,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, + 5GS_registration_type set to INITIAL_REGISTRATION, FOR indicating value 1;, //Follow-on request pending 5GS_mobile_identity containing SUPI_format indicating value IMSI, @@ -1126,11 +1115,11 @@ Package TP_AMF { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, Access_type set to 3GPP_ACCESS;, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, @@ -1176,11 +1165,11 @@ Package TP_AMF { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing - Switch_off_value set to SWITCH_OFF, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Switch_off set to SWITCH_OFF, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, Access_type set to 3GPP_ACCESS;, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, @@ -1236,11 +1225,11 @@ Package TP_AMF { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, Access_type set to 3GPP_ACCESS;;; to the GNB entity } @@ -1281,11 +1270,11 @@ Package TP_AMF { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_NOT_REQUIRED, + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, Access_type set to 3GPP_ACCESS;;; to the GNB entity } @@ -1318,11 +1307,11 @@ Package TP_AMF { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing - Switch_off_value set to NORMAL_DEREGISTRATION, - Reregistration_required_value set to REREGISTRATION_REQUIRED, + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_REQUIRED, Access_type set to 3GPP_ACCESS;;; to the GNB entity } -- GitLab From 16cf3afb5a7ab1011eaecde766a5afbb5c9019b7 Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 22 Apr 2026 11:29:46 +0200 Subject: [PATCH 096/151] added receive ueradiocapability before registration cpmple for offline --- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 041fc07..d23869b 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -978,6 +978,14 @@ module LibNGAP_Functions { function f_await_registration_complete() runs on NGNASComponent { log(">>> f_await_registration_complete"); + // Await request for UERadiCapability - OPTIONAL? + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UERadioCapabilityInfoIndication( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + ? + ))); // Await request for REGISTRATION_COMPLETE f_recv_NGAP_PDU( mw_ngap_initMsg( -- GitLab From bea770df28b183dc4af4b43c710edcb9118ef074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Wed, 22 Apr 2026 17:32:33 +0200 Subject: [PATCH 097/151] deprecated file --- test_purposes/ngnas/TP_AMF_NGAP.tplan2 | 280 ------------------------- 1 file changed, 280 deletions(-) delete mode 100644 test_purposes/ngnas/TP_AMF_NGAP.tplan2 diff --git a/test_purposes/ngnas/TP_AMF_NGAP.tplan2 b/test_purposes/ngnas/TP_AMF_NGAP.tplan2 deleted file mode 100644 index 3ab2b8b..0000000 --- a/test_purposes/ngnas/TP_AMF_NGAP.tplan2 +++ /dev/null @@ -1,280 +0,0 @@ -/* -Copyright (c) ETSI 2025. - -This software is subject to copyrights owned by ETSI. Non-exclusive permission -is hereby granted, free of charge, to copy, reproduce and amend this file -under the following conditions: It is provided "as is", without warranty of any -kind, expressed or implied. - -ETSI shall never be liable for any claim, damages, or other liability arising -from its use or inability of use.This permission does not apply to any documentation -associated with this file for which ETSI keeps all rights reserved. The present -copyright notice shall be included in all copies of whole or part of this -file and shall not imply any sub-license right. -*/ - -/* interface at AMF */ -Package TP_AMF_NGAP { - - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GAP_ICS_01 - - Test objective "The IUT is able to receive an INITIAL_UE_MESSAGE to indicate a NAS transport procedure and reply with INITIAL_CONTEXT_SETUP_REQUEST." - - Reference - "ETSI TS 138 413 [1], Clauses 8.3.1.2, 8.6.1.2, 9.2.5.1 and 9.2.2.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU, //(see note) - User_Location_Information containing - nR_CGI containing - pLMNIdentity containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC;, - nRCellIdentity indicating value PX_NR_CELL_IDENTITY;, - tAI containing - pLMNIdentity containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC;, - tAC indicating value PX_TAC;;, - RRC_Establishmnet_Cause indicating value "mo-signalling", - UE_Context_Request containing - UEContextRequest indicating value '0';; //requested - from the GNB entity - } - then { - the IUT entity sends an INITIAL_CONTEXT_SETUP_REQUEST containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - GUAMI containing - pLMNIdentity containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC;, - aMFRegionID indicating value RV_AMFRegionID, - aMFSetID indicating value RV_AMFSetID, - aMFPointerID indicating value RV_AMFPointerID;, - NAS_PDU, //(see note) - Allowed_NSSAI containing - Allowed_NSSAI_List containing - Allowed_NSSAI_Item containing - S_NSSAI containing - SST;;;;, - UE_Security_Capabilities containing - NR_Encryption_Algorithms, - NR_Integrity_Protection_Algorithms, - E_UTRA_Encryption_Algorithms, - E_UTRA_Integrity_Protection_Algorithms;, - Security_Key; - to the GNB entity - } - } - }// end TP_5GAP_ICS_01 - - Test Purpose { - - TP Id TP_5GAP_ICS_02 - - Test objective "The IUT is able to receive an UPLINK_NAS_TRANSPORT to indicate a NAS transport procedure and reply with INITIAL_CONTEXT_SETUP_REQUEST." - - Reference - "ETSI TS 138 413 [1], Clauses 8.3.1.2, 8.6.3.2, 9.2.2.1 and 9.2.5.3" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU, //(see note) - User_Location_Information; - from the GNB entity - } - then { - the IUT entity sends an INITIAL_CONTEXT_SETUP_REQUEST containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - GUAMI containing - pLMNIdentity containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC;, - aMFRegionID indicating value RV_AMFRegionID, - aMFSetID indicating value RV_AMFSetID, - aMFPointerID indicating value RV_AMFPointerID;, - NAS_PDU, //(see note) - Allowed_NSSAI containing - Allowed_NSSAI_List containing - Allowed_NSSAI_Item containing - S_NSSAI containing - SST indicating value PX_SST;;;;, - UE_Security_Capabilities containing - NR_Encryption_Algorithms, - NR_Integrity_Protection_Algorithms, - E_UTRA_Encryption_Algorithms, - E_UTRA_Integrity_Protection_Algorithms;, - Security_Key; - to the GNB entity - } - } - }// end TP_5GAP_ICS_02 - - Test Purpose { - - TP Id TP_5GAP_DNA_01 - - Test objective "The IUT is able to receive an INITIAL_UE_MESSAGE to indicate a NAS transport procedure and reply with DOWNLINK_NAS_TRANSPORT." - - Reference - "ETSI TS 138 413 [1], Clauses 8.6.1.2, 8.6.2.2, 9.2.5.1 and 9.2.5.2" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU, //(see note) - User_Location_Information containing - nR_CGI containing - pLMNIdentity containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC;, - nRCellIdentity indicating value PX_NR_CELL_IDENTITY;, - tAI containing - pLMNIdentity containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC;, - tAC indicating value PX_TAC;;, - RRC_Establishmnet_Cause indicating value "mo-signalling", - UE_Context_Request containing - UEContextRequest indicating value '0';; //requested - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU; //(see note) - to the GNB entity - } - } - }// end TP_5GAP_DNA_01 - - Test Purpose { - - TP Id TP_5GAP_DNA_02 - - Test objective "The IUT is able to receive an UPLINK_NAS_TRANSPORT to indicate a NAS transport procedure and reply with DOWNLINK_NAS_TRANSPORT." - - Reference - "ETSI TS 138 413 [1], Clauses 8.6.2.2, 8.6.3.2, 9.2.5.2 and 9.2.5.3" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU, //(see note) - User_Location_Information; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU; //(see note) - to the GNB entity - } - } - }// end TP_5GAP_DNA_02 - - Test Purpose { - - TP Id TP_5GAP_PDU_01 - - Test objective "The IUT is able to receive an UPLINK_NAS_TRANSPORT to indicate a NAS transport procedure and reply with DOWNLINK_NAS_TRANSPORT." - - Reference - "ETSI TS 138 413 [1], Clauses 8.2.1.2, 8.6.3.2, 9.2.1.1 and 9.2.5.3" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - NAS_PDU, //(see note) - User_Location_Information; - from the GNB entity - } - then { - the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing - AMF_UE_NGAP_ID indicating value RV_AMF_UE_NGAP_ID, - RAN_UE_NGAP_ID indicating value PX_RAN_UE_NGAP_ID, - PDU_Session_Resource_Setup_Request_List containing - PDU_SessionId, - PDU_Session_NAS_PDU, //(see note) - S_NSSAI containing - SST indicating value PX_SST;, - PDU_Session_Resource_Setup_Request_Transfer containing - UL_NGU_UP_TNL_information containing - gTP_tunnel containing - Endpoint_IP_Address, - GTP_TEID;;, - PDU_Session_Type, - QoS_Flow_Setup_Request_List containing - QoS_Flow_Identifier, - QoS_Flow_Level_QoS_Parameters;;;; - to the GNB entity - } - } - }// end TP_5GAP_PDU_01 - -} // End of Package TP_AMF_NGAP - -- GitLab From 1a15d5239f462834f7bf7b877eea1afe90e95cce Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 22 Apr 2026 17:52:10 +0200 Subject: [PATCH 098/151] enc/dec getting PDU_SESSION_REQ --- ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn index 9cbb3ae..ed6dd78 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn @@ -74,7 +74,7 @@ module NG_NAS_MsgContainers identity_Response, messageType = '01011100'B; notification_Response, messageType = '01100110'B; pdu_Session_Authentication_Complete, messageType = '11000110'B; - pdu_Session_Establishment_Request, messageType = '11000001'B; + pdu_Session_Establishment_Request, {protocolDiscriminator = '00101110'B, messageType = '11000001'B}; pdu_Session_Modification_Command_Reject, messageType = '11001101'B; pdu_Session_Modification_Complete, messageType = '11001100'B; pdu_Session_Modification_Request, messageType = '11001001'B; -- GitLab From e10c69d0084a34acf6c31efccb82d1d336f803b7 Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 22 Apr 2026 17:52:29 +0200 Subject: [PATCH 099/151] enc/dec getting PDU_SESSION_REQ --- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 0762755..6ceb125 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -280,6 +280,13 @@ module Lib_NG_NAS_Security_Functions { log("f_Check_5GAKA_NAS_UL_Message: decvalue failure"); return false; } + + } + + if(ischosen(v_message.ul_Nas_Transport)){ + v_bs:=oct2bit(v_message.ul_Nas_Transport.payload.payload); + log(v_bs); + if(decvalue(v_bs, v_message) != 0){} } log("f_Check_5GAKA_NAS_UL_Message: v_message: ", v_message); log("f_Check_5GAKA_NAS_UL_Message: p_NG_NAS_UL_Message_Type: ", p_NG_NAS_UL_Message_Type); -- GitLab From 5e8bd75600a39811ee1854b0f8deb952d796f9fe Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Wed, 22 Apr 2026 15:53:12 +0000 Subject: [PATCH 100/151] Update until TP_5GNAS_AMF_REG_REJ_01 --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 96 ++++++++++--------------- 1 file changed, 36 insertions(+), 60 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 366ebc8..da7a0f0 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -663,7 +663,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_ACC_01 - Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 when initial registration is accepted by the network." + Test objective "Verify that, after successful completion of the initial registration procedure over 3GPP access, the IUT sends a REGISTRATION_ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 value." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -685,8 +685,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format indicating value IMSI, Type_of_identity indicating value SUCI, @@ -731,7 +730,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_ACC_02 - Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message indicating SMS over NAS allowed when initial registration with SMS over NAS is requested and network allows SMS service." + Test objective "Verify that, when the UE requests SMS over NAS transport during initial registration and the IUT supports SMS over NAS in initial registration, the IUT sends a REGISTRATION_ACCEPT message with the SMS allowed bit in the 5GS registration result IE set to 'SMS over NAS allowed'." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -753,8 +752,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format indicating value IMSI, Type_of_identity indicating value SUCI, @@ -772,26 +770,11 @@ Package TP_AMF { the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 1;, //SMS over NAS allowed - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; + SMS_over_NAS_transport_allowed set to 1;;; //SMS over NAS allowed to the GNB entity } } @@ -802,7 +785,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_ACC_03 - Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message indicating SMS over NAS not allowed when initial registration with SMS over NAS is requested and network does not support SMS service." + Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message with the SMS over NAS transport allowed bit set to 'not allowed' when the UE requests SMS over NAS during initial registration and the IUT does not support SMS over NAS in initial registration." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -824,8 +807,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format indicating value IMSI, Type_of_identity indicating value SUCI, @@ -847,22 +829,7 @@ Package TP_AMF { message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 0;, //SMS over NAS not allowed - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, - T3512_value containing - Timer_value indicating value nonZeroValue;;; + SMS_over_NAS_transport_allowed set to 0;;; //SMS over NAS not allowed to the GNB entity } } @@ -872,7 +839,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_ACC_04 - Test objective "Verify that the IUT includes the allowed NSSAI in the REGISTRATION_ACCEPT message when the UE includes a requested NSSAI in the REGISTRATION_REQUEST message and the network allows one or more S-NSSAIs from the requested NSSAI." + Test objective "Verify that the IUT, during the initial registration procedure, sends a REGISTRATION_ACCEPT message including the Allowed NSSAI IE when the UE includes a Requested NSSAI IE in the REGISTRATION_REQUEST message and the IUT allows one or more S-NSSAIs from the requested NSSAI." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -890,21 +857,27 @@ Package TP_AMF { when { the IUT entity receives an INITIAL_UE_MESSAGE containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format indicating value IMSI, Type_of_identity indicating value SUCI, MCC indicating value PX_MCC, MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, + Routing_indicator indicating value PX_ROUTING_INDICATOR, Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; + MSIN indicating value PX_MSIN;, + Requested_NSSAI containing + S_NSSAI_1 containing + SST set to PX_SST_1, + SD set to PX_SD_1;, + S_NSSAI_2 containing + SST set to PX_SST_2, + SD set to PX_SD_2;;; from the GNB entity } then { @@ -934,7 +907,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_ACC_05 - Test objective "Verify that the IUT optionally includes rejected NSSAI in the REGISTRATION_ACCEPT message when the network rejects one or more S-NSSAIs from the requested NSSAI." + Test objective "Verify that, during the initial registration procedure, the IUT includes the Rejected NSSAI IE in the REGISTRATION_ACCEPT message when the UE includes a Requested NSSAI IE in the REGISTRATION_REQUEST message and the IUT rejects one or more S-NSSAIs from the requested NSSAI." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -956,8 +929,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format indicating value IMSI, Type_of_identity indicating value SUCI, @@ -966,7 +938,14 @@ Package TP_AMF { Routing_indicator indicating value PX_ROUTING_INDICATOR, Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; + MSIN indicating value PX_MSIN;, + Requested_NSSAI containing + S_NSSAI_1 containing + SST set to PX_SST_1, + SD set to PX_SD_1;, + S_NSSAI_2 containing + SST set to PX_SST_Rejected, + SD set to PX_SD_Rejected;;; from the GNB entity } then { @@ -984,7 +963,7 @@ Package TP_AMF { AMF_Pointer indicating value PX_AMF_POINTER, 5G_TMSI indicating value RV_5G_TMSI;, Rejected_NSSAI containing - Rejected_S_NSSAI_1 containing + S_NSSAI_1 containing SST set to PX_SST_Rejected, SD set to PX_SD_Rejected;;;; to the GNB entity @@ -996,7 +975,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_REJ_01 - Test objective "Verify that the IUT rejects initial registration request due to general NAS level mobility management congestion control with 5GMM cause value #22 - congestion and assign a value for back-off timer T3346." + Test objective "Verify that the IUT sends a REGISTRATION_REJECT message with 5GMM cause value #22 'congestion' and includes the T3346 value IE when the initial registration request is rejected due to general NAS level mobility management congestion control." Reference "ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9" @@ -1019,8 +998,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format indicating value IMSI, Type_of_identity indicating value SUCI, @@ -1035,8 +1013,7 @@ Package TP_AMF { then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, message_type set to REGISTRATION_REJECT, 5GMM_cause set to "Congestion (22)", T3346_value containing @@ -1070,8 +1047,7 @@ Package TP_AMF { NAS_PDU containing message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION, - FOR indicating value 1;, //Follow-on request pending + 5GS_registration_type_value set to INITIAL_REGISTRATION;, Requested_NSSAI indicating value PX_NSSAI_REVOKED;; from the GNB entity } -- GitLab From bb22cd3e5031873c80ba0d5d5ef64b9a0880425c Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 23 Apr 2026 11:59:01 +0200 Subject: [PATCH 101/151] Review Lib_NG_NAS_Security_Functions.ttcn & LibNGAP_Functions.ttcn --- captures/TC_NGAP_AMF_PDU_01.pcap | Bin 4232 -> 4068 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 13 +- titan-test-system-framework | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 11 + ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 276 +++++++++++------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 58 +++- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 24 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 106 ++++++- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 2 +- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 13 +- 10 files changed, 368 insertions(+), 137 deletions(-) diff --git a/captures/TC_NGAP_AMF_PDU_01.pcap b/captures/TC_NGAP_AMF_PDU_01.pcap index eb642ea79397e5238ba025265e2200a7f0817ebb..fc802c8f9defa2cd50aba38aab70f15ee434bfec 100644 GIT binary patch delta 2093 zcmeBBd?G(Vg8kXSmzff$StiPBn_rjWmtlYcMg|6zcUiqr42%mH807x{4?D)4z`(=6 z#=y$J(7?dJa)5z>1*BEsG|R+BUFqvmV8sj!3~USxEH4kf%)F`0!;rqbWkzHis zT|tG@2Ge+;hBGiSFxWixY2N}io$LR92K(&F$$X3&>>!=rm3b!HGV11?HUKMOU|?Wk zU{qn>YK3!#GBKPssAphcoUF(sGWiW7j{-}Jbx6V7J^yDsy_@)A zpQz~l=#vxS&>P8vH=t4WCtb|0k8`}L4@Rq$u&$eV2?1W@Jyc1 zq#XnDIoSCO3=CWhgV@<3U}p=f@Jwt}QuC{4U|%rqWEOmIVES5pfqc2#2-m>d`! zT5Lo>%0b$YeayhjU*L3!kAa!N4U{@2>#;h3Eqi4SwruhQRsl_9SAi@5DP&-r ze+p*7WCtFGHU2zEi@*tVAIeRPnOC1z2frC=P%>c zbAoR8DG0QDdSBDIq=A7kR%g5PRE{VH29SM!I(a7lX46(db|1)KkU`)~0x>v%!9Kfs zvKPCmfuWDl&rNG83ZCz~;c)TS`Uwn`4*U)?f3gdi1PB?-{K?M1zz8xoW-1Q@$b(g2 zf8fPA^_Lwy4BHqO z7`A~-pKQw^h|T?)NCuWO*k{*FF5*yP`PXyq+T9kA zC~inpZ2kZLBZHcQzFr+u-{JiGjCBl7jEvgD*2PPcT5T!#|L34msoTO)bn2kiPB{43p<` zX^SAI0S0CUR|fm+y2yx>7q(qGpOqm-z85u#& zO|)TT_{6}#@Cg+8s!ysIz=ro?^DP52!{N8HEp#Rq@u;&%71qT~p376fbgF+cKd(F+ z$gEnM$qQIyCI|3h&C@yzjPrd#J_IREs$@i@=*e?=1<}LHo54Q2Ve%nf7qH)TCbEDd zqlyvayh9GyoCnHiAWbm8gRBXi$TB&a4KYjsU1_lN*P`pgu&yN~FYzzz>3_J`h061fE6951J delta 2178 zcmaDN-=R1`g8fb1`OI01*e1$rn{VafmtlYcMg|6zYd_g0GcYb-V37O&f9;;RQy6#{ z*cezD7#bKDSPn2Suz<8KSj0B5QCE5^7g#X^0|Ofa0}EUI`ApVrj0{-}3=CP58QDc9 z-W61sX*!JuYB&QU1A|T3pUFI6)4Bftx4$I#WHKM420KWn&qX!VPcqRTF=11I9ZWNWbzwE9);!?eyZDjr85&&x*ojF zP~Eolg6kdzrvI)Ib-cRVXYT%(tjHuk*?@_2vI7%~0N90~AVTuQ?)82AcYK! z^H0GnV7P&<0Aflkc($$|LJwU}gxjza;pSfdQ0!85kJ&87A|xx$=UXw*C$y z!z2aWM^Pt1esgN$HY*@z`#%i z_D9af1z>-qVhd@Ibs*!Bth0XepnT)x7wk&%w-}l%8R{5fnHZQpe0XTa$OLw^u^kh` zHUT(V+ zC^>KxHzX>y{{R1xLCry5ua3#?irOj0ItC|3#&QPkPcwhAGchn_*irR4 zOp_1tNl*U8DS*ven~)r$Y=24c#biA$NGWlzi4~F^7J+=zH6M>}Ucd|i#ntyF*2(j^ zv_+8900T3FtNkUxmy_>tDXCq%xBC)f9fLELxP~N;Jo`(6uO_Q;E3s(2TD5Vq54RK8 zCmY&XC;w)XHrcos>>zxp_!Z1S49pAxZyuCyp8SMciDgOY|ErU^c%(!P8m2Hdcrt>M z*468*44)Vn7(Rg_U-ikxB_P8)Ut;qu12eB;=O z@?aN!z77tu$pO4rGxZh*#`(S=FM@*UE7>jE}9LWdI) z8%sg%>zaejebA);8s>SBHT622lcV`CVnf6JlHi-kv-lLihWndyg3^e|#${l`%kdcg z24*+|GlR;T2jyEQ3-CkI%WQYBA(Q?11$>d?9^@*JLL`l#g!Yz!fq@eg7z&yU{Gh6o z3sjvlgn~(s%NP1{GMF(iFqnZNX7YZ1L1|=D*%%l&7>> f_NGAP_amf_UE_ErrorIndication"); + if (PICS_OFFLINE_MODE) { + f_await_error_indication(p_cause); + } else { + f_send_error_indication(p_cause); + } + } // End of function f_NGAP_amf_UE_ErrorIndication + function f_NGAP_amf_UE_SecurityMode() runs on aMFNGAPComponent { log(">>> f_NGAP_amf_UE_SecurityMode"); if (PICS_OFFLINE_MODE) { diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 7af4cfb..fdc1dcb 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -5470,127 +5470,189 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_01 */ - function f_TC_NGAP_AMF_IMP_01() runs on aMFNGAPComponent { - // Local variables + function f_TC_NGAP_AMF_IMP_01() runs on aMFNGAPComponent { + // Local variables - // Preamble - f_NGAP_amf_init(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Preamble + f_NGAP_amf_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - // Send NGSetupRequest - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_GNB_ID - )), + // Body + // Send NGSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + ) + ) + }) + }) + }, + PX_PAGING_DRX + ))); + // Await NGSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST/*, - PX_SD*/ - ) - ) - }) - }) - }, - PX_PAGING_DRX - ))); - // Await NGSetupResponse - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGSetupResponse( - mw_aMFName(PX_AMF_NAME), - { - *, - mw_servedGUAMIItem( - mw_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) - )), - * - } - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + } + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_NGAP_amf_UE_Authentication_Failure(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_NGAP_amf_UE_ErrorIndication(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_AMF_IMP_01 + } // End of function f_TC_NGAP_AMF_IMP_01 /** * @desc Testcase function for TC_NGAP_AMF_IMF_01_02 */ - function f_TC_NGAP_AMF_IMP_01_02() runs on aMFNGAPComponent { - // Local variables + function f_TC_NGAP_AMF_IMP_01_02() runs on aMFNGAPComponent { + // Local variables - // Preamble - f_NGAP_amf_init(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Preamble + f_NGAP_amf_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - // Send NGSetupRequest - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_GNB_ID - )), + // Body + // Send NGSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD + )) + }) + }) + }, + PX_PAGING_DRX + ))); + // Await NGSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - PX_SD - )) - }) - }) - }, - PX_PAGING_DRX - ))); - // Await NGSetupResponse - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGSetupResponse( - mw_aMFName(PX_AMF_NAME), - { - *, - mw_servedGUAMIItem( - mw_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) - )), - * - } - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + } + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_NGAP_amf_UE_Authentication_Failure(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_NGAP_amf_UE_Authentication_Failure(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_01_02 + + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_01_03 + */ + function f_TC_NGAP_AMF_IMP_01_03() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Body + // Send NGSetupRequest + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD + )) + }) + }) + }, + PX_PAGING_DRX + ))); + // Await NGSetupResponse + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGSetupResponse( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + } + ))); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_NGAP_amf_UE_Authentication_Failure(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_AMF_IMP_01_02 + } // End of function f_TC_NGAP_AMF_IMP_01_03 /** * @desc Testcase function for TC_NGAP_AMF_IMP_02 diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 52256bb..17a5748 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -2975,7 +2975,7 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message that contains mandatory IEs and answers with NG SETUP RESPONSE to acknowledge the setup." - */ + */ testcase TC_NGAP_AMF_IMP_01() runs on aMFNGAPComponent system TestAdapter { // Local variables @@ -3000,9 +3000,63 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_AMF_IMP_01 + /** + * @desc "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing the PLMN identity, TAC, supported slice IEs and Extended RAN Node Name, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." + */ + testcase TC_NGAP_AMF_IMP_01_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_01_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_01_02 + + /** + * @desc "# Verify that the AMF with IAB support successfully processes an NG_SETUP_REQUEST message containing the PLMN identity, TAC and supported slice IEs, and responds with an NG_SETUP_RESPONSE message containing IAB Supported IE to acknowledge the setup." + */ + testcase TC_NGAP_AMF_IMP_01_03() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_01_03()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_01_03 + /** * @desc "Verify that the AMF node successfully decline a NG RESET REQEST message and answers with NG SETUP FAILURE when the AMF is not able to handle the request." - */ + */ testcase TC_NGAP_AMF_IMP_02() runs on aMFNGAPComponent system TestAdapter { // Local variables diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 72b86a9..76b53fe 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -6954,12 +6954,20 @@ module LibNGAP_Templates { /** * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.6.13 ERROR INDICATION */ - template (value) InitiatingMessage m_n2_ErrorIndication := { + template (value) InitiatingMessage m_n2_ErrorIndication( + in template (value) Cause p_cause + ) := { procedureCode := id_ErrorIndication, criticality := ignore, value_ := { ErrorIndication := { - protocolIEs := { } + protocolIEs := { + { + id := id_Cause, + criticality := ignore, + value_ := { Cause := p_cause } + } + } } } } // End of template m_n2_ErrorIndication @@ -7004,12 +7012,20 @@ module LibNGAP_Templates { /** * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.6.13 ERROR INDICATION */ - template (present) InitiatingMessage mw_n2_ErrorIndication := { + template (present) InitiatingMessage mw_n2_ErrorIndication( + template (present) Cause p_cause := ? + ) := { procedureCode := id_ErrorIndication, criticality := ignore, value_ := { ErrorIndication := { - protocolIEs := { } + protocolIEs := { + { + id := id_Cause, + criticality := ignore, + value_ := { Cause := p_cause } + } + } } } } // End of template mw_n2_ErrorIndication diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index d23869b..94fe4c9 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -449,6 +449,10 @@ module LibNGAP_Functions { // TODO Send request for AUTHENTICATION_REQUEST // TODO Await response for AUTHENTICATION_RESPONSE + + + setverdict(fail); + } /** @@ -748,6 +752,9 @@ module LibNGAP_Functions { vc_AMF_UE_ID, vc_RAN_UE_ID ))); + + setverdict(pass); + log("<<< f_await_initial_context_setup_request_await_initial_context_setup_resonse"); } @@ -813,7 +820,10 @@ module LibNGAP_Functions { vc_AMF_UE_ID, vc_RAN_UE_ID ))); - } + + setverdict(pass); + + } /** * @desc Function to send NAS InitialContextSetupRequest message and await for InitialContextSetupResonse message @@ -979,13 +989,29 @@ module LibNGAP_Functions { log(">>> f_await_registration_complete"); // Await request for UERadiCapability - OPTIONAL? - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UERadioCapabilityInfoIndication( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - ? - ))); + // TODO FSCOM: Move it into a function + alt { + [] N2_gNBaMF_P.check( // Check if received message is UERadioCapabilityInfoIndication, if yes consume it and continue to wait for REGISTRATION_COMPLETE + receive( + mw_ngap_initMsg( + mw_n2_UERadioCapabilityInfoIndication( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + ? + )))) { + f_recv_NGAP_PDU( // Consume the message + mw_ngap_initMsg( + mw_n2_UERadioCapabilityInfoIndication( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + ? + ))); + } + [] N2_gNBaMF_P.check(receive(NGAP_PDU: ?)) { + // continue + } + } + // Await request for REGISTRATION_COMPLETE f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -1006,6 +1032,8 @@ module LibNGAP_Functions { log("*** " & __SCOPE__ & ": PASS: Expected NG_REGISTRATION_COMPLETE"); setverdict(pass); } + + log("<<< f_await_registration_complete"); } function f_send_pdu_session_establishment_request() runs on NGNASComponent { @@ -1081,6 +1109,8 @@ module LibNGAP_Functions { ))))); setverdict(pass); + + log("<<< f_send_pdu_session_establishment_request"); } function f_await_pdu_session_establishment_request() runs on NGNASComponent { @@ -1090,8 +1120,8 @@ module LibNGAP_Functions { f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_UplinkNASTransport( - vc_AMF_UE_ID, - vc_RAN_UE_ID + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU); if (f_Check_5GAKA_NAS_UL_Message( @@ -1914,6 +1944,62 @@ module LibNGAP_Functions { } + function f_await_error_indication( + in template (value) Cause p_cause := m_cause_misc(unknown_PLMN_or_SNPN) + ) runs on NGNASComponent { + log(">>> f_await_error_indication"); + + // Await ErrorIndication + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_ErrorIndication( + p_cause + ))); + } + + function f_await_error_indication_ids( + in template (value) Cause p_cause := m_cause_misc(unknown_PLMN_or_SNPN) + ) runs on NGNASComponent { + log(">>> f_await_error_indication_ids"); + + // Await ErrorIndication + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_ErrorIndication_ids( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + p_cause + ))); + } + + function f_send_error_indication( + in template (value) Cause p_cause := m_cause_misc(unknown_PLMN_or_SNPN) + ) runs on NGNASComponent { + log(">>> f_send_error_indication"); + + // Await ErrorIndication + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_ErrorIndication( + p_cause + ))); + } + + function f_send_error_indication_ids( + in template (value) Cause p_cause := m_cause_misc(unknown_PLMN_or_SNPN) + ) runs on NGNASComponent { + log(">>> f_send_error_indication_ids"); + + // Await ErrorIndication + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_ErrorIndication_ids( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + p_cause + ))); + } + function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGNASComponent { vc_recvNGAP_PDU := p_PDU; diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index 26198cf..83f47fd 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -71,7 +71,7 @@ module LibNGAP_Steps { ) runs on NGNASComponent { var NGAP_PDU v_PDU; - log(">>> f_recv_NGAP_PDU", p_PDU); + log(">>> f_recv_NGAP_PDU: Awaiting message: ", p_PDU); tc_wait.start; alt { [] N2_gNBaMF_P.receive(p_PDU) -> value v_PDU { diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 6ceb125..2f385bc 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -756,11 +756,11 @@ module Lib_NG_NAS_Security_Functions { log(">>> fl_NasNN_MCC2PlmnId: p_nas_mcc=", p_nas_mcc); log(">>> fl_NasNN_MCC2PlmnId: p_nas_mnc=", p_nas_mnc); - log("fl_NasNN_MCC2PlmnId: p_nas_mcc[0]=", p_nas_mcc[0]); - log("fl_NasNN_MCC2PlmnId: p_nas_mcc[1]=", p_nas_mcc[1]); - log("fl_NasNN_MCC2PlmnId: p_nas_mcc[2]=", p_nas_mcc[2]); - log("fl_NasNN_MCC2PlmnId: p_nas_mnc[0]=", p_nas_mnc[0]); - log("fl_NasNN_MCC2PlmnId: p_nas_mnc[1]=", p_nas_mnc[1]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[0]=", p_nas_mcc[0]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[1]=", p_nas_mcc[1]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[2]=", p_nas_mcc[2]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mnc[0]=", p_nas_mnc[0]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mnc[1]=", p_nas_mnc[1]); var hexstring v_plmn_hexstring; if (lengthof(p_nas_mnc) == 2) { @@ -768,9 +768,8 @@ module Lib_NG_NAS_Security_Functions { } else { v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & p_nas_mnc[2] & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; } - log("fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", v_plmn_hexstring); - log("fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", hex2oct(v_plmn_hexstring)); + log("<<< fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", hex2oct(v_plmn_hexstring)); return hex2oct(v_plmn_hexstring); } -- GitLab From 1441327d8eae411f5822d398054c60a1a8a7d937 Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 23 Apr 2026 15:33:11 +0200 Subject: [PATCH 102/151] enc/dec change nasSecurityProtectedNAS message variant oe OTHERWISE --- ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn index ed6dd78..377eff0 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn @@ -58,10 +58,6 @@ module NG_NAS_MsgContainers UE_TEST_LOOP_NR_SIDELINK_COUNTER_RESPONSE test_Loop_Sidelink_Counter_Response // @sic R5-225291 sic@ } with { // FIXME FSCOM Check messageType for deregistration_RequestMO variant "TAG( - security_Protected_Nas_Message, securityHeaderType = '0001'B; - security_Protected_Nas_Message, securityHeaderType = '0010'B; - security_Protected_Nas_Message, securityHeaderType = '0011'B; - security_Protected_Nas_Message, securityHeaderType = '0100'B; authentication_Failure, messageType = '01011001'B; authentication_Response, messageType = '01010111'B; configuration_Update_Complete, messageType = '01010101'B; @@ -74,7 +70,7 @@ module NG_NAS_MsgContainers identity_Response, messageType = '01011100'B; notification_Response, messageType = '01100110'B; pdu_Session_Authentication_Complete, messageType = '11000110'B; - pdu_Session_Establishment_Request, {protocolDiscriminator = '00101110'B, messageType = '11000001'B}; + pdu_Session_Establishment_Request, messageType = '11000001'B; pdu_Session_Modification_Command_Reject, messageType = '11001101'B; pdu_Session_Modification_Complete, messageType = '11001100'B; pdu_Session_Modification_Request, messageType = '11001001'B; @@ -86,9 +82,39 @@ module NG_NAS_MsgContainers security_Mode_Reject, messageType = '01011111'B; service_Request, messageType = '01001100'B; ul_Nas_Transport, messageType = '01100111'B; + security_Protected_Nas_Message, OTHERWISE )" } + //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0001'B}; + //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0010'B}; + //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0011'B}; + //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0100'B}; +// authentication_Failure, messageType = '01011001'B; + // authentication_Response, messageType = '01010111'B; + // configuration_Update_Complete, messageType = '01010101'B; + // cp_Service_Request, messageType = '01001111'B; + // deregistration_Accept, messageType = '01000110'B; + // deregistration_RequestMO, messageType = '01000101'B; + // gmm_Status, messageType = '01100100'B; + // gsm_Status, messageType = '11010110'B; + // network_Slice_Specific_Authentication_Complete, messageType = '01010001'B; + // identity_Response, messageType = '01011100'B; + // notification_Response, messageType = '01100110'B; + // pdu_Session_Authentication_Complete, messageType = '11000110'B; + // pdu_Session_Establishment_Request, {protocolDiscriminator = '00101110'B, messageType = '11000001'B}; + // pdu_Session_Modification_Command_Reject, messageType = '11001101'B; + // pdu_Session_Modification_Complete, messageType = '11001100'B; + // pdu_Session_Modification_Request, messageType = '11001001'B; + // pdu_Session_Release_Complete, messageType = '11010100'B; + // pdu_Session_Release_Request, messageType = '11010001'B; + // registration_Request, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01000001'B}; + // registration_Complete, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01000011'B}; + // security_Mode_Complete, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01011110'B}; + // security_Mode_Reject, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01011111'B}; + // service_Request, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01001100'B}; + // ul_Nas_Transport, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01100111'B}; + // security_Protected_Nas_Message, OTHERWISE type union NG_NAS_DL_Message_Type { /* NAS message with direction 'network to UE' or 'both' */ NG_SECURITY_PROTECTED_NAS_MESSAGE security_Protected_Nas_Message, @@ -136,10 +162,6 @@ module NG_NAS_MsgContainers } with { // FIXME FSCOM Check messageType for deregistration_RequestMT variant "TAG( - security_Protected_Nas_Message, securityHeaderType = '0001'B; - security_Protected_Nas_Message, securityHeaderType = '0010'B; - security_Protected_Nas_Message, securityHeaderType = '0011'B; - security_Protected_Nas_Message, securityHeaderType = '0100'B; authentication_Reject, messageType = '01011000'B; authentication_Request, messageType = '01010110'B; authentication_Result, messageType = '01011010'B; @@ -166,9 +188,14 @@ module NG_NAS_MsgContainers security_Mode_Command, messageType = '01011101'B; service_Accept, messageType = '01001110'B; service_Reject, messageType = '01001101'B; + security_Protected_Nas_Message, OTHERWISE )" } - + //security_Protected_Nas_Message, securityHeaderType = '0001'B; + //security_Protected_Nas_Message, securityHeaderType = '0010'B; + //security_Protected_Nas_Message, securityHeaderType = '0011'B; + //security_Protected_Nas_Message, securityHeaderType = '0100'B; + //**************************************************************************** // NAS SECURITY PROTECTION //**************************************************************************** -- GitLab From d8a50e1593b7e915cccfd3d6fc91ba385f4adced Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Thu, 23 Apr 2026 15:11:43 +0000 Subject: [PATCH 103/151] Update TPs until TP_5GNAS_AMF_DRG_REQ_03 --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 148 ++++++++++++++---------- 1 file changed, 84 insertions(+), 64 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index da7a0f0..3cb7343 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -598,7 +598,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DLN_ACC_01 - Test objective "Verify that the IUT correctly handles a UL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_REQUEST from the UE and responds with a DL NAS transport message containing a PDU_SESSION_ESTABLISHMENT_ACCEPT." + Test objective "Verify that the IUT, upon receipt of a UL NAS TRANSPORT message containing a PDU SESSION ESTABLISHMENT REQUEST, sends a PDU_SESSION_RESOURCE_SETUP_REQUEST carrying a DL NAS TRANSPORT message with a PDU SESSION ESTABLISHMENT ACCEPT." Reference "ETSI TS 124 501 [1], Clauses 5.4.5, 6.4.1, 8.2.10 and 8.2.11" @@ -616,35 +616,36 @@ Package TP_AMF { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to UL_NAS_TRANSPORT, - payload_container_type set to "N1 SM information", - payload_container containing - 5GSM_PDU containing - extended_protocol_discriminator set to 5GS_SESION_MANAGEMENT_MESSAGES, - message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, - PDU_session_type set to "IPv4", - SSC_mode set to "SSC mode 1";;, - pDU_session_identity set to PX_PDU_session_identity, - request_type set to "Initial request", - s_NSSAI containing - sst set to PX_SST, - sd set to PX_SD;, - dNN set to PX_DNN;; + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to UL_NAS_TRANSPORT, + payload_container_type set to "N1 SM information", + payload_container containing + 5GSM_PDU containing + extended_protocol_discriminator set to 5GS_SESSION_MANAGEMENT_MESSAGES, + message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, + PDU_session_type set to "IPv4", + SSC_mode set to "SSC mode 1";;, + pDU_session_identity set to PX_PDU_session_identity, + request_type set to "Initial request", + s_NSSAI containing + sst set to PX_SST, + sd set to PX_SD;, + dNN set to PX_DNN;; from the GNB entity } then { the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DL_NAS_TRANSPORT, - payload_container containing - payload_container_type set to "N1 SM information", - number_of_optional_IEs set to 1, - optional_IE_1 set to PDU_SESSION_ESTABLISHMENT_ACCEPT;, - pDU_session_ID RV_PDU_SESSION_ID;; + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DL_NAS_TRANSPORT, + payload_container_type set to "N1 SM information", + payload_container containing + 5GSM_PDU containing + extended_protocol_discriminator set to 5GS_SESSION_MANAGEMENT_MESSAGES, + message_type set to PDU_SESSION_ESTABLISHMENT_ACCEPT;;, + pDU_session_identity set to PX_PDU_session_identity;; to the GNB entity } @@ -1027,36 +1028,44 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_REG_REJ_02 - Test objective "Verify that the IUT rejects initial registration request because all the S-NSSAI(s) included in the requested NSSAI are either rejected for current PLMN, rejected for the current registration area or rejected due to failed or revoked NSSAIs." + Test objective "Verify that, during the initial registration procedure, the IUT sends a REGISTRATION_REJECT message with 5GMM cause value #9 'UE identity cannot be derived by the network' when the UE responds to an IDENTITY_REQUEST for SUCI with an IDENTITY_RESPONSE indicating that no identity is available." Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9" + "ETSI TS 123 502 [2], Clause 4.2.2.2.2 + ETSI TS 124 501 [1], Clauses 5.4.3.2, 5.4.3.3, 5.5.1.2.5 and 8.2.9" Config Id CF_AMF_N2N1 - PICS Selection NONE + PICS Selection PICS_A4/3 Initial conditions with { - the UE entity isNotRegisteredToAMF + the UE entity isNotRegisteredToAMF and + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to IDENTITY_REQUEST, + identity_type set to SUCI;; + to the GNB entity } Expected behaviour ensure that { when { - the IUT entity receives an INITIAL_UE_MESSAGE containing + the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - Requested_NSSAI indicating value PX_NSSAI_REVOKED;; + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to IDENTITY_RESPONSE, + 5GS_mobile_identity containing + Type_of_identity set to NO_IDENTITY;;; from the GNB entity } then { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, message_type set to REGISTRATION_REJECT, - 5GMM_cause set to "No network slice available (62)";; - to the GNB entity + 5GMM_cause set to "UE identity cannot be derived by the network (9)";; + to the GNB entity } } }// end TP_5GNAS_AMF_REG_REJ_02 @@ -1072,7 +1081,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DRG_ACC_01 - Test objective "Verify that the IUT, upon receiving a DEREGISTRATION_REQUEST message containing the De-registration type IE with Normal de-registration from the UE, sends a DEREGISTRATION_ACCEPT message." + Test objective "Verify that the IUT sends a DEREGISTRATION_ACCEPT message upon receipt of a UE-originated DEREGISTRATION_REQUEST message indicating normal de-registration." Reference "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" @@ -1122,7 +1131,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DRG_ACC_02 - Test objective "Verify that the IUT, upon receiving a DEREGISTRATION_REQUEST message containing the De-registration type IE with Switch-off from the UE, does not send a DEREGISTRATION_ACCEPT message and IUT completes de-registration procedure." + Test objective "Verify that the IUT does not send a DEREGISTRATION_ACCEPT message upon receipt of a UE-originated DEREGISTRATION_REQUEST message indicating switch off." Reference "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" @@ -1138,9 +1147,9 @@ Package TP_AMF { Expected behaviour ensure that { when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing + (.) at time point start_DRG_event : the IUT entity receives an UPLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, message_type set to DEREGISTRATION_REQUEST, Deregistration_type containing @@ -1158,11 +1167,12 @@ Package TP_AMF { from the GNB entity } then { - the IUT entity not send a DOWNLINK_NAS_TRANSPORT containing + // PX_DRG_TWAIT: Test system observation timer used to verify that no DEREGISTRATION_ACCEPT message is sent after receipt of a switch-off DEREGISTRATION_REQUEST (no corresponding NAS timer defined in the specification) + (!) PX_DRG_TWAIT after start_DRG_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_ACCEPT;; + message_type set to DEREGISTRATION_ACCEPT;; to the GNB entity } } @@ -1179,7 +1189,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DRG_REQ_01 - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing De-registration type IE with re-registration not required and the access type based on the UE’s registration status (3GPP access only). **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" + Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration not required for 3GPP access. **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" Reference "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" @@ -1206,7 +1216,15 @@ Package TP_AMF { Deregistration_type containing Switch_off set to NORMAL_DEREGISTRATION, Reregistration_required set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;;; + Access_type set to 3GPP_ACCESS;, + 5GS_mobile_identity containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;;; to the GNB entity } } @@ -1216,7 +1234,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DRG_REQ_02 - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message and if UE does not send DEREGISTRATION_ACCEPT then IUT retransmits DEREGISTRATION_REQUEST message after timer T3522 expiration. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." + Test objective "Verify that the IUT retransmits the DEREGISTRATION_REQUEST message if no DEREGISTRATION_ACCEPT is received from the UE. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." Reference "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" @@ -1232,27 +1250,21 @@ Package TP_AMF { Expected behaviour ensure that { when { - the IUT entity indicateUEderegistration and - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + the IUT entity indicateUEdeactivation and + (.) at time point start_DRG_event : the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - message_type set to DEREGISTRATION_REQUEST;; - to the GNB entity and - the IUT entity does not receive an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - message_type set to DEREGISTRATION_ACCEPT;; - from the GNB entity + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST;; + to the GNB entity } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing + (!) PX_T3522 after start_DRG_event : the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off set to NORMAL_DEREGISTRATION, - Reregistration_required set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity + message_type set to DEREGISTRATION_REQUEST;; + to the GNB entity } } }// end TP_5GNAS_AMF_DRG_REQ_02 @@ -1261,7 +1273,9 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DRG_REQ_03 - Test objective "Verify that the IUT initiates network de-registration by sending DEREGISTRATION_REQUEST message containing De-registration type IE with re-registration required and the access type based on the UE’s registration status (3GPP access only). **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" + Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration required for 3GPP access. + // NOTE: After receipt of this message, the UE is expected to respond with DEREGISTRATION_ACCEPT and to initiate a new registration procedure. These subsequent steps are not part of the verification objective of this TP, but need to be handled by the TTCN-3 test implementation and postamble. + // **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" Reference "ETSI TS 124 501 [1], Clauses 5.5.2.3.1, 5.5.2.3.2 and 8.2.14" @@ -1280,7 +1294,6 @@ Package TP_AMF { the IUT entity indicateUEderegistration } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, @@ -1288,8 +1301,15 @@ Package TP_AMF { Deregistration_type containing Switch_off set to NORMAL_DEREGISTRATION, Reregistration_required set to REREGISTRATION_REQUIRED, - Access_type set to 3GPP_ACCESS;;; - to the GNB entity + Access_type set to 3GPP_ACCESS;, + 5GS_mobile_identity containing + Type_of_identity set to 5G_GUTI, + MCC indicating value PX_MCC, + MNC indicating value PX_MNC, + AMF_Region_ID indicating value PX_AMF_REGION_ID, + AMF_Set_ID indicating value PX_AMF_SET_ID, + AMF_Pointer indicating value PX_AMF_POINTER, + 5G_TMSI indicating value RV_5G_TMSI;;; } } }// end TP_5GNAS_AMF_DRG_REQ_03 -- GitLab From 0568e670bc8cd45729f8ef21a33f4905b94e3fd0 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Thu, 23 Apr 2026 15:17:20 +0000 Subject: [PATCH 104/151] Errors resolved --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 3cb7343..fb9b340 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -878,7 +878,7 @@ Package TP_AMF { SD set to PX_SD_1;, S_NSSAI_2 containing SST set to PX_SST_2, - SD set to PX_SD_2;;; + SD set to PX_SD_2;;;; from the GNB entity } then { @@ -946,7 +946,7 @@ Package TP_AMF { SD set to PX_SD_1;, S_NSSAI_2 containing SST set to PX_SST_Rejected, - SD set to PX_SD_Rejected;;; + SD set to PX_SD_Rejected;;;; from the GNB entity } then { @@ -1294,6 +1294,7 @@ Package TP_AMF { the IUT entity indicateUEderegistration } then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containingTP_5GNAS_AMF_DRG_REQ_03 NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, @@ -1309,7 +1310,8 @@ Package TP_AMF { AMF_Region_ID indicating value PX_AMF_REGION_ID, AMF_Set_ID indicating value PX_AMF_SET_ID, AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; + 5G_TMSI indicating value RV_5G_TMSI;;; + to the GNB entity } } }// end TP_5GNAS_AMF_DRG_REQ_03 -- GitLab From e11d10d1a36c5cdc7c67eb7b5bf4f6f317d5c572 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Thu, 23 Apr 2026 15:21:25 +0000 Subject: [PATCH 105/151] indicating value changed to set to --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 266 ++++++++++++------------ 1 file changed, 133 insertions(+), 133 deletions(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index fb9b340..9e08276 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -51,14 +51,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;;; } then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing @@ -70,8 +70,8 @@ Package TP_AMF { nas_key_set_identifier set to "111";, ABBA containing ABBA_contents set to '0000'H;, - Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN indicating value RV_Authentication_parameter_AUTN;; + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; to the GNB entity } } @@ -113,7 +113,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_RESPONSE, authentication_response_parameter containing - RES indicating value PX_INVALID_RES_VALUE;;; + RES set to PX_INVALID_RES_VALUE;;; from the GNB entity } then { @@ -179,7 +179,7 @@ Package TP_AMF { security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_REQUEST, authentication_parameter_AUTN containing - AUTN indicating value PX_WRONG_MAC_CODE;;; + AUTN set to PX_WRONG_MAC_CODE;;; to the GNB entity } @@ -230,8 +230,8 @@ Package TP_AMF { nas_key_set_identifier set to "111";, //value for nas_key_set_identifier was already used before ABBA containing ABBA_contents set to '0000'H;, - Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN indicating value RV_Authentication_parameter_AUTN;; + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; to the GNB entity } @@ -253,11 +253,11 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_REQUEST, ngKSI containing - nas_key_set_identifier indicating value PX_NON_DEFAULT_NGKSI;, + nas_key_set_identifier set to PX_NON_DEFAULT_NGKSI;, ABBA containing ABBA_contents set to '0000'H;, - Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN indicating value RV_Authentication_parameter_AUTN;; + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; to the GNB entity } } @@ -289,7 +289,7 @@ Package TP_AMF { nas_key_set_identifier set to "111";, ABBA containing ABBA_contents set to '0000'H;, - Authentication_parameter_RAND indicating value RV_Authentication_parameter_RAND, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, Authentication_parameter_AUTN set to PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE;; //the "separation bit" in the AMF field of AUTN is set to 0 to the GNB entity } @@ -363,11 +363,11 @@ Package TP_AMF { security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_COMMAND, selected_NAS_security_algorithms containing - type_of_ciphering_algorithm indicating value PX_SELECTED_NAS_CIPHERING_ALGORITHM, - type_of_integrity_algorithm indicating value PX_SELECTED_NAS_INTEGRITY_ALGORITHM;, + type_of_ciphering_algorithm set to PX_SELECTED_NAS_CIPHERING_ALGORITHM, + type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM;, ngKSI containing nas_key_set_identifier set to "111";, - replayed_UE_security_capabilities indicating value PX_UE_SECURITY_CAPABILITIES;; // UE security capability 9.11.3.54 + replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES;; // UE security capability 9.11.3.54 to the GNB entity } } @@ -411,19 +411,19 @@ Package TP_AMF { 5GS_registration_result_value set to 3GPP_ACCESS;, 5G_GUTI containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;, TAI_list containing Partial_tracking_area_list_1 containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, + MCC set to PX_MCC, + MNC set to PX_MNC, + TAC set to PX_TAC;;, T3512_value containing - Timer_value indicating value nonZeroValue;;; + Timer_value set to nonZeroValue;;; to the GNB entity } @@ -467,7 +467,7 @@ Package TP_AMF { message_type set to REGISTRATION_REJECT, 5GMM_cause set to "UE security capabilities mismatch (23)", T3346_value containing - Timer_value indicating value nonZeroValue;;; + Timer_value set to nonZeroValue;;; to the GNB entity } @@ -511,12 +511,12 @@ Package TP_AMF { message_type set to REGISTRATION_REQUEST, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value PX_UNASSIGNED_5G_TMSI;;; + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to PX_UNASSIGNED_5G_TMSI;;; from the GNB entity } then { @@ -688,14 +688,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;;; from the GNB entity } then { @@ -708,19 +708,19 @@ Package TP_AMF { 5GS_registration_result_value set to 3GPP_ACCESS;, 5G_GUTI containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;, TAI_list containing Partial_tracking_area_list_1 containing - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - TAC indicating value PX_TAC;;, + MCC set to PX_MCC, + MNC set to PX_MNC, + TAC set to PX_TAC;;, T3512_value containing - Timer_value indicating value nonZeroValue;;; + Timer_value set to nonZeroValue;;; to the GNB entity } } @@ -755,14 +755,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;, 5GS_update_type containing SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported from the GNB entity @@ -810,14 +810,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;, 5GS_update_type containing SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported from the GNB entity @@ -864,14 +864,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;, Requested_NSSAI containing S_NSSAI_1 containing SST set to PX_SST_1, @@ -889,12 +889,12 @@ Package TP_AMF { message_type set to REGISTRATION_ACCEPT, 5G_GUTI containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;, Allowed_NSSAI containing S_NSSAI_1 containing SST set to PX_SST_1, @@ -932,14 +932,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;, + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;, Requested_NSSAI containing S_NSSAI_1 containing SST set to PX_SST_1, @@ -957,12 +957,12 @@ Package TP_AMF { message_type set to REGISTRATION_ACCEPT, 5G_GUTI containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;, Rejected_NSSAI containing S_NSSAI_1 containing SST set to PX_SST_Rejected, @@ -1001,14 +1001,14 @@ Package TP_AMF { 5GS_registration_type containing 5GS_registration_type set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing - SUPI_format indicating value IMSI, - Type_of_identity indicating value SUCI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - Routing_indicator indicating value PX_ROUTING_INDICATOR, - Protection_scheme_id indicating value PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier indicating value PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN indicating value PX_MSIN;;; + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN;;; from the GNB entity } then { @@ -1018,7 +1018,7 @@ Package TP_AMF { message_type set to REGISTRATION_REJECT, 5GMM_cause set to "Congestion (22)", T3346_value containing - Timer_value indicating value nonZeroValue;;; + Timer_value set to nonZeroValue;;; to the GNB entity } } @@ -1108,12 +1108,12 @@ Package TP_AMF { Access_type set to 3GPP_ACCESS;, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;;; from the GNB entity } then { @@ -1158,12 +1158,12 @@ Package TP_AMF { Access_type set to 3GPP_ACCESS;, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;;; from the GNB entity } then { @@ -1219,12 +1219,12 @@ Package TP_AMF { Access_type set to 3GPP_ACCESS;, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;;; to the GNB entity } } @@ -1305,12 +1305,12 @@ Package TP_AMF { Access_type set to 3GPP_ACCESS;, 5GS_mobile_identity containing Type_of_identity set to 5G_GUTI, - MCC indicating value PX_MCC, - MNC indicating value PX_MNC, - AMF_Region_ID indicating value PX_AMF_REGION_ID, - AMF_Set_ID indicating value PX_AMF_SET_ID, - AMF_Pointer indicating value PX_AMF_POINTER, - 5G_TMSI indicating value RV_5G_TMSI;;; + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI;; to the GNB entity } } -- GitLab From bb3f1152289710e1fee6d8c304dc172f863fe6db Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Thu, 23 Apr 2026 21:34:04 +0000 Subject: [PATCH 106/151] Another round of revision --- test_purposes/Ngnas_Common.tplan2 | 16 +----------- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 34 ++++++++++++------------- 2 files changed, 17 insertions(+), 33 deletions(-) diff --git a/test_purposes/Ngnas_Common.tplan2 b/test_purposes/Ngnas_Common.tplan2 index 2fb149e..f4bfc4b 100644 --- a/test_purposes/Ngnas_Common.tplan2 +++ b/test_purposes/Ngnas_Common.tplan2 @@ -148,7 +148,7 @@ Package Ngnas_Common { - AUTHENTICATION_REQUEST { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGE, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, spare_half_octet, authentication_request_message_identity set to AUTHENTICATION_REQUEST, @@ -327,20 +327,6 @@ Package Ngnas_Common { SUT component IUT of type NgapComponent connection between GNB.g and IUT.g; - - Test Configuration CF_GNB_N2N1 - containing - Tester component AMF of type NgapComponent - SUT component IUT of type NgapComponent - connection between AMF.g and IUT.g; - - Test Configuration CF_AMF_N2N1 - containing - Tester component GNB of type NgapComponent - SUT component IUT of type NgapComponent - connection between GNB.g and IUT.g; - - Test Configuration CF_GNB_2N2N1 containing Tester component AMF of type NgapComponent diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 9e08276..5d02732 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -380,7 +380,7 @@ Package TP_AMF { Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." Reference - "ETSI TS 124 501 [1], Clause 5.4.2.4, 5.5.1.2.4, 8.2.7 and 8.2.26" + "ETSI TS 124 501 [1], Clauses 5.4.2.4, 5.5.1.2.4, 8.2.7 and 8.2.26" Config Id CF_AMF_N2N1 @@ -435,17 +435,18 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_SEC_REJ_01 - Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_REJECT message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration." + Test objective "Verify that the IUT aborts the ongoing procedure that triggered the NAS security mode control procedure upon receipt of a SECURITY_MODE_REJECT message containing 5GMM cause #23 'UE security capabilities mismatch'." Reference - "ETSI TS 124 501 [1], Clause 5.4.2 and 8.2.27" + "ETSI TS 124 501 [1], Clauses 5.4.2.5 and 8.2.27" Config Id CF_AMF_N2N1 PICS Selection PICS_A4/2 Initial conditions with { - the UE entity isNotRegisteredToAMF + the UE entity isNotRegisteredToAMF and + (.) at time point start_SMC_event : event SECURITY_MODE_COMMAND occurs } Expected behaviour @@ -457,18 +458,16 @@ Package TP_AMF { security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_REJECT, 5GMM_cause set to "UE security capabilities mismatch (23)";; - from the GNB entity + from the GNB entity } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_REJECT, - 5GMM_cause set to "UE security capabilities mismatch (23)", - T3346_value containing - Timer_value set to nonZeroValue;;; - to the GNB entity + // PX_SEC_ABORT_TWAIT: observation timer to verify that no further registration progression occurs + (!) PX_SEC_ABORT_TWAIT after start_SMC_event : the IUT entity does not send a INITIAL_CONTEXT_SETUP_REQUEST containing + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to REGISTRATION_ACCEPT;; + to the GNB entity + (Note 1: "The IUT is expected to abort the ongoing procedure and shall not proceed with registration completion.") } } @@ -523,7 +522,6 @@ Package TP_AMF { the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED, message_type set to IDENTITY_REQUEST, identity_type set to SUCI;; to the GNB entity @@ -999,7 +997,7 @@ Package TP_AMF { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing - 5GS_registration_type set to INITIAL_REGISTRATION;, + 5GS_registration_type_value set to INITIAL_REGISTRATION;, 5GS_mobile_identity containing SUPI_format set to IMSI, Type_of_identity set to SUCI, @@ -1273,7 +1271,7 @@ Package TP_AMF { TP Id TP_5GNAS_AMF_DRG_REQ_03 - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration required for 3GPP access. + Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration required for 3GPP access." // NOTE: After receipt of this message, the UE is expected to respond with DEREGISTRATION_ACCEPT and to initiate a new registration procedure. These subsequent steps are not part of the verification objective of this TP, but need to be handled by the TTCN-3 test implementation and postamble. // **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" @@ -1294,7 +1292,7 @@ Package TP_AMF { the IUT entity indicateUEderegistration } then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containingTP_5GNAS_AMF_DRG_REQ_03 + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, -- GitLab From aabc09f5f08f46c42ded8928573969629b7056ce Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 24 Apr 2026 11:30:32 +0200 Subject: [PATCH 107/151] Validate TC_NGAP_GNB_IMP_01 --- Makefile | 10 +- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 13 +- etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ | 192 ++++++++++ ttcn/AtsNGAP/NGAP_Steps.ttcn | 14 + ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 337 +++--------------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 131 +------ ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 2 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 77 +++- 8 files changed, 356 insertions(+), 420 deletions(-) create mode 100644 etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ diff --git a/Makefile b/Makefile index 1a04595..ad634f1 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,10 @@ ifeq (,$(ATS)) $(error ATS shall be defined) +else + y := $(subst ., ,$(ATS)) + override ATS := $(word 1, $(y)) + override SUB_ATS := $(word 2, $(y)) endif ifeq (,$(TOPDIR)) @@ -25,7 +29,7 @@ $$(foreach M, $$(modules), $$(eval $$(call IncludeModule, $$(if $$(filter /%, $ endef all_includes := $(TTCN3_DIR)/include $(TTCN3_DIR)/src /usr/include/jsoncpp /usr/include/libxml2 -defines += TITAN_RUNTIME_2 _NO_SOFTLINKS_ $(ATS) AS_USE_SSL _GNU_SOURCE +defines += TITAN_RUNTIME_2 _NO_SOFTLINKS_ $(ATS) $(SUB_ATS) AS_USE_SSL _GNU_SOURCE libs += $(TTCN3_DIR)/lib/libttcn3-rt2-parallel.a -lstdc++fs ifeq (Windows_NT,$(OS)) @@ -77,9 +81,11 @@ gen_headers := $(gen_ttcn_headers) $(gen_ttcn3_headers) $(gen_asn_headers) $(gen gen_objects := $(patsubst %.cc, %.o, $(gen_sources)) cc_objects := $(patsubst %.cc, $(outdir)/%.o, $(cc_sources)) +outbin = $(bindir)/$(ATS)$(SUB_ATS)$(EXE) + .PHONY: all FORCE echo -all: $(bindir) $(outdir) $(bindir)/$(ATS)$(EXE) +all: $(bindir) $(outdir) $(outbin) echo_sources: @echo -e "$(addsuffix \n,$(all_sources))" diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 3c083f6..67a3cb9 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -3,10 +3,17 @@ # https://www.binaryhexconverter.com/hex-to-binary-converter +LibCommon_Time.PX_TDONE := 30.0; +LibCommon_Time.PX_TAC := 30.0; +LibCommon_Time.PX_TNOAC := 10.0; +LibCommon_Time.PX_TWAIT := 30.0; +LibCommon_Sync.PX_TSYNC_TIME_LIMIT := 30.0; +LibCommon_Sync.PX_TSHUT_DOWN_TIME_LIMIT := 30.0; + NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false -LibNGAP_Pics.PICS_OFFLINE_MODE := true # true for offline mode with pcap files, false for online mode with SCTP server +LibNGAP_Pics.PICS_OFFLINE_MODE := false # true for offline mode with pcap files, false for online mode with SCTP server LibNGAP_Pixits.PX_NAS_MCC := '999'H LibNGAP_Pixits.PX_NAS_MNC := '70'H @@ -66,12 +73,12 @@ LogEventTypes:= Yes # In this section you can specify parameters that are passed to Test Ports. # Open5GS AMF IP and port as listener -#system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" +system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Open5GS pcap files # Do not forget to set LibNGAP_Pics.PICS_OFFLINE_MODE to true #system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/ttcn_5g_ngap.pcapng)" # Linux cooked capture v2, no Ethernet layer -system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/TC_NGAP_AMF_PDU_01.pcap)" # regular pcap with Ethernet layer +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/TC_NGAP_AMF_PDU_01.pcap)" # regular pcap with Ethernet layer [DEFINE] # In this section you can create macro definitions, diff --git a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ new file mode 100644 index 0000000..6d0b2ba --- /dev/null +++ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ @@ -0,0 +1,192 @@ +[MODULE_PARAMETERS] +# This section shall contain the values of all parameters that are defined in your TTCN-3 modules. + +LibCommon_Time.PX_TDONE := 30.0; +LibCommon_Time.PX_TAC := 30.0; +LibCommon_Time.PX_TNOAC := 10.0; +LibCommon_Time.PX_TWAIT := 30.0; +LibCommon_Sync.PX_TSYNC_TIME_LIMIT := 30.0; +LibCommon_Sync.PX_TSHUT_DOWN_TIME_LIMIT := 30.0; + +NGAP_Pics.PICS_NGAP_AMF_IUT := false +NGAP_Pics.PICS_NGAP_GNB_IUT := true + +LibNGAP_Pics.PICS_OFFLINE_MODE := false # true for offline mode with pcap files, false for online mode with SCTP server + +LibNGAP_Pixits.PX_NAS_MCC := '999'H +LibNGAP_Pixits.PX_NAS_MNC := '70'H +LibNGAP_Pixits.PX_RAN_NODE_NAME := "gnb0012345" +LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v128 +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 2 + +LibNGAP_Pixits.PX_TIME_ZONE := '80'O # 0x40 for GMT+1, 0x80 for GMT+2 + +LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 + +Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format +Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type +Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_MSIN := '0000000010'O; +Lib_NG_NAS_Pixits.PX_NETWORK_NAME := "Open5GS" + +# OP +Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O +# OPc +Lib_NG_NAS_Pixits.PX_OPERATOR_SECRET_KEY := 'E8ED289DEBA952E4283B54E88E6183CA'O +Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true + +Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B +Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B + +Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 +Parameters.px_IMEISV_Def := '73806121856151f1'H +NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) + +[LOGGING] +# In this section you can specify the name of the log file and the classes of events +# you want to log into the file or display on console (standard error). + +LogFile := "../logs/AtsNGAP/%e.%h-%r.%s" +FileMask := LOG_ALL | USER | DEBUG | MATCHING +ConsoleMask := LOG_ALL | USER | DEBUG | MATCHING +#FileMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +#ConsoleMask := ERROR | WARNING | USER | MATCHING | EXECUTOR_RUNTIME | VERDICTOP | PORTEVENT | TESTCASE +LogSourceInfo := Stack +LogEntityName:= Yes +LogEventTypes:= Yes +#TimeStampFormat := DateTime + +[TESTPORT_PARAMETERS] +# In this section you can specify parameters that are passed to Test Ports. + +# Act as AMF, listen for incoming connections from gNB +system.NGAP_gNB_1.params := "NGAP/SCTP(local_server=127.0.0.5,server_mode=1,local_port=38412,debug=1)" + +# Open5GS pcap files +# Do not forget to set LibNGAP_Pics.PICS_OFFLINE_MODE to true +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/ttcn_5g_ngap.pcapng)" # Linux cooked capture v2, no Ethernet layer +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/TC_NGAP_AMF_PDU_01.pcap)" # regular pcap with Ethernet layer + +[DEFINE] +# In this section you can create macro definitions, +# that can be used in other configuration file sections except [INCLUDE] and [ORDERED_INCLUDE]. + +[INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[ORDERED_INCLUDE] +# To use configuration settings given in other configuration files, +# the configuration files just need to be listed in this section, with their full or relative pathnames. + +[EXTERNAL_COMMANDS] +# This section can define external commands (shell scripts) to be executed by the ETS +# whenever a control part or test case is started or terminated. + +#BeginTestCase := "" +#EndTestCase := "" +#BeginControlPart := "" +#EndControlPart := "" + +[EXECUTE] +# In this section you can specify what parts of your test suite you want to execute. +#AtsImsIot_TestControl.control + +# Verify that the GNB successfully processes a PDU_SESSION_RESOURCE_SETUP_REQUEST and answers with PDU_SESSION_RESOURCE_SETUP_RESPONSE for successfully established PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_01 +# Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value. +#NGAP_TestCases.TC_NGAP_GNB_PDU_02 +# Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP. +#NGAP_TestCases.TC_NGAP_GNB_PDU_03 +# Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a QoS Flow Setup Request List IE in the PDU Session Resource Setup Request Transfer IE including at least one Non-GBR QoS flow but the PDU Session Aggregate Maximum Bit Rate IE is not present. +#NGAP_TestCases.TC_NGAP_GNB_PDU_04 +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND contains mandatory IEs and answers with PDU SESSION RESOURCE RELEASE RESPONSE to release PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_05 +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND containing multiple PDU Session ID IEs set to the same value and ignore the duplication. +#NGAP_TestCases.TC_NGAP_GNB_PDU_05 +# Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE MODIFY REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE MODIFY RESPONSE for successfully modified PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_07 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_NOTIFY that already established QoS flow or PDU session for given UE are release. +#NGAP_TestCases.TC_NGAP_GNB_PDU_08 +# Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_INDICATION to request modification of established PDU session. +#NGAP_TestCases.TC_NGAP_GNB_PDU_09 + +# Verify that the IUT can send a HANDOVER REQUIRED message containing mandatory IEs. +#NGAP_TestCases.TC_NGAP_GNB_MMP_01 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. +#NGAP_TestCases.TC_NGAP_GNB_MMP_02 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST FAILURE because the UE is not longer available. +#NGAP_TestCases.TC_NGAP_GNB_MMP_03 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. +#NGAP_TestCases.TC_NGAP_GNB_MMP_04 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs within the Handover Request Transfer IEs and answers with correct HANDOVER REQUEST ACKNOWLEDGE. +#NGAP_TestCases.TC_NGAP_GNB_MMP_05 +# Verify that the GNB node successfully processes a HANDOVER REQUEST message for an intra-system handover and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. +#NGAP_TestCases.TC_NGAP_GNB_MMP_06 +# Verify that the AMF node successfully sends a HANDOVER NOTIFICATION message that contains mandatory IEs to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_07 +# Verify that the AMF node successfully sends a PATH SWITCH REQUEST message that contains mandatory IEs to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_08 +# Verify that the GNB node successfully sends a HANDOVER CANCEL message that contains mandatory IEs to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_09 +# Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_10 +# Verify that the NG-RAN node successfully sends a UPLINK RAN EARLY STATUS TRANSFER message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_MMP_11 + +# Verify that the IUT can send an INITIAL UE MESSAGE to indicate the initiation of a NAS Transport procedure. +#NGAP_TestCases.TC_NGAP_GNB_NAS_01 +# Verify that the IUT can send an UPLINK NAS TRANSPORT message to the AMF. +#NGAP_TestCases.TC_NGAP_GNB_NAS_02 +# Verify that the IUT can send a NAS NON DELIVERY INDICATION message to t.he AMF +#NGAP_TestCases.TC_NGAP_GNB_NAS_03 + +# Verify that the GNB sends an NG_SETUP_REQUEST message to the AMF after TNL establishment. +#NGAP_TestCases.TC_NGAP_GNB_IMP_01 +# Verify that the GNB successfully processes a full NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the resetVerify that the GNB node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset. +NGAP_TestCases.TC_NGAP_GNB_IMP_05 +# Verify that the GNB successfully processes a partial NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the partial reset. +#NGAP_TestCases.TC_NGAP_GNB_IMP_05_02 + +# Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing mandatory IEs and answers with WRITE-REPLACE WARNING RESPONSE to start broadcasting of warning messages. +#NGAP_TestCases.TC_NGAP_GNB_WTP_01 +# Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing Message Identifier IE and/or Serial Number IE different from those in the warning message being broadcast and if Concurent Warning Message Indicator is not present then IUT node answers with WRITE-REPLACE WARNING RESPONSE and replaces the warning message being broadcast with newly received one for that area. +#NGAP_TestCases.TC_NGAP_GNB_WTP_02 +# Verify that the NG-RAN node successfully processes a PWS CANCEL REQUEST containing mandatory IEs and answers with PWS CANCEL RESPONSE to cancel an already ongoing broadcast warning messages in all of the cells in the NG-RAN. +#NGAP_TestCases.TC_NGAP_GNB_WTP_03 +# Verify that the IUT can send a PWS RESTART INDICATION to inform AMF that PWS information for some or all cells may be reloaded from the CBC if needed. +#NGAP_TestCases.TC_NGAP_GNB_WTP_04 +# Verify that the IUT can send a PWS FAILURE INDICATION to inform AMF that ongoing PWS operation for one or more cells has failed. +#NGAP_TestCases.TC_NGAP_GNB_WTP_05 + +# Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that Trace Start procedure has failed due to an interaction with handover procedure. +#NGAP_TestCases.TC_NGAP_GNB_TRP_01 +# Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that a Deactivate Trace procedure has failed due to an interaction with handover procedure. +#NGAP_TestCases.TC_NGAP_GNB_TRP_02 +# Verify that the IUT can send a CELL_TRAFFIC_TRACE to send the allocated Trace Recording Session Reference and Trace Reference to AMF. +#NGAP_TestCases.TC_NGAP_GNB_TRP_03 + +[GROUPS] +# In this section you can specify groups of hosts. These groups can be used inside the +# [COMPONENTS] section to restrict the creation of certain PTCs to a given set of hosts. + +[COMPONENTS] +# This section consists of rules restricting the location of created PTCs. + +[MAIN_CONTROLLER] +# The options herein control the behavior of MC. +KillTimer := 10.0 +LocalAddress := 127.0.0.1 +TCPPort := 12000 +NumHCs := 1 diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index f2985ab..ae3362e 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -530,6 +530,20 @@ module NGAP_Steps { log("<<< f_NGAP_gnb_UE_Register"); } // End of function f_NGAP_gnb_UE_Register + /** + * @desc + */ + function f_NGAP_gnb_UE_ErrorIndication( + in template (value) Cause p_cause := m_cause_misc(unknown_PLMN_or_SNPN) + ) runs on gNBNGAPComponent { + log(">>> f_NGAP_gnb_UE_ErrorIndication"); + if (PICS_OFFLINE_MODE) { + f_await_error_indication(p_cause); + } else { + f_send_error_indication(p_cause); + } + } // End of function f_NGAP_amf_UE_ErrorIndication + /** * @desc */ diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index fdc1dcb..af23d3d 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -55,6 +55,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_init(); f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); // f_await_registration_request(); + stop; f_NGAP_gnb_UE_Authentication(); // f_send_authentication_request_await_authentication_response f_NGAP_gnb_UE_SecurityMode(); // f_send_security_mode_command_await_security_mode_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); @@ -2762,33 +2763,33 @@ module NGAP_TCFunctions { action("Trigger NG SETUP REQUEST!"); f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_NGSetupRequest( - ?,//template (present) GlobalRANNodeID p_globalRANNodeID := ?, - PX_RAN_NODE_NAME, - { - mw_supportedTAItem( - ?,//template (present) TAC p_tAC := ?, - { - mw_ie_broadcastPLMNItem( - ?, - ?, - * - ) - },//?,//template (present) BroadcastPLMNList p_broadcastPLMNList := ?, - *//template SupportedTAItem.iE_Extensions p_iE_Extensions := * - ) - }, - mw_pagingDRX(?) - ) - ) - ); + mw_ngap_initMsg( + mw_n2_NGSetupRequest( + ?, + PX_RAN_NODE_NAME, + { + *, + mw_supportedTAItem( + ?,//template (present) TAC p_tAC := ?, + { + mw_ie_broadcastPLMNItem( + ?, + ?, + * + ) + },//?,//template (present) BroadcastPLMNList p_broadcastPLMNList := ?, + *//template SupportedTAItem.iE_Extensions p_iE_Extensions := * + ), + * + }, + mw_pagingDRX(?) + ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); + f_NGAP_gnb_UE_ErrorIndication(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -2797,320 +2798,88 @@ module NGAP_TCFunctions { } // End of group NG_Setup //8.7.2 group RAN_Configuration_Update{ - - /** - * @desc Testcase function for TC_NGAP_gNB_IMP_02 - */ - function f_TC_NGAP_GNB_IMP_02() runs on gNBNGAPComponent { - // Local variables - - // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - action("Trigger RAN CONFIGURATION UPDATE!"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_RANConfigurationUpdate_SupportedTAList( - { - mw_supportedTAItem( - ?,//template (present) TAC p_tAC := ?, - { - mw_ie_broadcastPLMNItem( - ?, - ?, - * - ) - },//?,//template (present) BroadcastPLMNList p_broadcastPLMNList := ?, - *//template SupportedTAItem.iE_Extensions p_iE_Extensions := * - ) - } - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_gNB_IMP_02 - } // End of group RAN_Configuration_Update //8.7.3 group AMF_Configuration_Update{ - - /** - * @desc Testcase function for TC_NGAP_gNB_IMP_03 - */ - function f_TC_NGAP_GNB_IMP_03() runs on gNBNGAPComponent { - // Local variables - - // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_AMFConfigurationUpdate_tnl( - //NOTUSED in template (value) AMFName p_AMFName, - { m_servedGUAMIItem( - m_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER, - -//in template (omit) GUAMI.iE_Extensions p_iE_Extensions := omit - ),//in template (value) GUAMI p_gUAMI, - -,//in template (omit) AMFName p_backupAMFName := omit, - -//in template (omit) ServedGUAMIItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) ServedGUAMIList p_servedGUAMIList, - //NOT USED in template (value) RelativeAMFCapacity p_relativeAMFCapacity, - { - m_pLMNSupportItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) SliceSupportList p_sliceSupportList, - -//in template (omit) PLMNSupportItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) PLMNSupportList p_pLMNSupportList, - { - m_aMF_TNLAssociationToAddItem( - m_cPTransportLayerInformation_endpointIPAddress( - PX_TRANSPORT_LAYER_ADDRESS - ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, - 0,//in template (value) TNLAddressWeightFactor p_tNLAddressWeightFactor,TNLAddressWeightFactor ::= INTEGER (0..255) - -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, - -//in template (omit) AMF_TNLAssociationToAddItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) AMF_TNLAssociationToAddList p_aMF_TNLAssociationToAddList, - //NOT USED in template (value) AMF_TNLAssociationToRemoveList p_aMF_TNLAssociationToRemoveList, - { - m_aMF_TNLAssociationToUpdateItem( - m_cPTransportLayerInformation_endpointIPAddress( - PX_TRANSPORT_LAYER_ADDRESS - ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, - -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, - -,//in template (omit) TNLAddressWeightFactor p_tNLAddressWeightFactor := omit, - -//in template (omit) AMF_TNLAssociationToUpdateItem.iE_Extensions p_iE_Extensions := omit - ) - }//in template (value) AMF_TNLAssociationToUpdateList p_aMF_TNLAssociationToUpdateList//, - //NOT USED in template (value) Extended_AMFName p_extended_AMFName - ) - ) - ); - - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_AMFConfigurationUpdateAcknowledge_aMF_TNLAssociationSetupList( - ? - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_gNB_IMP_03 - - /** - * @desc Testcase function for TC_NGAP_gNB_IMP_04 - */ - function f_TC_NGAP_GNB_IMP_04() runs on gNBNGAPComponent { - // Local variables - - // Preamble - f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_AMFConfigurationUpdate_tnl( - //NOTUSED in template (value) AMFName p_AMFName, - { m_servedGUAMIItem( - m_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER, - -//in template (omit) GUAMI.iE_Extensions p_iE_Extensions := omit - ),//in template (value) GUAMI p_gUAMI, - -,//in template (omit) AMFName p_backupAMFName := omit, - -//in template (omit) ServedGUAMIItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) ServedGUAMIList p_servedGUAMIList, - //NOT USED in template (value) RelativeAMFCapacity p_relativeAMFCapacity, - { - m_pLMNSupportItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,//in template (omit) SD p_sD := omit, - -//in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) SliceSupportList p_sliceSupportList, - -//in template (omit) PLMNSupportItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) PLMNSupportList p_pLMNSupportList, - { - m_aMF_TNLAssociationToAddItem( - m_cPTransportLayerInformation_endpointIPAddress( - PX_TRANSPORT_LAYER_ADDRESS - ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, - 0,//in template (value) TNLAddressWeightFactor p_tNLAddressWeightFactor,TNLAddressWeightFactor ::= INTEGER (0..255) - -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, - -//in template (omit) AMF_TNLAssociationToAddItem.iE_Extensions p_iE_Extensions := omit - ) - },//in template (value) AMF_TNLAssociationToAddList p_aMF_TNLAssociationToAddList, - //NOT USED in template (value) AMF_TNLAssociationToRemoveList p_aMF_TNLAssociationToRemoveList, - { - m_aMF_TNLAssociationToUpdateItem( - m_cPTransportLayerInformation_endpointIPAddress( - PX_TRANSPORT_LAYER_ADDRESS - ),//in template (value) CPTransportLayerInformation p_aMF_TNLAssociationAddress, - -,//in template (omit) TNLAssociationUsage p_tNLAssociationUsage := omit, - -,//in template (omit) TNLAddressWeightFactor p_tNLAddressWeightFactor := omit, - -//in template (omit) AMF_TNLAssociationToUpdateItem.iE_Extensions p_iE_Extensions := omit - ) - }//in template (value) AMF_TNLAssociationToUpdateList p_aMF_TNLAssociationToUpdateList//, - //NOT USED in template (value) Extended_AMFName p_extended_AMFName - ) - ) - ); - - f_recv_NGAP_PDU( - mw_ngap_unsuccMsg( - mw_n2_AMFConfigurationUpdateFailure( - ? - ) - ) - ); - - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_gNB_IMP_04 - } // End of group AMF_Configuration_Update //8.7.4 group NG_Reset{ /** - * @desc Testcase function for TC_NGAP_gNB_IMP_05 - */ + * @desc Testcase function for TC_NGAP_gNB_IMP_05 + */ function f_TC_NGAP_GNB_IMP_05() runs on gNBNGAPComponent { // Local variables // Preamble f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGReset( - m_cause_radioNetwork(PX_NG_SETUP_FAILURE), - m_resetType_nG_Interface( - m_resetAll(reset_all) - ) - ) - ) - ); + m_ngap_initMsg( + m_n2_NGReset( + m_cause_radioNetwork(PX_NG_SETUP_FAILURE), + m_resetType_nG_Interface( + m_resetAll(reset_all) + )))); f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGResetAcknowledge - ) - ); + mw_ngap_succMsg( + mw_n2_NGResetAcknowledge + )); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_gNB_IMP_05 - } // End of group NG_Reset - //8.7.5 - group Error_Indication{ - /** - * @desc Testcase function for TC_NGAP_gNB_IMP_06 - */ - function f_TC_NGAP_GNB_IMP_06() runs on gNBNGAPComponent { + * @desc Testcase function for TC_NGAP_gNB_IMP_05 + */ + function f_TC_NGAP_GNB_IMP_05_02() runs on gNBNGAPComponent { // Local variables // Preamble f_NGAP_gnb_init(); - //f_NGAP_gnb_UE_Register(); + f_NGAP_gnb_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body - action("Trigger ERROR INDICATION!"); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGReset( + m_cause_radioNetwork(PX_NG_SETUP_FAILURE), + m_resetType_nG_Interface( + m_resetAll(reset_all) + )))); f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_ErrorIndication - ) - ); + mw_ngap_succMsg( + mw_n2_NGResetAcknowledge + )); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_postamble_NGAP_gNB(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_gNB_IMP_06 + } // End of function f_TC_NGAP_gNB_IMP_05_02 + } // End of group NG_Reset + //8.7.5 + group Error_Indication{ } // End of group Error_Indication //8.7.6 group AMF_Status_Indication{ diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 17a5748..79c9a1f 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -47,7 +47,7 @@ module NGAP_TestCases { group PDU_Session_Resource_Setup{ /** - * @desc Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE SETUP REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE SETUP RESPONSE for successfully established PDU session + * @desc Verify that the GNB successfully processes a PDU_SESSION_RESOURCE_SETUP_REQUEST and answers with PDU_SESSION_RESOURCE_SETUP_RESPONSE for successfully established PDU session */ testcase TC_NGAP_GNB_PDU_01() runs on gNBNGAPComponent system TestAdapter { @@ -1295,123 +1295,13 @@ module NGAP_TestCases { group Interface_Management_Procedures{ //8.7.1 group NG_Setup{ - - /** - * @desc "Verify that the GNB node successfully sends a NG SETUP REQEST message to the AMF." - */ - testcase TC_NGAP_GNB_IMP_01() runs on gNBNGAPComponent system TestAdapter { - - // Local variables - var gNBNGAPComponent v_ngap_amf; - - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_1' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); - - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_IMP_01()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_GNB_IMP_01 - } // End of group NG_Setup //8.7.2 group RAN_Configuration_Update{ - /** - * @desc "Verify that the IUT can send a RAN CONFIGURATION UPDATE message to the AMF." - */ - testcase TC_NGAP_GNB_IMP_02() runs on gNBNGAPComponent system TestAdapter { - - // Local variables - var gNBNGAPComponent v_ngap_amf; - - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_2' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); - - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_IMP_02()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_GNB_IMP_02 - } // End of group RAN_Configuration_Update //8.7.3 group AMF_Configuration_Update{ - - /** - * @desc "Verify that the GNB node successfully processes a AMF CONFIGURATION UPDATE message with AMF CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update." - */ - testcase TC_NGAP_GNB_IMP_03() runs on gNBNGAPComponent system TestAdapter { - - // Local variables - var gNBNGAPComponent v_ngap_amf; - - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_3' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); - - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_IMP_03()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_GNB_IMP_03 - - /** - * @desc "Verify that the GNB node can send a AMF CONFIGURATION UPDATE FAILURE." - */ - testcase TC_NGAP_GNB_IMP_04() runs on gNBNGAPComponent system TestAdapter { - - // Local variables - var gNBNGAPComponent v_ngap_amf; - - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_3' shall be set to true for executing the TC. ***"); - stop; - } - - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); - - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_IMP_04()); - - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - - f_cf_Down/*gNBoraMF*/(); - - } // End of testcase TC_NGAP_GNB_IMP_04 - } // End of group AMF_Configuration_Update //8.7.4 group NG_Reset{ @@ -1443,21 +1333,17 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_GNB_IMP_05 - } // End of group NG_Reset - //8.7.5 - group Error_Indication{ - /** - * @desc "Verify that the GNB can send a ERROR INDICATION to the AMF when a error occurs." + * @desc "Verify that the GNB node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset." */ - testcase TC_NGAP_GNB_IMP_06() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_IMP_05_02() runs on gNBNGAPComponent system TestAdapter { // Local variables var gNBNGAPComponent v_ngap_amf; // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_5)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_5' shall be set to true for executing the TC. ***"); + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_4' shall be set to true for executing the TC. ***"); stop; } @@ -1465,15 +1351,18 @@ module NGAP_TestCases { f_cf_NGAP_gNB_Up(v_ngap_amf); // Start - v_ngap_amf.start(f_TC_NGAP_GNB_IMP_06()); + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_05_02()); // synchronize PTC on 1 sychronization points f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_IMP_06 + } // End of testcase TC_NGAP_GNB_IMP_05_02 + } // End of group NG_Reset + //8.7.5 + group Error_Indication{ } // End of group Error_Indication //8.7.6 group AMF_Status_Indication{ diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 1fade87..f45176c 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -79,7 +79,7 @@ module LibNGAP_Pixits { * @desc The identifier for the PDU session * @see ETSI TS 138 413 V16.12.0 (2023-05) */ - modulepar PDUSessionID PX_PDU_SESSION_ID := 0; + modulepar PDUSessionID PX_PDU_SESSION_ID := 1; /** * @desc Single Network Slice Selection Assistance Information diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 94fe4c9..930e0e9 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -444,15 +444,74 @@ module LibNGAP_Functions { function f_send_authentication_request_await_authentication_response() runs on NGNASComponent { log(">>> f_send_authentication_request_await_authentication_response"); - // TODO Prepare security context - - // TODO Send request for AUTHENTICATION_REQUEST - - // TODO Await response for AUTHENTICATION_RESPONSE - - - setverdict(fail); - + // // Compute security context and RES/XRES for AuthenticationRequest + // if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + // setverdict(fail); + // return; + // } + + // // Send request for DOWNLINK_NAS_TRANSPORT + // f_recv_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_DownlinkNASTransport( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // ? // AuthorizationRequest + // ))); + // f_NASPDU_Get(vc_recvNGAP_PDU); + // var NG_NAS_DL_Message_Type v_dl_message; + // if (f_Check_5GAKA_NAS_DL_Message( + // vc_recvNAS_PDU, + // mw_NG_AUTHENTICATION_REQUEST( + // -, //'00?'B, + // -, + // mw_GMM_AuthRAND, + // mw_GSM_AUTN + // ), + // vc_ng_nas_security_params_type, + // vc_previous_nas_count_dl, + // v_dl_message) == false) { + // log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + // setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + // } + // log("v_dl_message: ", v_dl_message); + + // // Extract AMF_UE_NGAP_ID + // vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + // log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // // Extract + // vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; + // log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + + // // Compute RES/XRES + // if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + // setverdict(fail); + // return; + // } + + // // Await response for AUTHENTICATION_RESPONSE + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_UplinkNASTransport( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); + // f_NASPDU_Get(vc_recvNGAP_PDU); + // if (f_Check_5GAKA_NAS_UL_Message( + // vc_recvNAS_PDU, + // mw_NG_AUTHENTICATION_RESPONSE( + // { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + // ), + // vc_ng_nas_security_params_type, + // vc_previous_nas_count_ul + // ) == false) { + // log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); + // setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); + // } + + // setverdict(pass); + + setverdict(fail, "f_send_authentication_request_await_authentication_response is not implemented yet."); } /** -- GitLab From f602083e5e9c6a28e018662a9e36b18a932d1b5a Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 24 Apr 2026 11:31:03 +0200 Subject: [PATCH 108/151] Validate TC_NGAP_GNB_IMP_01 --- captures/TC_NGAP_AMF_IMP_01.pcap | Bin 0 -> 5508 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 captures/TC_NGAP_AMF_IMP_01.pcap diff --git a/captures/TC_NGAP_AMF_IMP_01.pcap b/captures/TC_NGAP_AMF_IMP_01.pcap new file mode 100644 index 0000000000000000000000000000000000000000..7738bef126fdabeb13d452fb1a2899ab0e501015 GIT binary patch literal 5508 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 literal 0 HcmV?d00001 -- GitLab From d62de8ed42e10845fea5fef701e997cba7817451 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 13 May 2026 22:09:49 +0200 Subject: [PATCH 109/151] Validate Validate TC_NGAP_GNB_PDU_01 --- captures/TC_NGAP_AMF_CMP_03.pcap | Bin 3818 -> 568307 bytes captures/TC_NGAP_AMF_PDU_02.pcap | Bin 4030 -> 5506 bytes ccsrc/Externals/module.mk | 2 + etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ | 20 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 25 ++ ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 189 +++++++------ ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 2 +- ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn | 2 + .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 219 ++++++++++----- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 6 + .../lib/Lib_NG_NAS_Security_Functions.ttcn | 252 +++++++++--------- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 34 ++- 13 files changed, 451 insertions(+), 304 deletions(-) diff --git a/captures/TC_NGAP_AMF_CMP_03.pcap b/captures/TC_NGAP_AMF_CMP_03.pcap index ab36d559f525ed829343f4e21c8674252700cadf..f3a65ae9b549c7431a2e0821ef31f5efc31855c0 100644 GIT binary patch literal 568307 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%0D4w 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 Na^qSPu&Gct0sw$7^0NQ{ delta 2046 zcmZqD-X}jng5B)Y`Am=3oRc>SYMVFT=a*rC0!9V~mDBIE1sE6?Ffhpd|6j)-)XTub zz{bGJz|g?Jz;b|rfd!;D@HOYeMqTOV`(VWk3=C`x3@kRM&S$o7VPwc+U|`6a%*ZY> z@vfl4&dzB(P{SD*85nG~y?=iRY&zHf|LW5lKTqak)L;kcoV|r{vMr---p)?25(Wka zCI&_orgGy+VC8ZQTyC#j1Q^&EIsV#jVeQY~*nUjkTFRdzjHh1TY%9zP7(L0joaxg0 z_uF86SIIdA>h~5&$T4s+2)MjExm>*_D>BJXHelkM?7+k#0CpiLh>$!nxrRvw?2#o~7$?tX z(vAW79PE4s1_myMLF{Z1u(P*pVVu~gq~=%8z`zO$nQ1(TnBa!SuI&z_*j0^TU~*t^ zXt5CiDF^f53qxPel~WIa{~ux0O#f-RdofmJ{g*;OD5KnfWc z=bwUE5OSW8p^brop$(K|C*Nfiltz zY8Kp7QxFgpT$JrHvw`9N*%fzOPkrCWzyPvu{U653zuB}^klhC|7-SGQlRyj(P@mrT zb+Q+`s)3@Fo|W!Fre?lI-n)**a#0MG4*U)?f3gdi1PB?-{K?M1zz8z;0vi)U6$1l9 z71$p+JHx>KSdYgaUy-b{c6;q2H2DR)lDy{M{3i@`46#fMOdmcxG-G4}yE;&fi2;-k zw}DKbY|9~t&HX}129~Q&Z~Qj7h(n3x&N*q_$ul^-*g&q_VLy2umyF5IaIou~@VM?9 zl3`2TUb_fSw&1k$?zmc2F*8UY?LhL8Ez6z@8eYiUn(Hvv#@oen)dF#=OfLo{2ae)~ zM8($s|35OQIq2)vF=gmjB{J4AI59GoGjM;J`IDWA!QlV{d;a8uoZ{egb~un}@_kOM zF(QoQ2xax@jo&BhaX|_Q-(*%uPKW^e=0q{DfP{_;&olxlDBoA;y( z92p%NJQ=}BP5&V)!zTs?hEJfxp!#HI6xc>%Y(c=l%y8K4wTtNFA|7>?7alr(ljrgj zFs(P5%+D(ic6R7Pa5zp5;KiEBMHv|9`-1!p3Oi0!HbfGiJeOAxJrupwr#JqZe2CWt zZ1hHNPDm6*gWdNGoBKdH52OheBDSZ_XZCxrO^)Wnh$2vq{5^RVpAyS_V~>> f_send_authentication_request_await_authentication_response"); - // // Compute security context and RES/XRES for AuthenticationRequest - // if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { - // setverdict(fail); - // return; - // } + // Compute security context + // Set OP + if (PX_FORCE_USING_OPERATOR_SECRET_KEY == false) { + f_set_op(PX_OPERATOR_KEY); + } else { + f_force_opc(PX_OPERATOR_SECRET_KEY); + } + // Compute MAC_A + var B48_Type v_sqn := PX_SQN; + var B16_Type v_amf := PX_AMF; // AMF: Authentication Management Field + vc_ng_nas_security_params_type.AuthParams.RandValue := PX_RAND_VALUE; + var B64_Type v_mac_a; + var integer v_result := f_f1(PX_SUBSCRIPTION_KEY, vc_ng_nas_security_params_type.AuthParams.RandValue, v_sqn, v_amf, v_mac_a); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'fx_f1' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + log("v_sqn: ", bit2oct(v_sqn)); + log("v_mac_a: ", bit2oct(v_mac_a)); + var B48_Type v_ak; + // Compute RES, CK, IK and AK + v_result := f_f2345(PX_SUBSCRIPTION_KEY, vc_ng_nas_security_params_type.AuthParams.RandValue, vc_ng_nas_security_params_type.AuthParams.XRES, vc_ng_nas_security_params_type.AuthParams.CK, vc_ng_nas_security_params_type.AuthParams.IK, v_ak); + if (v_result != 0) { + log("*** " & __SCOPE__ & ": ERROR: 'f_f2345' returned an error code: " & int2str(v_result) & ". ***"); + setverdict(fail); + } + log("v_ak: ", bit2oct(v_ak)); + vc_ng_nas_security_params_type.AuthParams.XRESLength := lengthof(vc_ng_nas_security_params_type.AuthParams.XRES); + // Build AUTN, the Authentication Token: AUTN = SQN ⊕ AK || AMF || MAC + vc_ng_nas_security_params_type.AuthParams.AUTN := (v_sqn xor4b v_ak) & v_amf & v_mac_a; + log("v_sqn xor4b v_ak: ", bit2oct(v_sqn xor4b v_ak)); + log("vc_ng_nas_security_params_type.AuthParams.AUTN: ", bit2oct(vc_ng_nas_security_params_type.AuthParams.AUTN)); + // RE-compute RES/XRES and finalyze security context + if (f_5g_aka_compute_res_xres(-, vc_ng_nas_security_params_type.AuthParams.RandValue, vc_ng_nas_security_params_type.AuthParams.AUTN, valueof(cs_ABBA('0000'O, omit)), fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + // Build the NAS message for AuthenticationRequest + var NG_NAS_DL_Message_Type v_dl_message := valueof( + m_NG_AUTHENTICATION_REQUEST( + '000'B, + cs_ABBA('0000'O, omit), + cs_GMM_AuthRAND(vc_ng_nas_security_params_type.AuthParams.RandValue), + cs_GSM_AUTN(vc_ng_nas_security_params_type.AuthParams.AUTN) + )); + log("v_dl_message: ", v_dl_message); + log(bit2oct(encvalue(valueof(v_dl_message)))); + // Send request for DOWNLINK_NAS_TRANSPORT + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_DownlinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + bit2oct(encvalue(valueof(v_dl_message))) // AuthorizationRequest + ))); - // // Send request for DOWNLINK_NAS_TRANSPORT - // f_recv_NGAP_PDU( - // m_ngap_initMsg( - // m_n2_DownlinkNASTransport( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID, - // ? // AuthorizationRequest - // ))); - // f_NASPDU_Get(vc_recvNGAP_PDU); - // var NG_NAS_DL_Message_Type v_dl_message; - // if (f_Check_5GAKA_NAS_DL_Message( - // vc_recvNAS_PDU, - // mw_NG_AUTHENTICATION_REQUEST( - // -, //'00?'B, - // -, - // mw_GMM_AuthRAND, - // mw_GSM_AUTN - // ), - // vc_ng_nas_security_params_type, - // vc_previous_nas_count_dl, - // v_dl_message) == false) { - // log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); - // setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); - // } - // log("v_dl_message: ", v_dl_message); - - // // Extract AMF_UE_NGAP_ID - // vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; - // log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); - // // Extract - // vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; - // log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); - - // // Compute RES/XRES - // if (f_5g_aka_compute_res_xres(-, v_dl_message.authentication_Request.rand.randValue, v_dl_message.authentication_Request.autn.aUTN, v_dl_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { - // setverdict(fail); - // return; - // } - - // // Await response for AUTHENTICATION_RESPONSE - // f_recv_NGAP_PDU( - // mw_ngap_initMsg( - // mw_n2_UplinkNASTransport( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID - // ))); - // f_NASPDU_Get(vc_recvNGAP_PDU); - // if (f_Check_5GAKA_NAS_UL_Message( - // vc_recvNAS_PDU, - // mw_NG_AUTHENTICATION_RESPONSE( - // { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } - // ), - // vc_ng_nas_security_params_type, - // vc_previous_nas_count_ul - // ) == false) { - // log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); - // setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); - // } - - // setverdict(pass); - - setverdict(fail, "f_send_authentication_request_await_authentication_response is not implemented yet."); + // Await response for AUTHENTICATION_REQUEST + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_RESPONSE( + { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); + } + + setverdict(pass); } /** @@ -585,9 +594,79 @@ module LibNGAP_Functions { * @desc Function to send NAS SecurityModeCommand message and await for SecurityModeComplete message */ function f_send_security_mode_command_await_security_mode_complete() runs on NGNASComponent { - // TODO Send request for SECURITY_MODE_COMMAND + // Send request for SECURITY_MODE_COMMAND + // 1. Build the NAS message for SECURITY_MODE_COMMAND request + var NG_NAS_DL_Message_Type v_nas_message := valueof( + m_NG_SECURITY_MODE_COMMAND( + cs_NG_NAS_SecurityAlgorithms( + tsc_SHT_NoSecurityProtection, // No cyphering for SecurityModeCommand as per 24.501 cl + tsc_SHT_IntegrityProtected_Ciphered // Integrity protection only for SecurityModeCommand as per 24.501 cl. + ), + '000'B, + valueof(m_ng_ue_security_capability(omit)), + cds_NG_IMEISV_Request, + omit, + m_additional_security_info('36'O) + )); + log("v_nas_message: ", v_nas_message); + var octetstring v_msg := bit2oct(encvalue(valueof(v_nas_message))); + // 2. Set security algorithm + f_5g_security_context(v_nas_message.security_Mode_Command, vc_ng_nas_security_params_type); + log("vc_ng_nas_security_params_type: ", vc_ng_nas_security_params_type); + // New context + vc_previous_nas_count_dl := f_NasCountInit(); + // 3. Add security if any + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_NewSecurityContext, + v_msg, + tsc_DirectionDL, + PX_BEARER_ID, + vc_previous_nas_count_dl, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_dl: ", vc_previous_nas_count_dl); + vt_NgNasDl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); + // 4. Send request for DOWNLINK_NAS_TRANSPORT + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_DownlinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_sendNAS_PDU + ))); - // TODO Receive response for SECURITY_MODE_COMPLETE + // Await response for SECURITY_MODE_COMPLETE + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + ?, + mw_uPTransportLayerInformation_userLocationInformationNR( + mw_userLocationInformationNR( + mw_nR_CGI, + mw_tAI + ))))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMPLETE_no_nonIMEISV_PEI( + -, //mw_NG_MobileIdentitySUCI(PX_TYPE_OF_ID, PX_SUPI_DIGITS), //in template (value) NG_MobileIdentity p_IMEISV, + - //{ iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); + } + + // TODO Check plainNASMessage content + + setverdict(pass); } /** diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn index 5eecbc0..7778d7c 100755 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn @@ -39,6 +39,11 @@ module Lib_NG_NAS_Pixits { modulepar boolean PX_FORCE_USING_OPERATOR_SECRET_KEY := false + modulepar B48_Type PX_SQN := oct2bit('000000000000'O); + + modulepar B16_Type PX_AMF := oct2bit('8000'O); // AMF: Authentication Management Field + + modulepar B128_Type PX_RAND_VALUE := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); /** * @desc Subscription key (K) */ @@ -51,4 +56,5 @@ module Lib_NG_NAS_Pixits { */ modulepar charstring PX_NETWORK_NAME := ""; + } // End of module Lib_NG_NAS_Pixits \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 2f385bc..49f7742 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -383,6 +383,132 @@ module Lib_NG_NAS_Security_Functions { return int2oct(v_CountValue, 4); }; + function f_NG_Imeisv2MobileIdentity_v( + in hexstring p_IMEISV + ) return NG_MobileIdentity { + var integer v_ImeiLength := lengthof(p_IMEISV); + var integer v_Odd := (v_ImeiLength rem 2); + var octetstring v_Other := f_ImsiImei2Octetstring (p_IMEISV); + var B4_Type v_FirstDigit := hex2bit(p_IMEISV[0]); + var B1_Type v_OddEvenInd := int2bit(v_Odd, 1); + + return valueof({ + iei := '77'O, + iel := int2oct(1+v_ImeiLength, 2), + idDigit1 := v_FirstDigit, + oddEvenInd := v_OddEvenInd, + typeOfId := tsc_IdType_NG_IMEISV, + otherDigits := v_Other + }); + } + + // TODO To be moved in Lib_NG_NAS_Security_Functions.ttcn + // See NG_NasEmu_Common.f_EncodeAndCipher_NG_NasPdu + // This function needs to be reworked for ciphering + function f_EncodeAndCipher_NG_NasPdu_v( // TODO To be renamed + in SecurityHeaderType p_security_header_type, + in octetstring p_nAS_PDU, + in MAC_Direction_Type p_direction, + in B5_Type p_bearerId, + inout NasCount_Type p_nas_count, + inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type, + out NG_SECURITY_PROTECTED_NAS_MESSAGE p_ng_security_protected_nas_message + ) return octetstring { + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nAS_PDU: ", p_nAS_PDU); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_direction: ", p_direction); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_bearerId: ", p_bearerId); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); + log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); + + //v_EncodedNasPdu := f_NG_NasEmu_EncodePiggybacked(p_NAS_MSG_Request.Pdu); + + if (p_ng_nas_security_params_type.NAS_Integrity.Algorithm == tsc_SHT_NoSecurityProtection) { + log("f_EncodeAndCipher_NG_NasPdu_v: No security applied"); + return p_nAS_PDU; + } + + // Increment NAS count + p_nas_count := f_NasSecurity_IncrementCOUNT(p_nas_count); + + // Apply ciphering if necessary + var octetstring v_EncodedNasPdu := p_nAS_PDU; + if ( + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) + ) { + log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); + v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, + p_nas_count, + p_bearerId); + } + if ( + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or + (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) + ) { + log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); + v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, + p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, + p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, + p_nas_count, + p_bearerId); + } + + // Apply integrity protection + log("f_EncodeAndCipher_NG_NasPdu_v: Apply integrity protection"); + var NAS_SequenceNumber v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(p_nas_count); + log("f_EncodeAndCipher_NG_NasPdu_v: v_SequenceNumber: ", v_SequenceNumber); + var octetstring v_Octet7toN := v_SequenceNumber & v_EncodedNasPdu; + log("f_EncodeAndCipher_NG_NasPdu_v: v_Octet7toN: ", v_Octet7toN); + var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, + p_ng_nas_security_params_type.NAS_Integrity.Algorithm, + p_ng_nas_security_params_type.NAS_Integrity.K_NAS, + p_nas_count, + p_bearerId, + p_direction); + log("f_EncodeAndCipher_NG_NasPdu_v: v_calculated_mac: ", v_calculated_mac); + + // Security protected NAS message + var NG_NAS_DL_Message_Type v := valueof( + m_NG_SecurityProtected_NasMsg( + p_security_header_type, + v_calculated_mac, + v_SequenceNumber, + v_EncodedNasPdu + )); + p_ng_security_protected_nas_message := v.security_Protected_Nas_Message; + v_EncodedNasPdu := bit2oct(encvalue(p_ng_security_protected_nas_message)); + + log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_ng_security_protected_nas_message: ", p_ng_security_protected_nas_message); + log("<<< f_EncodeAndCipher_NG_NasPdu_v: ", v_EncodedNasPdu); + return v_EncodedNasPdu; + } + + function fl_NasNN_MCC2PlmnId( + in NAS_Mcc p_nas_mcc, + in hexstring p_nas_mnc + ) return NAS_PlmnId { + log(">>> fl_NasNN_MCC2PlmnId: p_nas_mcc=", p_nas_mcc); + log(">>> fl_NasNN_MCC2PlmnId: p_nas_mnc=", p_nas_mnc); + + // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[0]=", p_nas_mcc[0]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[1]=", p_nas_mcc[1]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[2]=", p_nas_mcc[2]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mnc[0]=", p_nas_mnc[0]); + // log("fl_NasNN_MCC2PlmnId: p_nas_mnc[1]=", p_nas_mnc[1]); + + var hexstring v_plmn_hexstring; + if (lengthof(p_nas_mnc) == 2) { + v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & 'f'H & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; + } else { + v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & p_nas_mnc[2] & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; + } + + log("<<< fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", hex2oct(v_plmn_hexstring)); + return hex2oct(v_plmn_hexstring); + } + /** * @see https://www.ericsson.com/en/blog/2021/9/authentication-and-key-agreements */ @@ -647,130 +773,4 @@ module Lib_NG_NAS_Security_Functions { } // End of function fiveg_aka_security_network - function f_NG_Imeisv2MobileIdentity_v( - in hexstring p_IMEISV - ) return NG_MobileIdentity { - var integer v_ImeiLength := lengthof(p_IMEISV); - var integer v_Odd := (v_ImeiLength rem 2); - var octetstring v_Other := f_ImsiImei2Octetstring (p_IMEISV); - var B4_Type v_FirstDigit := hex2bit(p_IMEISV[0]); - var B1_Type v_OddEvenInd := int2bit(v_Odd, 1); - - return valueof({ - iei := '77'O, - iel := int2oct(1+v_ImeiLength, 2), - idDigit1 := v_FirstDigit, - oddEvenInd := v_OddEvenInd, - typeOfId := tsc_IdType_NG_IMEISV, - otherDigits := v_Other - }); - } - - // TODO To be moved in Lib_NG_NAS_Security_Functions.ttcn - // See NG_NasEmu_Common.f_EncodeAndCipher_NG_NasPdu - // This function needs to be reworked for ciphering - function f_EncodeAndCipher_NG_NasPdu_v( // TODO To be renamed - in SecurityHeaderType p_security_header_type, - in octetstring p_nAS_PDU, - in MAC_Direction_Type p_direction, - in B5_Type p_bearerId, - inout NasCount_Type p_nas_count, - inout NG_NAS_SecurityParams_Type p_ng_nas_security_params_type, - out NG_SECURITY_PROTECTED_NAS_MESSAGE p_ng_security_protected_nas_message - ) return octetstring { - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nAS_PDU: ", p_nAS_PDU); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_direction: ", p_direction); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_bearerId: ", p_bearerId); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_nas_count: ", p_nas_count); - log(">>> f_EncodeAndCipher_NG_NasPdu_v: p_ng_nas_security_params_type: ", p_ng_nas_security_params_type); - - //v_EncodedNasPdu := f_NG_NasEmu_EncodePiggybacked(p_NAS_MSG_Request.Pdu); - - if (p_ng_nas_security_params_type.NAS_Integrity.Algorithm == tsc_SHT_NoSecurityProtection) { - log("f_EncodeAndCipher_NG_NasPdu_v: No security applied"); - return p_nAS_PDU; - } - - // Increment NAS count - p_nas_count := f_NasSecurity_IncrementCOUNT(p_nas_count); - - // Apply ciphering if necessary - var octetstring v_EncodedNasPdu := p_nAS_PDU; - if ( - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) - ) { - log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); - v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, - p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, - p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, - p_nas_count, - p_bearerId); - } - if ( - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered) or - (p_ng_nas_security_params_type.NAS_Ciphering.Algorithm == tsc_SHT_IntegrityProtected_Ciphered_NewSecurityContext) - ) { - log("f_EncodeAndCipher_NG_NasPdu_v: Apply ciphering"); - v_EncodedNasPdu := fx_NG_NasCiphering(p_nAS_PDU, - p_ng_nas_security_params_type.NAS_Ciphering.Algorithm, - p_ng_nas_security_params_type.NAS_Ciphering.K_NAS, - p_nas_count, - p_bearerId); - } - - // Apply integrity protection - log("f_EncodeAndCipher_NG_NasPdu_v: Apply integrity protection"); - var NAS_SequenceNumber v_SequenceNumber := f_NasSecurity_ExtractSNfromCOUNT(p_nas_count); - log("f_EncodeAndCipher_NG_NasPdu_v: v_SequenceNumber: ", v_SequenceNumber); - var octetstring v_Octet7toN := v_SequenceNumber & v_EncodedNasPdu; - log("f_EncodeAndCipher_NG_NasPdu_v: v_Octet7toN: ", v_Octet7toN); - var octetstring v_calculated_mac := fx_NG_NasIntegrityAlgorithm(v_Octet7toN, - p_ng_nas_security_params_type.NAS_Integrity.Algorithm, - p_ng_nas_security_params_type.NAS_Integrity.K_NAS, - p_nas_count, - p_bearerId, - p_direction); - log("f_EncodeAndCipher_NG_NasPdu_v: v_calculated_mac: ", v_calculated_mac); - - // Security protected NAS message - var NG_NAS_DL_Message_Type v := valueof( - m_NG_SecurityProtected_NasMsg( - p_security_header_type, - v_calculated_mac, - v_SequenceNumber, - v_EncodedNasPdu - )); - p_ng_security_protected_nas_message := v.security_Protected_Nas_Message; - v_EncodedNasPdu := bit2oct(encvalue(p_ng_security_protected_nas_message)); - - log("<<< f_EncodeAndCipher_NG_NasPdu_v: p_ng_security_protected_nas_message: ", p_ng_security_protected_nas_message); - log("<<< f_EncodeAndCipher_NG_NasPdu_v: ", v_EncodedNasPdu); - return v_EncodedNasPdu; - } - - function fl_NasNN_MCC2PlmnId( - in NAS_Mcc p_nas_mcc, - in hexstring p_nas_mnc - ) return NAS_PlmnId { - log(">>> fl_NasNN_MCC2PlmnId: p_nas_mcc=", p_nas_mcc); - log(">>> fl_NasNN_MCC2PlmnId: p_nas_mnc=", p_nas_mnc); - - // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[0]=", p_nas_mcc[0]); - // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[1]=", p_nas_mcc[1]); - // log("fl_NasNN_MCC2PlmnId: p_nas_mcc[2]=", p_nas_mcc[2]); - // log("fl_NasNN_MCC2PlmnId: p_nas_mnc[0]=", p_nas_mnc[0]); - // log("fl_NasNN_MCC2PlmnId: p_nas_mnc[1]=", p_nas_mnc[1]); - - var hexstring v_plmn_hexstring; - if (lengthof(p_nas_mnc) == 2) { - v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & 'f'H & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; - } else { - v_plmn_hexstring := p_nas_mcc[1] & p_nas_mcc[0] & p_nas_mnc[2] & p_nas_mcc[2] & p_nas_mnc[1] & p_nas_mnc[0]; - } - - log("<<< fl_NasNN_MCC2PlmnId`: v_plmn_hexstring=", hex2oct(v_plmn_hexstring)); - return hex2oct(v_plmn_hexstring); - } - } // End of module Lib_NG_NAS_Security_Functions \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index 704dc46..e0599a5 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -2366,6 +2366,7 @@ module Lib_NG_NAS_Templates { } // End of template mw_NAS_KeySetIdentifier template (omit) NG_UE_SecurityCapability m_ng_ue_security_capability( + in template (omit) IEI8_Type p_IEI := '2e'O, in template (value) Type4Length_Type p_iel := '02'O, in O1_Type p_ngeaCap := 'f0'O, in O1_Type p_ngiaCap := 'f0'O, @@ -2373,7 +2374,7 @@ module Lib_NG_NAS_Templates { in template (omit) O1_Type p_eiaCap := omit, in template (omit) octetstring p_spare := omit ) := { - iei := '2e'O, + iei := p_IEI, iel := p_iel, ngeaCap := p_ngeaCap, ngiaCap := p_ngiaCap, @@ -2383,7 +2384,8 @@ module Lib_NG_NAS_Templates { } // End of template m_ng_ue_security_capability template (present) NG_UE_SecurityCapability mw_ng_ue_security_capability( - template (present) Type4Length_Type p_iel := '2e'O, + template IEI8_Type p_IEI := '2e'O, + template (present) Type4Length_Type p_iel := '02'O, template (present) O1_Type p_ngeaCap := 'f0'O, template (present) O1_Type p_ngiaCap := 'f0'O, template O1_Type p_eeaCap := *, @@ -2468,4 +2470,32 @@ module Lib_NG_NAS_Templates { text := p_text } + template (omit) AdditionalSecurityInfo m_additional_security_info( + in template (omit) IEI8_Type p_iei := omit, /* present in case of TV; omit in case of V */ + in template (omit) Type4Length_Type p_iel := '01'O, /* present in case of LV or TLV; omit in case of V */ + in template (value) B6_Type p_spareBits := '000000'B, + in template (value) B1_Type p_rinmr := '1'B, + in template (value) B1_Type p_hdp := '0'B + ) := { + iei := p_iei, + iel := p_iel, + spareBits := p_spareBits, + rinmr := p_rinmr, + hdp := p_hdp + } + + template (present) AdditionalSecurityInfo mw_additional_security_info( + template IEI8_Type p_iei := *, /* present in case of TV; omit in case of V */ + template Type4Length_Type p_iel := ?, /* present in case of LV or TLV; omit in case of V */ + template (present) B6_Type p_spareBits := ?, + template (present) B1_Type p_rinmr := '1'B, + template (present) B1_Type p_hdp := ? + ) := { + iei := p_iei, + iel := p_iel, + spareBits := p_spareBits, + rinmr := p_rinmr, + hdp := p_hdp + } + } // End of module Lib_NG_NAS_Templates \ No newline at end of file -- GitLab From 4ce73b992dd1381f221425051fb422dcd7836391 Mon Sep 17 00:00:00 2001 From: garciay Date: Sat, 16 May 2026 17:14:33 +0200 Subject: [PATCH 110/151] Add Upper Tester for UERANSIM --- captures/TC_NGAP_AMF_IMP_01_02.pcap | Bin 0 -> 16858 bytes captures/TC_NGAP_GNB_IMP_01.pcap | Bin 0 -> 1270 bytes captures/TC_NGAP_GNB_IMP_05.pcap | Bin 0 -> 1796 bytes captures/TC_NGAP_GNB_PDU_01.pcap | Bin 0 -> 2140 bytes ccsrc/Externals/upper_terster.cc | 76 ++++++++++ etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ | 6 + ttcn/AtsNGAP/NGAP_Steps.ttcn | 48 +++++- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 1 + ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 5 + ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 14 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 141 +++++++++--------- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 6 +- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 13 +- 13 files changed, 224 insertions(+), 86 deletions(-) create mode 100644 captures/TC_NGAP_AMF_IMP_01_02.pcap create mode 100644 captures/TC_NGAP_GNB_IMP_01.pcap create mode 100644 captures/TC_NGAP_GNB_IMP_05.pcap create mode 100644 captures/TC_NGAP_GNB_PDU_01.pcap create mode 100644 ccsrc/Externals/upper_terster.cc diff --git a/captures/TC_NGAP_AMF_IMP_01_02.pcap b/captures/TC_NGAP_AMF_IMP_01_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..9180d5a2e9177fe11d1d4613bb3900b9b33bc107 GIT binary patch literal 16858 zcmca|c+)~A1{MYcU}0cnU|{&a@_)Et|E;|nKQOQ|aDdc;=mRSlML{%| zE(0UF+d(!rtYBmaVq^egn3*6NWHTc)bgcD2wt`HY#?v|jY#Rdu0}}(IN`%P5 zkdR~GVhEFtdd0-hIs;@MOdgr$nFfkk28ISE29<)UImTQ+MXH`IKb-hn*V`mj=f{ic zzu_BhSX)j!BotPTtPdZXl2F8EE-ZC`Lbz)MBZCZq3PlE39`gf*ASfh}(n)3=E76 zX$%4&DMpY81A_nu0|O_6r~{(|C>~e6$o#OLk-?6E0gOTFU>Iz>!7p!+?T+6-HiKM% z?0#kj1_7|`jPoypbb&%ccsC=sJOh<$ATbyQo96P%2W;9yY^E_VGbn*`DnyHogD3+Z zC@=FnFmWDW$aY{fU|;~*pt&2Ldl{HPHrUvM+zPS3+l{~gE@-c>I$=P)pV z%QjFM2NHu}uzO>E`GQRQ&kZsOR9+$bo`r$IhJlg60#qV^kIF{djF=U;)`|BZSQ#tQ6SHx9UZvvMet?Kl_1f-Zl&5XHeOU%g-P=n14{{ zEQp`KM+M}5)}7M{lLOi8iPvTZR*=m$f`t4`s?CC{USz&WWy9xZe~`_N$3T7t*^bN4 zAUT+SQ0NkfpP!UB{kM1$rUH`#*({WX&t?WTkj>b0H*!3aYP0aF7nwDR?D+f~0J8Z% zs6J)|rC(fr2FbzvgF@Fp{EVKqK{hYIYcm5o$YvXUke@&yj+{r4{Y zVYB3_7nyx6_}Znvf`*ZII3P@!HJ54YJt= zR7=8p0kD=La(*V&X4zFQGDS{v;Y-`0Ae$Wzfcy*!aa?`|$-%sdLN9^%89i--Z1%%z zGXoFEW*aV$$spTt#WP4A#YPwhkIf=8dGWNNpnWcQzwpH!)PCVvV^%9j&*%UDjaMvV z(EC;(zj@5$CER93>KDGa12z@fFO*;PBC}`*Gro8U1BK3iCQ!(LQaY}90m;Dv1chD& zi5K+z2eNqyUYi+sK{nfPg2EkSJFa*k)n>(2FEYOuvf%S`ILPL06G66uQaUa_gXB>B z3gc{o_!&L_fozs6!e=uBAIN4KP)$x={=;Fj@~Rh^^ZxVT^K%5qX2-oCKZ8OXm!Cm$ zFmIyJdmw&B&wn7Bui~|tfgfbE4LitWknOnQ86=NlBaDN?X4O?MGWmAlZ68O1Z2tEj zWGg5Y;qo&`4rUn&eFWlX^t27K*#xi63<4mVZP-A50@;qs&!pO{zUoD0`x1Pu)L&5` zo456WYz3uXTz&@0q4*WXIR)`EdfEorycn;|41yq=Z9p|Sd1)Jm%^Is-Wcq6{F_VT^4QZ#ys8Hs~ncuiFYAz&6V< za8>*1Z3T_u?bOk_Eyc9GHt2v-aA(H6#TBm#*27GN(H|6U|FW2yI|;^DmfF^G4LXXq zRnM=QiD5gqRSJ_wrjbYSq;$V8ljxVU^9lSN_G}H~FEgtvbxT6`H{TYV^jELNnGabX zJ~n6+59}|{crA&ch|OHsC>|(;o2IdVNAN%+dB|$PA&fDK2Z~#8sDeg+7#KN5Lz964 z6pGWQu@KHQ3f?EqjA(RRRONSI z>;RekXe$f2{s7e@AZZu|o2&sH(Q?IRGOP}XUG*X}Wd{cdb;yot)H^{T>c;7-USt|GkTRq8JOkB@^*yXVU~Zf+ zWd}F98$mYsGLSZ-_B;b@D%6eJR=vn<_{~Q`IKJ{lb)%@|qBk%%CdZxMgziR=4Re3< zkra-ve8Hwd-FR))i%g$9$gCvxQGE0s=%o-;H*(JXJRjypOASp$bT@)*h{=P@N)j8_ zmqNg%Lf!af)r(AZb~X~i@wFPN8;c}Ax4_(ZtsvJM-Hjj{oY>h&3dh%KU{j%P6k7cv zbH@fQ65Kc)&5iNuahWhTKAdiBgYHI<4OcgCk>tkdYG6~LZq!@-B2(0Xn*=xBVMh%| zzliNeVQ$>w>}`PVMvx7<4%{TU@eVuKRHz%hSHH+iZ6GB*Ubu$p#_#L)9fG-WqP@HT zx*I_@R5Xy59xq%2n+kPf#_AWD3@cel2*+D*QQi1xan+$+s2kf>zsR(G$4QDC3sBwY(0APy=Eiv5o%!f)1lbVvj*~Pu7JyBKx^e017n#+X zr1Yomd_#5P&ZhgVFgM<_c~OV%Mvx6tG)e1E-T4MK73#(#t6ya1?PCe%FERyQkdkN4x1fgOwWSl`Ww>6z##iWW1lb__g0wtyz6ES5)Qz@lUSxi8WFaA6 zUw@D4Ms<;d!?19anzz6Z-Hjj{_??L8A0f5PuD=JH3Uy=jnirW1JV~jq=j=muqnva1 zPM90#_SKZ3yAfo=9#7Kh>pAr1{PkUi*oNvglgYHI<4KJ!mD|_y20-FkT z0Y&Lr$x*I_@yjnzB`*HG5u&GctW~_aYDV0u&8*e>Ab>s5> zn~P!LnD!>J2HlMy8_d#4bK|W?U{j%PY+d^z^PCMSd1jv#sv9?*Kima#V|PVUHo6-@ zHoUMQEzj(;0-FkTcs>PPRaIBglp=7fFlj8&ANdLf!aq?TgH+`=pFX zz1fB8M&c+dXbtb^v znBD5R4Bd?&8$5GKD<2<(f=z|GQF`5r%$&KTw9RG;qPlTUWy&g;8(U?!zCm{*$cDDL zq_xdv3W80Ay3u;wi_AwmNJ)?FS5e)Vc4hi*m>a!BB!8j15oE*99i*kl_N!o1p>B*^ z_aZZ3Cn;_`p^56oE77~Qz})!LO27%-jUXFxcarAD6PjRCp>C{L_abweAU_Fxh1Z3s zZp;+le*)&l>vy+$p}P@e!zMv~lEwgD7lKWNx^e2d7n%EdND0Sh_NZ>0`obUv=EhHI z-;SWW5oE)y9@4_`nLXH4s2ex0dyzT)HYsIzgA%G6&mQD?3v*+~ERIriH-cc;f-FEZ~&lTu&L>qm7X&woz%c+bpiJ_&R;f^7I1OABb{zWEFG`^i6=yOOf(8ihzx~*zq zZrpyZqX^xNARAPoiP(9AG$!?;0BkDMjr-TX$n5SWrR>>-HeaZaVFPdDo?hO9(WU^| zu)LeJvS(KY*i@(+@2!84X{$iWSjuFy@$mhp%5z}hs1i`xh8~U}8zL1*8%vq|4QwjZ zjepj^$eeSG6gNIEMoo`v+vgd>+_-$FD#m;v$cAmlNOR-!Vz8-DH%e`IkvVk{Df6z! z(8};9`-K}}Zq&Q4A&ef5AR9Im?mg6StbMTm70ivC zAL3r3yAfo=EEUq)J$LVcO@+EKY{QGp6DFk0X>RPEwPeJf#ZWNh#eLU$v`hKDAk z&1r7@3N{t$#^MbxG9@cX3CC-HQQcU&Crbq8#si$CyV2bUvcas9v~axk7i=ojjT1J! z$h`fSlzL|2epEM_?tU%_bK|w!na|PP2(sbpW76uGh5Ny#LfyD#!;8#!{G^PLu5w0o z<1R71IWRZwXyd_XKZ0!F79eembd@vMRHz$IZg`QIE zJsd$cGzgHEukZANO@+Gg`Gyyn_mfG9>kG3{-FWDnyf(~@PXZ({%14k5zmrLe>kG5N zrb6Aww(&(~{TX%=`h`nkQQfF~?N|xSji(=(rlW@=$c8y**h%UaE{O%33U#CM#uu5> z&XQ7Jx9Fp~am|5l_`HJ5;tgxj-3YQ_{aMoL>lS^msZcjMYU{rzFVC@Go9c0Tio(?mxsSFGZObm=Hryn@0!ECsyKG&Fmo#Dlm zqy2a`vpd8UCvhk>Dii9u!IG@I34tK1%ETxvY(>i;hNS>b)l_nEmj7auk)JI%gn z3$i|ZY+^zSSwC_JnjB_k5MyKjV`Mep5aeKB1jUhcCdfCSPz1#hIMf(G(K0eZ3zW{B zK8qQbm!xZHX{l>&plisG z#=r~G$p}&mcCx4gqXRUDb{}D8uw!5VV~`>k2D{3j=?KVGJ8MBP4{{lD{$XZd5CFT1 zasFI}-pJ8V3VqgGckQfYuO|xk_3O20(n`sQp3^L#x2-Cvpzyb0WzXM|j$mCgP z@VS$L8Dz4JJ;;q9(~(mt$em!58Rvfi84fZ{{5&&*83O|tgT!DM>`slQV<6LZHiJw8 PnTYIbHc*uFFt7jsf1up? literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_GNB_IMP_05.pcap b/captures/TC_NGAP_GNB_IMP_05.pcap new file mode 100644 index 0000000000000000000000000000000000000000..c39a5175159595d74181314deba31cd7c282fc40 GIT binary patch literal 1796 zcmca|c+)~A1{MYcU}0cnU|{$l_c~L=jFlmXfdPyW@(c_d46aNJE({C~3=SDZ$0S#jxKaScZwA zF&|_fOdgr$nFb0S28ISE29@Y&-=&tH90hCi%sdoQtAFi2EcZ|2c1$Q+-^9oBIA_g5 z)`yQxOlTqNM-D+lGgbyMMg}lORs#+}4hBY099d_Ad;C6_C z&KMXNjF5wf0h*Gb>C6UeI^%|>)Jk(!hBgKUFh({66wVA43{2o~{(&u=8JHPD!Ra5O z&4xjg!I6Q1g+ZEulVRph_5cP321bS;2XQWjP}d+wzhF;a-SoU9T}w+#U2_9nLxwa4 zUXV^kkYcctMI9I&pgFX~oRz_jfdPy`ieMP*Dg%kTAXh1;f?^)zGUWWj%)lT3b`|6N z-5_0{PG6!8s7BMM0Fo6y!%n20qq?{DRax z)AVB9#N0Fkh6Dx<29Qsf7#tYF92oyI1UPVm_zVmJ91IMcP=CF#X9fESbASGGH;8@AP%Q*8VJIqu8J(dq2K73%P zWDpL32t%We@$J;PH4IS>j1mk54vY*SmzA#IU`S$M0ArYb5Dj)&h{S!6%alR>WCghn zOZ-g%mwzBF%nV90!5#;|sR_gvVc-LmlKc)#3=9krU=M(7oOP5NU&yk8Y_zcj*@h!z z55Q~`kbj-IO_+zljDZ1+L6*WW*!>y|Y+%z|u$jirz`y}=FUXV|!aU%di9L5pJOG)Z noCk6b$Ry-Y;9y{20h#a|uL%t7AQNodLApVvAg32T1_l-YNOw3g literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_GNB_PDU_01.pcap b/captures/TC_NGAP_GNB_PDU_01.pcap new file mode 100644 index 0000000000000000000000000000000000000000..88b1475d983dc9bde05e168a5879619ea555da34 GIT binary patch literal 2140 zcmca|c+)~A1{MYcU}0cnU|_I5!kT4vnvEfdfdPyW@(c_d46aNJE({C~3=S?r3JacovrZO-vFflN)XjGXR!E8t_UJ%c~&hR2; zNB@aOx#?Z0CMr?RTaKQT@XOr+G7%XYnO13hICX;yCdU3$)g>c;y#yBn7eoAl;$$X< zxj7*FVDiW`&oofzFfcSQF{u1n7j0`_6XVCgqPusK@$QnU{s10{&JS#dvKVUpzlzUB z)`yQxOlTqNM-IWT(`*c4j0|9mtOgu{91M)0II_+J`34kZa!<=~`M^>Y5wq8Zx9Y z@Pc$Qf)sX@MD3p$0Wn-vfU;tx~7z~3=%jxI`n^uO+GzMk{PjC)|YEcknFa`OMk%5o3A-^Cs z&osSQH!(NOfFXf_g8}3dCI$zFFbBr}3;_<@AU*?w00#pDC)8h;uj2C;12f1aHufMt zfn0-}szLq&yM%H6agbwdkFaJvROVplVqgGckQfYu{Z+%j0y53|6E@Qrm>FU`)Kgc0 zi$n$n8wP#{4+aKShEP!X!=T0>C0WPdSjoW4IP)hv%v1qAmJc63d|;?#5DtI{L!*xI z?FOg43{eh@5)1_nj0_-`Mb&XIOk!XFW0-yr4R%>e#{`heHphbe2yz{k_*(%k|3F%p z8G@3F7bJjF6Nt~^V8_6~%)kY9Da^gvT6GLz3``6Riprrj`=*(%n5)?J%y*spep3a3 zsjqTejGY@8tR4itFg7u7sMwkq__2^d8B5X>U}S)#PJJdu#$ZMU9Ki~X p`SVLS7|a+Lz!>HW5DoT;M#m(OPd0A{`2yq{ +#include +#include + +#include "async_process.hh" + +#include "NGAP_Steps.hh" + +#include "loggers.hh" + +static async_process gnb_proc; +static async_process ue_proc; + +namespace NGAP__Steps { + + INTEGER fx__ut__start__gnb(const CHARSTRING& p__binary__file, const CHARSTRING& p__config__file) { + loggers::get_instance().log_msg(">>> fx__ut__start__gnb: p__binary__file: ", p__binary__file); + loggers::get_instance().log_msg(">>> fx__ut__start__gnb: p__config__file: ", p__config__file); + + async_process::Options opts = {false, "", [](std::string_view chunk, bool isStderr) { + if (isStderr) { + loggers::get_instance().warning("fx__ut__start__gnb: p__config__file: '%s'", std::string(chunk).c_str()); + std::cerr << "GNB STDERR: " << chunk; + } else { + loggers::get_instance().log("fx__ut__start__gnb: p__config__file: '%s'", std::string(chunk).c_str()); + std::cout << "GNB STDOUT: " << chunk; + } + }}; + try { + gnb_proc.start(static_cast(p__binary__file), { "-c", static_cast(p__config__file) }, opts); + } + catch (const std::exception& e) { + std::cerr << "fx__ut__start__gnb: Failed to start process: " << e.what() << std::endl; + return -1; + } + + return 0; + } + + INTEGER fx__ut__terminate__gnb() { + loggers::get_instance().log(">>> fx__ut__terminate__gnb"); + gnb_proc.terminate(); + return 0; + } + +INTEGER fx__ut__start__ue(const CHARSTRING& p__binary__file, const CHARSTRING& p__config__file) { + loggers::get_instance().log_msg(">>> fx__ut__start__ue: p__binary__file: ", p__binary__file); + loggers::get_instance().log_msg(">>> fx__ut__start__ue: p__config__file: ", p__config__file); + + async_process::Options opts = {false, "", [](std::string_view chunk, bool isStderr) { + if (isStderr) { + loggers::get_instance().warning("fx__ut__start__ue: '%s'", std::string(chunk).c_str()); + std::cerr << "UE STDERR: " << chunk; + } else { + loggers::get_instance().log("fx__ut__start__ue: '%s'", std::string(chunk).c_str()); + std::cout << "UE STDOUT: " << chunk; + } + }}; + try { + ue_proc.start(static_cast(p__binary__file), { "-c", static_cast(p__config__file) }, opts); + } + catch (const std::exception& e) { + std::cerr << "fx__ut__start__gnb: Failed to start process: " << e.what() << std::endl; + return -1; + } + + return 0; +} + + INTEGER fx__ut__terminate__ue() { + loggers::get_instance().log(">>> fx__ut__terminate__ue"); + ue_proc.terminate(); + return 0; + } + +} // End of namespace NGAP__Steps diff --git a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ index d28dc34..9e6cba8 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ @@ -57,6 +57,12 @@ Parameters.px_IMSI_Def := '39393937303030303030303 Parameters.px_IMEISV_Def := '73806121856151f1'H NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) +# Upper tester parameters for UERANSIM integration +LibNGAP_Pixits.PX_GNB_BINARY_FILE := "/home/yann/dev/UERANSIM/build/nr-gnb"; +LibNGAP_Pixits.PX_GNB_CONFIG_FILE := "/home/yann/dev/UERANSIM/config/open5gs-gnb.yaml"; +LibNGAP_Pixits.PX_UE_BINARY_FILE := "/home/yann/dev/UERANSIM/build/nr-ue"; +LibNGAP_Pixits.PX_UE_CONFIG_FILE := "/home/yann/dev/UERANSIM/config/open5gs-ue.yaml"; + [LOGGING] # In this section you can specify the name of the log file and the classes of events # you want to log into the file or display on console (standard error). diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 20d4239..288fcca 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -9,7 +9,10 @@ * All rights reserved. * @see ETSI TS */ -module NGAP_Steps { +module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NGAP_Steps.ttcn module + + // Lib3GPP + import from NG_NAS_TypeDefs all; // LibNGAP import from NGAP_CommonDataTypes language "ASN.1:1997" all; @@ -69,7 +72,7 @@ module NGAP_Steps { vc_SUT_port := PX_NGAP_SUT_PORT; if (PICS_USE_UERANSIMU) { - fx_ut_start_gnb(); + fx_ut_start_gnb(PX_GNB_BINARY_FILE, PX_GNB_CONFIG_FILE); } } // End of function f_NGAP_gnb_init @@ -155,6 +158,7 @@ module NGAP_Steps { } if (PICS_USE_UERANSIMU) { + fx_ut_terminate_ue(); fx_ut_terminate_gnb(); } @@ -265,6 +269,23 @@ module NGAP_Steps { } else { // Await security mode and send response f_await_security_mode_command_send_security_mode_complete(); } + + if (not isbound(vc_inner_message) or (lengthof(vc_inner_message) == 0)) { + log("f_NGAP_gnb_UE_SecurityMode: vc_inner_message is not bound or empty"); + setverdict(fail, "Security Mode Command message content is not available for verification"); + } else { + // TODO FSCOM To be enhanced with more detailed verification of the Security Mode Command message content + var NG_REGISTRATION_REQUEST v_inner_message; + var bitstring v_bs := oct2bit(vc_inner_message); + var integer v_result := decvalue(v_bs, v_inner_message); + if (v_result != 0) { + log("f_NGAP_gnb_UE_SecurityMode: Failed to decode Security Mode Command message content"); + setverdict(fail, "Failed to decode Security Mode Command message content"); + } else { + log("f_NGAP_gnb_UE_SecurityMode: v_inner_message: ", v_inner_message); + // FIXME FSCOM To be enhanced with verification of the inner message + } + } log("<<< f_NGAP_amf_UE_SecurityMode"); } // End of function f_NGAP_amf_UE_SecurityMode @@ -535,7 +556,7 @@ module NGAP_Steps { } if (PICS_USE_UERANSIMU) { - fx_ut_start_ue(); + fx_ut_start_ue(PX_UE_BINARY_FILE, PX_UE_CONFIG_FILE); } log("f_NGAP_gnb_UE_Register: f_send_NGSetupRequest_await_NGSetupResponse done"); @@ -587,6 +608,23 @@ module NGAP_Steps { } else { // Await security mode and send response f_send_security_mode_command_await_security_mode_complete(); } + + if (not isbound(vc_inner_message) or (lengthof(vc_inner_message) == 0)) { + log("f_NGAP_gnb_UE_SecurityMode: vc_inner_message is not bound or empty"); + setverdict(fail, "Security Mode Command message content is not available for verification"); + } else { + // TODO FSCOM To be enhanced with more detailed verification of the Security Mode Command message content + var NG_REGISTRATION_REQUEST v_inner_message; + var bitstring v_bs := oct2bit(vc_inner_message); + var integer v_result := decvalue(v_bs, v_inner_message); + if (v_result != 0) { + log("f_NGAP_gnb_UE_SecurityMode: Failed to decode Security Mode Command message content"); + setverdict(fail, "Failed to decode Security Mode Command message content"); + } else { + log("f_NGAP_gnb_UE_SecurityMode: v_inner_message: ", v_inner_message); + // FIXME FSCOM To be enhanced with verification of the inner message + } + } log("<<< f_NGAP_gnb_UE_SecurityMode"); } // End of function f_NGAP_gnb_UE_SecurityMode @@ -765,11 +803,11 @@ module NGAP_Steps { group ut_functions { - external function fx_ut_start_gnb() return integer; + external function fx_ut_start_gnb(in charstring p_binary_file, in charstring p_config_file) return integer; external function fx_ut_terminate_gnb() return integer; - external function fx_ut_start_ue() return integer; + external function fx_ut_start_ue(in charstring p_binary_file, in charstring p_config_file) return integer; external function fx_ut_terminate_ue() return integer; diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 74f5862..01bfe31 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -58,6 +58,7 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Authentication(); // f_send_authentication_request_await_authentication_response f_NGAP_gnb_UE_SecurityMode(); // f_send_security_mode_command_await_security_mode_complete stop; + f_NGAP_gnb_UE_InitialContextSetup(); // f_send_initial_context_setup_request_await_initial_context_setup_response f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index f45176c..5064a75 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -668,5 +668,10 @@ module LibNGAP_Pixits { */ //modulepar Target_ToSource_TransparentContainer PX_TARGET_TO_SOURCE_TANSPARENT_CONTAINER := '12121212'O; + modulepar charstring PX_GNB_BINARY_FILE := "/home/yann/dev/UERANSIM/build/nr-gnb"; + modulepar charstring PX_GNB_CONFIG_FILE := "config/open5gs-gnb.yaml"; + modulepar charstring PX_UE_BINARY_FILE := "/home/yann/dev/UERANSIM/build/nr-ue"; + modulepar charstring PX_UE_CONFIG_FILE := "config/open5gs-ue.yaml"; + } // End of module LibNGAP_Pixits diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 76b53fe..844fb5c 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1068,13 +1068,13 @@ module LibNGAP_Templates { } // End of template m_n2_InitialContextSetupRequest template (value) InitiatingMessage m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( - in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, - in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, - in template (value) GUAMI p_gUAMI, - in template (value) AllowedNSSAI p_allowedNSSAI, - in template (value) UESecurityCapabilities p_uESecurityCapabilities, - in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH - ) := { + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + in template (value) GUAMI p_gUAMI, + in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) UESecurityCapabilities p_uESecurityCapabilities, + in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH + ) := { procedureCode := id_InitialContextSetup, criticality := reject, value_ := { diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index e37ace3..bd7b12d 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -262,19 +262,22 @@ module LibNGAP_Functions { -, m_ng_ue_security_capability )); - log("f_send_registration_request: v_nas_message: ", v_nas_message); - log(bit2oct(encvalue(valueof(v_nas_message)))) - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_initialUeMessage( - -, - bit2oct(encvalue(valueof(v_nas_message))), - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - )) - ))); + // Save message in global variable for later use + vc_registration_request := vc_recvNgNasUl_Msg.registration_Request; + // Send it + log("f_send_registration_request: v_nas_message: ", v_nas_message); + log(bit2oct(encvalue(valueof(v_nas_message)))) + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_initialUeMessage( + -, + bit2oct(encvalue(valueof(v_nas_message))), + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + )) + ))); } /** @@ -295,6 +298,9 @@ module LibNGAP_Functions { // Extract RAN_UE_NGAP_ID vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.initialUEMessage.protocolIEs[0].value_.rAN_UE_NGAP_ID; log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + + // Save message in global variable for later use + vc_registration_request := vc_recvNgNasUl_Msg.registration_Request; } else { log("*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NAS message"); @@ -429,7 +435,8 @@ module LibNGAP_Functions { { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } ), vc_ng_nas_security_params_type, - vc_previous_nas_count_ul + vc_previous_nas_count_ul, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); @@ -514,7 +521,8 @@ module LibNGAP_Functions { { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } ), vc_ng_nas_security_params_type, - vc_previous_nas_count_ul + vc_previous_nas_count_ul, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_RESPONSE"); @@ -603,7 +611,16 @@ module LibNGAP_Functions { tsc_SHT_IntegrityProtected_Ciphered // Integrity protection only for SecurityModeCommand as per 24.501 cl. ), '000'B, - valueof(m_ng_ue_security_capability(omit)), + valueof( + m_ng_ue_security_capability( + omit, + vc_registration_request.ueSecurityCapability.iel, + vc_registration_request.ueSecurityCapability.ngeaCap, + vc_registration_request.ueSecurityCapability.ngiaCap, + vc_registration_request.ueSecurityCapability.eeaCap, + vc_registration_request.ueSecurityCapability.eiaCap, + vc_registration_request.ueSecurityCapability.spare + )), cds_NG_IMEISV_Request, omit, m_additional_security_info('36'O) @@ -658,7 +675,8 @@ module LibNGAP_Functions { - //{ iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, ), vc_ng_nas_security_params_type, - vc_previous_nas_count_ul + vc_previous_nas_count_ul, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); @@ -817,7 +835,8 @@ module LibNGAP_Functions { - //{ iei := omit, iel := int2oct(0, 2), replayedNASMsgContainerValue := ''O } /* 24.301 cl. 9.9.3.51 @sic R5s170597 Baseline Moving sic@ */, //in template (value) ReplayedNASMessageContainer p_NASMsg, ), vc_ng_nas_security_params_type, - vc_previous_nas_count_ul + vc_previous_nas_count_ul, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMPLETE"); @@ -966,66 +985,40 @@ module LibNGAP_Functions { /** * @desc Function to send NAS InitialContextSetupRequest message and await for InitialContextSetupResonse message */ - function f_send_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent { + function f_send_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent {/* log(">>> f_send_initial_context_setup_request_await_initial_context_setup_resonse"); + // Prepare NAS Registration Accept message + // Secure the message if required + // Send InitialContextSetupRequest + // FIXME FSCOM To be continued + vc_initialContextSetupRequest := m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_gUAMI + ( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER, + * + ), + m_allowedNSSAI_Item(cs_S_NSSAI('02'O, '00'O, '01'O)) + + ); + log("vc_initialContextSetupRequest: ", vc_initialContextSetupRequest); f_send_NGAP_PDU( m_ngap_initMsg( - m_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - m_gUAMI, - { - { - PX_PDU_SESSION_ID, - omit, - m_s_NSSAI('00'O, '000000'O), - bit2oct( - encvalue( - m_pDUSessionResourceSetupRequestTransfer( - m_pDUSessionResourceSetupRequestTransfer_mandatories( - m_pDUSessionType(ipv4), - { - m_qosFlowSetupRequestItem( - PX_QOS_FLOW_IDENTIFIER, - m_qosFlowLevelQosParameters( - m_qosCharacteristics_dynamic5QI( - m_dynamic5QIDescriptor( - 1,//in template (value) PriorityLevelQos p_priorityLevelQos, - 0,//in template (value) PacketDelayBudget p_packetDelayBudget, - m_PacketErrorRate( - 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, - 0//in template (value) PacketErrorRate.pERExponent p_pERExponent - ))), - m_allocationAndRetentionPriority( - 1,//in template (value) PriorityLevelARP p_priorityLevelARP, - shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, - not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, - ))) - }, - m_uPTransportLayerInformation_gTPTunnel( - m_gTPTunnel - )))) - ), - omit - } - - }, - { - m_allowedNSSAI_Item( - m_s_NSSAI('00'O, '000000'O) - ) - }, - m_uESecurityCapabilities - ))); + vc_initialContextSetupRequest + )); // Await InitialContextSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes )); - log("<<< f_send_initial_context_setup_request_await_initial_context_setup_resonse"); + log("<<< f_send_initial_context_setup_request_await_initial_context_setup_resonse");*/ } function f_await_retrieve_ue_information_await_ue_information_transfer() runs on NGNASComponent { @@ -1162,7 +1155,8 @@ module LibNGAP_Functions { vc_recvNAS_PDU, mw_NG_REGISTRATION_COMPLETE_noSOR, vc_ng_nas_security_params_type, - vc_previous_nas_count_ul + vc_previous_nas_count_ul, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_COMPLETE mismatch."); setverdict(fail); @@ -1266,7 +1260,8 @@ module LibNGAP_Functions { vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_REQUEST, vc_ng_nas_security_params_type, - vc_previous_nas_count_ul + vc_previous_nas_count_ul, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_REQUEST mismatch."); setverdict(fail); @@ -1561,7 +1556,13 @@ module LibNGAP_Functions { vc_RAN_UE_ID ))); f_NASPDU_Get(vc_recvNGAP_PDU) - if (f_Check_5GAKA_NAS_UL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_RELEASE_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_PDU_SESSION_RELEASE_REQUEST, + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_RELEASE_REQUEST mismatch."); setverdict(fail); } else { diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index afbbd98..bddb57d 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -70,13 +70,15 @@ module LibNGAP_Interface { var NGAP_PDU vc_recvNGAP_PDU ; var NasCount_Type vc_previous_nas_count_ul; var NasCount_Type vc_previous_nas_count_dl; + var NG_REGISTRATION_REQUEST vc_registration_request; var InitialContextSetupRequest vc_initialContextSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupRequest vc_pDUSessionResourceSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupResponse vc_pDUSessionResourceSetupResponse; // TODO Could be useless at the end of the day var PDUSessionResourceSetupListSUReq vc_pdu_session_resource_setup_list_su_req; // Used to terminate test case execution properly var PDUSessionResourceSetupListSURes vc_pdu_session_resource_setup_list_su_res; // Used to terminate test case execution properly - var NGAP_PDU vc_recvNGAP_PDUDefault ; //global variable defined to save Dimeter message received within default altstep - + var NGAP_PDU vc_recvNGAP_PDUDefault; //global variable defined to save Dimeter message received within default altstep + var octetstring vc_inner_message; //global variable defined to save inner message extracted from NAS Msg Container IE, used for security mode complete + // Init of values at component started // Note: generation of following MME and ENB UE IDs can be done randomly in init var integer vc_AMF_UE_ID := PX_AMF_UE_NGAP_ID; diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 49f7742..53e38ac 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -186,7 +186,8 @@ module Lib_NG_NAS_Security_Functions { in NAS_PDU p_nas_pdu, in template NG_NAS_UL_Message_Type p_NG_NAS_UL_Message_Type, in NG_NAS_SecurityParams_Type p_NasSecurityByRef, - inout NasCount_Type p_previous_nas_count_ul + inout NasCount_Type p_previous_nas_count_ul, + out octetstring p_inner_message ) return boolean { log(">>> f_Check_5GAKA_NAS_UL_Message: p_nas_pdu: ", p_nas_pdu); log(">>> f_Check_5GAKA_NAS_UL_Message: p_NasSecurityByRef: ", p_NasSecurityByRef); @@ -296,7 +297,15 @@ module Lib_NG_NAS_Security_Functions { } log("f_Check_5GAKA_NAS_UL_Message: matching"); - // TODO Return the message value + // Extract inner message if any + if (ischosen(v_message.security_Mode_Complete)) { + if (ispresent(v_message.security_Mode_Complete.nasMsg)) { + log("f_Check_5GAKA_NAS_UL_Message: v_message.security_Mode_Complete.nasMsgContainer: ", v_message.security_Mode_Complete.nasMsg); + p_inner_message := v_message.security_Mode_Complete.nasMsg.replayedNASMsgContainerValue; + } + } else { + p_inner_message := ''O; + } log("<<< f_Check_5GAKA_NAS_UL_Message: p_previous_nas_count_ul: ", p_previous_nas_count_ul); return true; -- GitLab From fc6ca2dfa1cfc7e4bba0a89d61327e9c2bbed7e4 Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 18 May 2026 18:52:06 +0200 Subject: [PATCH 111/151] Bug fixed in LibNGAP_Functions --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 8 ++--- titan-test-system-framework | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 32 +++++++++---------- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 2 +- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 89f7aeb..b7c537e 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -7,8 +7,8 @@ LibCommon_Time.PX_TDONE := 30.0; LibCommon_Time.PX_TAC := 30.0; LibCommon_Time.PX_TNOAC := 10.0; LibCommon_Time.PX_TWAIT := 30.0; -LibCommon_Sync.PX_TSYNC_TIME_LIMIT := 30.0; -LibCommon_Sync.PX_TSHUT_DOWN_TIME_LIMIT := 30.0; +LibCommon_Sync.PX_TSYNC_TIME_LIMIT := 10.0; +LibCommon_Sync.PX_TSHUT_DOWN_TIME_LIMIT := 10.0; NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false @@ -106,9 +106,9 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #AtsImsIot_TestControl.control # Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. -#NGAP_TestCases.TC_NGAP_AMF_PDU_01 +NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. -NGAP_TestCases.TC_NGAP_AMF_PDU_02 +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_03 # Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. diff --git a/titan-test-system-framework b/titan-test-system-framework index 0354bd8..121a695 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit 0354bd8fa2f1f85d39c35a8dc5e38416ab9db5cf +Subproject commit 121a69523b384a23c11e51396d644071aa15b60d diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 288fcca..7d46eab 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -266,26 +266,26 @@ module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NG log(">>> f_NGAP_amf_UE_SecurityMode"); if (PICS_OFFLINE_MODE) { f_await_security_mode_command_await_security_mode_complete(); + if (not isbound(vc_inner_message) or (lengthof(vc_inner_message) == 0)) { + log("f_NGAP_gnb_UE_SecurityMode: vc_inner_message is not bound or empty"); + setverdict(fail, "Security Mode Command message content is not available for verification"); + } else { + // TODO FSCOM To be enhanced with more detailed verification of the Security Mode Command message content + var NG_REGISTRATION_REQUEST v_inner_message; + var bitstring v_bs := oct2bit(vc_inner_message); + var integer v_result := decvalue(v_bs, v_inner_message); + if (v_result != 0) { + log("f_NGAP_gnb_UE_SecurityMode: Failed to decode Security Mode Command message content"); + setverdict(fail, "Failed to decode Security Mode Command message content"); + } else { + log("f_NGAP_gnb_UE_SecurityMode: v_inner_message: ", v_inner_message); + // FIXME FSCOM To be enhanced with verification of the inner message + } + } } else { // Await security mode and send response f_await_security_mode_command_send_security_mode_complete(); } - if (not isbound(vc_inner_message) or (lengthof(vc_inner_message) == 0)) { - log("f_NGAP_gnb_UE_SecurityMode: vc_inner_message is not bound or empty"); - setverdict(fail, "Security Mode Command message content is not available for verification"); - } else { - // TODO FSCOM To be enhanced with more detailed verification of the Security Mode Command message content - var NG_REGISTRATION_REQUEST v_inner_message; - var bitstring v_bs := oct2bit(vc_inner_message); - var integer v_result := decvalue(v_bs, v_inner_message); - if (v_result != 0) { - log("f_NGAP_gnb_UE_SecurityMode: Failed to decode Security Mode Command message content"); - setverdict(fail, "Failed to decode Security Mode Command message content"); - } else { - log("f_NGAP_gnb_UE_SecurityMode: v_inner_message: ", v_inner_message); - // FIXME FSCOM To be enhanced with verification of the inner message - } - } log("<<< f_NGAP_amf_UE_SecurityMode"); } // End of function f_NGAP_amf_UE_SecurityMode diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index bd7b12d..b84b8ba 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -263,7 +263,7 @@ module LibNGAP_Functions { m_ng_ue_security_capability )); // Save message in global variable for later use - vc_registration_request := vc_recvNgNasUl_Msg.registration_Request; + vc_registration_request := v_nas_message.registration_Request; // Send it log("f_send_registration_request: v_nas_message: ", v_nas_message); log(bit2oct(encvalue(valueof(v_nas_message)))) -- GitLab From 0a297dc04be2abdfd667c52dc0e7b16e6dbb5590 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 19 May 2026 10:10:34 +0200 Subject: [PATCH 112/151] Add Upper Tester for open5gs --- captures/TC_NGAP_AMF_PDU_01.pcap | Bin 4068 -> 4068 bytes ccsrc/Externals/upper_terster.cc | 56 +++++++++++++++++++++-- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 ++ scripts/run_all.bash | 2 + ttcn/AtsNGAP/NGAP_Steps.ttcn | 6 ++- ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn | 11 +++++ ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn | 4 +- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 3 ++ 8 files changed, 79 insertions(+), 7 deletions(-) diff --git a/captures/TC_NGAP_AMF_PDU_01.pcap b/captures/TC_NGAP_AMF_PDU_01.pcap index fc802c8f9defa2cd50aba38aab70f15ee434bfec..c5d873cc5251ef4bf533fb6d5d09bf3b8888bcdd 100644 GIT binary patch literal 4068 zcmca|c+)~A1{MYcU}0cnU|=xi;>k)`$HfrDzyQVwc?Jd!23IBq7X}6g28R|K^?C*d zmU;#T&h3W$GB8z)3=Ap@RsT$4U|hh!Aou@&TWgLc0}lfm11keV0|Nug0R{#ZkPSKO zxEPEW7{C~&7es??P=VUu4l*5N3%|^EL$Ij~3=C`x3@lb$JXsC}tPEKU3}6h>3BzC$ zVxT67)iW?K)-y1$u8*3=15?4sz+iJfm^T#cMy~(=+YY7FGO#jmfYgHM11lIsK{S^x z10%ZIK{m$~urdTOGJrA6Ob`vSnGqT~)_NdYK_*V)Ssw+qje&uIiGfjtVWO%j*k(Bf zE{DdN4hD8cjwMQewy8@ksGTmVCpWd~%kh~<5{f`3B4bn4i438xNFfcGMGNdu^f}|NiA`GC?Mbv@O zfq?ObiYTVGfM{83GtMKzy*rz_Pqkxdb^hL4E?ef^q&SkV8Oz z`q;_J(8j<3#vm~m2K%Xkfdyom^*3y$F)%ZPwH->S1IGbK8^41S0|P5VD5!j5P-Bn~ zuVZkmWZ-3-`I8+a4Z;F?OdmclR5I{8%>2nNWD+1`0G4EAh;m?*U?^|^l`kMy`A=qL zn8d&U#vpw#40ctES2oC1ADck_1Gx-Kyw!orMvyjUh9HN=noe+~#K2&~z~W#BNpM+$G`x_AZuV4?7{{HR*(y=--28RawV2n=tOd1K--~|dT_xGGDgqAhJk^F0o8?K zqIC@6x&l|i*bhsG+E~rapL@&J@_83Sr2~3cg2M0l6;_5S1_m$&841H+*X4NSfL!-+ zCdg$V7h(y&dL-9bJ2cjGF))Hd5EOpunBgZPT*rK7%J!)Ybqujg3``$BJTzlu0;krl zU#tw<7#P49<_ZuEcF76`HjqoKkAPeOat)Sn>Oyi!S=*tM1_qGzAS3h~k}$)`#=4Hh zdF!H3hB}70at6-Q<^;vY)WDA)3mKHKBu4>820i8vA3o?aF){`-GGGZ!NNk&kvN1ek zU;tx~)i4b9#SO1qkS{*!fP4V*36}6|K=Q>>hsK(221ZbFW3XZ1V`!KFDzuQJTZVxh zl;=TZ0JyeiC}-f5Vc>(>8poip`tQYAn|>~Jn=(H?y&|H)A@y*e>77IUtie)$moU$4 zV`flt;3#fLRBZkK|09E%gT7uJQ$@M;A;vleCq~9{2JTNYf3h<%I2>SLX9{5l)b zG%|o9jDdkcfscV7_f=s(($q9}zP|QIM0#jhqZZL3wOtYQ@G6`fNviljB8C=^Ar8F^s3N(-&JqJUO z(~%=dje(o1j_KvrEhUU~49-}S4k)GOwH-=nW&k%h85kJ!9HKDIF)^-Vs(5G^#ZbxEL6C8H5-cl^7XSIXN=(N>YpRQcJK}2=euA2TpLQ z1S*|CPKRNzuN%DbLB7UYb~eMpkb#*Yz@f3Ghk=oSnE_IE+JL--8VZ^kbxfD_&8(Q} z7($%+CouRk6fmSR|1+{Ne^FunqN2&l$fe7`q{PTr$-u^_;K<0xS)5Paw09V;1BuuuDL_JqAdLyPJuZA&h|mjA4EP(O`dhFmQuR zvylgx1Tqmhlo*&9G};cOv_e`;3=9lf3?k^MmfwNV1>|O50bX$F1}f!1ro%AUmJqKZ zkS!lqgKPlVgvHIRNO?uYp|Pfqff3Y4Ww2q;WDo$Aa77HDRvse*%tmW{)P=eU70OCw$22hy_YP@lR1Qax(Whzq32IR*n#=Hz>3=CilQU}9eKWZ@W Rf^D?LW+NM@UgBY30RSwepFjWr literal 4068 zcmca|c+)~A1{MYcU}0cnU|@K5@MWgNX%>bc1_m%j$TKi-Ft{=?xG*p{FgUc>sMj+v zu+%d!a9)?{Houw%G7%YHwB5|UrQPQ#Oe}EP{m<`T zu8@#p;9^j>nEjTC;j{tBKA1c*%`*)YvkVLkObjY4E!H6gbNBq8@$_!ui+!S&M?Ea> z-qj92u(!93t5M=h1F}ARY)V2Ao4K&m0SaM86&?mNMg}lORtpYc4F*O~`m^=~`4$w) zptuExDgy%p7sF_1fFoW(F&8zJggQ%Am%;z|0`cz{xQ4Cwl+`0|O&N8Urs#nh_+z04iNX z9T*)L7(i|})8b*UV_*PdkQx{UyWODjC&=bQ9w1vmwj;ZpnSnt7Y%}BhYam@9(=M3v zFqAPcfH6o6hQX#~RQ>{+#*fW324)5~a4v;tu~85O1u3Yc%uO?3 zNMPV#0C|Lo!GR&nf$={>00Rez5B3`EB zSRRH+3=Cil(g(v}SG83B2D$3sCy@U@F2fRURp7D_q>Y&&=8Tu1 zkd*bOlZT;?fdPy`*1#~>g$)d>AQxJ{1-TC7N-VLUf#kvf2K(%4aKR2TM$f^9fq{hq z)rDfBbqwLU0){?DKR2zZD0sf_hQq~Q>nAW&I-rLoDEwlk@-ToR282OI!Z6r%IhB7v zt~BEPIW{gbW z)cR!y55qPF1~7)X0z`vdvVwsPN}i&pRta?iIK6Kf&0_UpX^Kw4hI;R-9y+x zd69vEQIv_1QIUy}A&wE0^FXQS#$z6aBnAdBhT09Lz`hP)U zl^N`_YZ*Wh#=yX!z{kK3@)?%{69XedD42Y8@MUJ^2}oHDDzm{>K?$&p29^InHXd>Y z*#@!|OE}lUYy_FseS!f`tTAwaOtYQ@G6`fNviljB8C)6cv+Ec@1scc=dJcvlrz1y_ z8Ur_19n;x8YUzx149?h64mhReG1zCAbF{XMj1CsQ3mIwOOq z9wXzy|Nkd0)L>+&W?*k%;9_9lWe{R)RAOXQ<>biBD@iTNOD(}_A;{O2=OLvMsB{83 z9frYS*iiW&_k4 z=YXsh6auw2jNtYN_B77G35p*ZOOWqDp@5t!q4l>81LJ&OP?&*COR8kVQ_?eVflRah zgUvJsW(IEt`)p849b7*v$TFCNe21JTy&VJ@7#MjOm>+;l0N3=4*b*MdB{~yX@c63= z+}b|m0P+*aEaaF4`3vk4P;ZZcfdOP%=tLHVFa`!N2Kg0+!Rf?8 ziGi6xgTX$#5z=B}U|`T<5J6A1{0@vRAX~PrV*!_Lpi&NI1BeFO5>f?jnI4h`*#NQ$ zi<=vf@`}pa*%qL_9xFJnXfg(p__binary__file), { "-c", static_cast(p__config__file) }, opts); + if (p__config__file.lengthof() == 0) { + loggers::get_instance().log(">>> fx__ut__start__gnb: No config file provided, starting gNB without '-c' argument"); + gnb_proc.start(static_cast(p__binary__file), {}, opts); + } else { + gnb_proc.start(static_cast(p__binary__file), { "-c", static_cast(p__config__file) }, opts); + } } catch (const std::exception& e) { std::cerr << "fx__ut__start__gnb: Failed to start process: " << e.what() << std::endl; @@ -57,8 +63,13 @@ INTEGER fx__ut__start__ue(const CHARSTRING& p__binary__file, const CHARSTRING& p } }}; try { - ue_proc.start(static_cast(p__binary__file), { "-c", static_cast(p__config__file) }, opts); - } + if (p__config__file.lengthof() == 0) { + loggers::get_instance().log(">>> fx__ut__start__gnb: No config file provided, starting gNB without '-c' argument"); + ue_proc.start(static_cast(p__binary__file), {}, opts); + } else { + ue_proc.start(static_cast(p__binary__file), { "-c", static_cast(p__config__file) }, opts); + } + } catch (const std::exception& e) { std::cerr << "fx__ut__start__gnb: Failed to start process: " << e.what() << std::endl; return -1; @@ -73,4 +84,39 @@ INTEGER fx__ut__start__ue(const CHARSTRING& p__binary__file, const CHARSTRING& p return 0; } + INTEGER fx__ut__start__open5gs(const CHARSTRING& p__binary__file, const CHARSTRING& p__config__file) { + loggers::get_instance().log_msg(">>> fx__ut__start__open5gs: p__binary__file: ", p__binary__file); + loggers::get_instance().log_msg(">>> fx__ut__start__open5gs: p__config__file: ", p__config__file); + + async_process::Options opts = {false, "", [](std::string_view chunk, bool isStderr) { + if (isStderr) { + loggers::get_instance().warning("fx__ut__start__open5gs: '%s'", std::string(chunk).c_str()); + std::cerr << "OPEN5GS STDERR: " << chunk; + } else { + loggers::get_instance().log("fx__ut__start__open5gs: '%s'", std::string(chunk).c_str()); + std::cout << "OPEN5GS STDOUT: " << chunk; + } + }}; + try { + if (p__config__file.lengthof() == 0) { + loggers::get_instance().log(">>> fx__ut__start__gnb: No config file provided, starting gNB without '-c' argument"); + open5gs_proc.start(static_cast(p__binary__file), {}, opts); + } else { + open5gs_proc.start(static_cast(p__binary__file), { "-c", static_cast(p__config__file) }, opts); + } + } + catch (const std::exception& e) { + std::cerr << "fx__ut__start__open5gs: Failed to start process: " << e.what() << std::endl; + return -1; + } + + return 0; + } + + INTEGER fx__ut__terminate__open5gs() { + loggers::get_instance().log(">>> fx__ut__terminate__open5gs"); + open5gs_proc.terminate(); + return 0; + } + } // End of namespace NGAP__Steps diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index b7c537e..b5fea79 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -14,6 +14,7 @@ NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false LibNGAP_Pics.PICS_OFFLINE_MODE := false # true for offline mode with pcap files, false for online mode with SCTP server +LibNGAP_Pics.PICS_USE_OPEN5GS := false # true to start UERANSIM gNB and UE simulators, false to not start them LibNGAP_Pixits.PX_NAS_MCC := '999'H LibNGAP_Pixits.PX_NAS_MNC := '70'H @@ -55,6 +56,9 @@ Parameters.px_IMSI_Def := '39393937303030303030303 Parameters.px_IMEISV_Def := '73806121856151f1'H NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) +# Upper tester parameters for UERANSIM integration +LibNGAP_Pixits.PX_OPEN5GS_BINARY_FILE := "/home/yann/dev/open5gs/build/tests/app/5gc" + [LOGGING] # In this section you can specify the name of the log file and the classes of events # you want to log into the file or display on console (standard error). diff --git a/scripts/run_all.bash b/scripts/run_all.bash index f5fe449..315ff15 100755 --- a/scripts/run_all.bash +++ b/scripts/run_all.bash @@ -55,6 +55,8 @@ do fi done +stty sane + exit 0 diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 7d46eab..79696cf 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -801,7 +801,7 @@ module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NG }//end group BehaviorFunctions - group ut_functions { + group ut_functions { // TODO FSCOM To be enhanced with only one external function for starting and one for terminating the test system external function fx_ut_start_gnb(in charstring p_binary_file, in charstring p_config_file) return integer; @@ -811,6 +811,10 @@ module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NG external function fx_ut_terminate_ue() return integer; + external function fx_ut_start_open5gs(in charstring p_binary_file, in charstring p_config_file) return integer; + + external function fx_ut_terminate_open5gs() return integer; + } // End of group ut_functions } // End of module NGAP_Steps diff --git a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn index 0a17cc8..2c98043 100644 --- a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn @@ -17,9 +17,12 @@ module NGAP_TestConfiguration { // LibNGAP import from LibNGAP_Interface all; + import from LibNGAP_Pics all; + import from LibNGAP_Pixits all; // AtsNGAP import from NGAP_TestSystem all; + import from NGAP_Steps all; group cfUp { @@ -33,6 +36,10 @@ module NGAP_TestConfiguration { //Variables var FncRetCode v_ret := e_success; + if (PICS_USE_OPEN5GS) { + fx_ut_start_open5gs(PX_OPEN5GS_BINARY_FILE, PX_OPEN5GS_CONFIG_FILE); + } + //Create p_NGAPComponent_amf := aMFNGAPComponent.create ; @@ -112,6 +119,10 @@ module NGAP_TestConfiguration { * @param */ function f_cf_Down() runs on NGNASComponent system TestAdapter { + if (PICS_USE_OPEN5GS) { + fx_ut_terminate_open5gs(); + } + // Deactivate all deactivate; // Unmap all diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn index 5645643..e3a119a 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pics.ttcn @@ -1,7 +1,9 @@ module LibNGAP_Pics { - modulepar boolean PICS_OFFLINE_MODE := false; // If true, the test system runs in offline mode (no SUT connection) + modulepar boolean PICS_OFFLINE_MODE := false; // If true, the test system runs in offline mode (no SUT connection) modulepar boolean PICS_USE_UERANSIMU := false; // If true, the test system uses UERANSIMU as SUT (instead of a real gNB) + modulepar boolean PICS_USE_OPEN5GS := false; // If true, the test system starts Open5GS as 5GC for UERANSIMU + } // End of module LibNGAP_Pics diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 5064a75..30788aa 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -673,5 +673,8 @@ module LibNGAP_Pixits { modulepar charstring PX_UE_BINARY_FILE := "/home/yann/dev/UERANSIM/build/nr-ue"; modulepar charstring PX_UE_CONFIG_FILE := "config/open5gs-ue.yaml"; + modulepar charstring PX_OPEN5GS_BINARY_FILE := "/home/yann/dev/open5gs/build/tests/app/5gc"; + modulepar charstring PX_OPEN5GS_CONFIG_FILE := ""; + } // End of module LibNGAP_Pixits -- GitLab From ad2c1a0c15750e455cf6591f468698af10887ec4 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 19 May 2026 08:32:04 +0000 Subject: [PATCH 113/151] event added: SECURITY_MODE_COMMAND --- test_purposes/Ngnas_Common.tplan2 | 41 ++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/test_purposes/Ngnas_Common.tplan2 b/test_purposes/Ngnas_Common.tplan2 index f4bfc4b..63f8e5f 100644 --- a/test_purposes/Ngnas_Common.tplan2 +++ b/test_purposes/Ngnas_Common.tplan2 @@ -144,25 +144,36 @@ Package Ngnas_Common { - indicateUEderegistration ; event templates: - /* This template can be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSPORT message. */ + /* This template can be used as default AUTHENTICATION_REQUEST message within a DOWNLINK NAS TRANSPORT message. */ - AUTHENTICATION_REQUEST { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111" - ;, - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN - ; - ; + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing + nas_key_set_identifier set to "111";, + ABBA containing + ABBA_contents set to '0000'H;, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; to the GNB entity } + /* This template can be used as default SECURITY_MODE_COMMAND message within a DOWNLINK NAS TRANSPORT message. */ + - SECURITY_MODE_COMMAND { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // SECURITY_MODE_COMMAND + NAS_PDU containing + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + message_type set to SECURITY_MODE_COMMAND, + selected_NAS_security_algorithms containing + type_of_ciphering_algorithm set to PX_SELECTED_NAS_CIPHERING_ALGORITHM, + type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM;, + ngKSI containing + nas_key_set_identifier set to "111";, + replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES;; // UE security capability 9.11.3.54 + to the GNB entity + } ; } // End of Domain section -- GitLab From 49accb4b8eeb5e3af9206b99382c44a421673adf Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 19 May 2026 08:39:08 +0000 Subject: [PATCH 114/151] tplan2 syntax error resolution --- test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 index 5d02732..811625d 100644 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 @@ -452,6 +452,7 @@ Package TP_AMF { Expected behaviour ensure that { when { + (.) at time point start_SMC_event : event SECURITY_MODE_COMMAND occurs and the IUT entity receives a UPLINK_NAS_TRANSPORT containing NAS_PDU containing extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, @@ -1308,7 +1309,7 @@ Package TP_AMF { AMF_Region_ID set to PX_AMF_REGION_ID, AMF_Set_ID set to PX_AMF_SET_ID, AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;; + 5G_TMSI set to RV_5G_TMSI;;; to the GNB entity } } -- GitLab From eb8b8beb12bcc249a07b58a27489394ccb0a92bb Mon Sep 17 00:00:00 2001 From: juvancic Date: Tue, 19 May 2026 14:21:20 +0200 Subject: [PATCH 115/151] Used value of GTP_TRANPORT_ADDRESS PIXIT intead of fixed encoded value --- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index b84b8ba..5b3693a 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1490,7 +1490,8 @@ module LibNGAP_Functions { "f_send_pdu_session_resource_setup_response:encvalue v_pDUSessionResourceSetupResponseTransfer: ", v_os ); - v_os := '0003E07F000001000000010001'O; // So, force with the correct encoded value + //v_os := '0003E07F000001000000010001'O; // So, force with the correct encoded value + v_os := '0003E0'O & bit2oct(PX_TRANSPORT_LAYER_ADDRESS) & '000000010001'O; // So, force with the correct encoded value vc_pdu_session_resource_setup_list_su_res := { valueof( m_pDUSessionResourceSetupItemSURes( -- GitLab From bd20db0b1447fbb7e96843cf351e9094a69f6997 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 19 May 2026 16:03:19 +0200 Subject: [PATCH 116/151] Editorial changes --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 2 +- titan-test-system-framework | 2 +- ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index b5fea79..339d37a 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -14,7 +14,7 @@ NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false LibNGAP_Pics.PICS_OFFLINE_MODE := false # true for offline mode with pcap files, false for online mode with SCTP server -LibNGAP_Pics.PICS_USE_OPEN5GS := false # true to start UERANSIM gNB and UE simulators, false to not start them +LibNGAP_Pics.PICS_USE_OPEN5GS := false # true to start open5gs, false to not start them LibNGAP_Pixits.PX_NAS_MCC := '999'H LibNGAP_Pixits.PX_NAS_MNC := '70'H diff --git a/titan-test-system-framework b/titan-test-system-framework index 121a695..17ff081 160000 --- a/titan-test-system-framework +++ b/titan-test-system-framework @@ -1 +1 @@ -Subproject commit 121a69523b384a23c11e51396d644071aa15b60d +Subproject commit 17ff081971dc4044c8c03f669816c3d81e7c8bd2 diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 5b3693a..6373a5f 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1483,7 +1483,7 @@ module LibNGAP_Functions { "f_send_pdu_session_resource_setup_response:v_pDUSessionResourceSetupResponseTransfer: ", v_pDUSessionResourceSetupResponseTransfer ); - // TITAN issue workaround bit2oct(encvalue(v_pDUSessionResourceSetupResponseTransfer, "PER:ALIGNED", "PER:ALIGNED")); + // FIXME TITAN issue workaround bit2oct(encvalue(v_pDUSessionResourceSetupResponseTransfer, "PER:ALIGNED", "PER:ALIGNED")); // I cannot reproduce the issue with a simpler structure, but it seems that encoding v_pDUSessionResourceSetupResponseTransfer with PER aligned is not working in TITAN. The workaround is to directly use the expected encoded value (which is also the one generated by asn1c and Wireshark) instead of encoding the structure in TTCN3. var octetstring v_os := bit2oct(encvalue(v_pDUSessionResourceSetupResponseTransfer)); log( -- GitLab From 4eea0e394c7cc77eb074e9290e3c7882c19f95ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Tue, 19 May 2026 16:24:28 +0200 Subject: [PATCH 117/151] initial commit of the TDL-TO Test Purposes --- test_purposes/NGAP_Common.tdltx | 326 ++++++++ test_purposes/NGNAS_Common.tdltx | 191 +++++ test_purposes/TDL.tdltx | 62 ++ test_purposes/TP_AMF_NGAP.tdltx | 1234 ++++++++++++++++++++++++++++ test_purposes/TP_AMF_NGNAS.tdltx | 1281 ++++++++++++++++++++++++++++++ test_purposes/TP_GNB_NGAP.tdltx | 524 ++++++++++++ 6 files changed, 3618 insertions(+) create mode 100644 test_purposes/NGAP_Common.tdltx create mode 100644 test_purposes/NGNAS_Common.tdltx create mode 100644 test_purposes/TDL.tdltx create mode 100644 test_purposes/TP_AMF_NGAP.tdltx create mode 100644 test_purposes/TP_AMF_NGNAS.tdltx create mode 100644 test_purposes/TP_GNB_NGAP.tdltx diff --git a/test_purposes/NGAP_Common.tdltx b/test_purposes/NGAP_Common.tdltx new file mode 100644 index 0000000..4743778 --- /dev/null +++ b/test_purposes/NGAP_Common.tdltx @@ -0,0 +1,326 @@ +Package NGAP_Common { + + Import all from TDL + + // Configurations + + Entity UE + Entity GNB + Entity AMF + Entity IUT + + Type NgapMessage + Message Gate Ngap_Port accepts NgapMessage + + Component node { + gate Ngap_Port g + } + + Configuration CF_AMF_N2 { + node GNB as Tester, + node IUT as SUT, + connect GNB::g to IUT::g + } + + Configuration CF_GNB_N2 { + node AMF as Tester, + node IUT as SUT, + connect AMF::g to IUT::g + } + + // Common events + Event send + Event sends + Event receives + Event accepts + Event aborts + + //TP_AMF NGAP events + Event isInCM_CONNECTED + Event hasActiveUeNgapContext + Event hasNoPduSessionResourceEstablishedForTheConcernedPduSessionId + Event hasSentPDU_SESSION_RESOURCE_SETUP_REQUEST + Event hasEstablishedPduSessionResourceForTheConcernedPduSessionId + Event hasSentPDU_SESSION_RESOURCE_RELEASE_COMMAND + Event isNotRegisteredToAMF + Event hasEstablishedInitialContext + Event hasEstablished_NG_C_AssociationToAMF + Event hasNotEstablished_NG_C_AssociationToAMF + Event hasEstablishedTNL_AssociationToAMF + Event isRegisteredToAMF + Event initiatesPduSessionResourceModificationToAddQoSFlow + Event processTheUENasDeregistration + + + //TP_GNB NGAP events + Event isRegisteredToAMF + Event havingSentPDUSessionEstablishment + Event hasEstablishedPDUsession + Event hasEstablished_NG_C_AssociationToAMF + Event u_Plane_inactivity_timer_expires + Event hasSuccessfullyEstablishedTNLconnection + + + // NGAP messages + //Table 8.1-1 + NgapMessage AMF_CONFIGURATION_UPDATE + NgapMessage AMF_CONFIGURATION_UPDATE_ACKNOWLEDGE + NgapMessage AMF_CONFIGURATION_UPDATE_FAILURE + NgapMessage RAN_CONFIGURATION_UPDATE + NgapMessage RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE + NgapMessage RAN_CONFIGURATION_UPDATE_FAILURE + NgapMessage HANDOVER_CANCEL + NgapMessage HANDOVER_CANCEL_ACKNOWLEDGE + NgapMessage HANDOVER_REQUIRED + NgapMessage HANDOVER_COMMAND + NgapMessage HANDOVER_PREPARATION_FAILURE + NgapMessage HANDOVER_REQUEST + NgapMessage HANDOVER_REQUEST_ACKNOWLEDGE + NgapMessage HANDOVER_FAILURE + NgapMessage INITIAL_CONTEXT_SETUP_REQUEST + NgapMessage INITIAL_CONTEXT_SETUP_RESPONSE + NgapMessage INITIAL_CONTEXT_SETUP_FAILURE + NgapMessage NG_RESET + NgapMessage NG_RESET_ACKNOWLEDGE + NgapMessage NG_SETUP_REQUEST + NgapMessage NG_SETUP_RESPONSE + NgapMessage NG_SETUP_FAILURE + NgapMessage PATH_SWITCH_REQUEST + NgapMessage PATH_SWITCH_REQUEST_ACKNOWLEDGE + NgapMessage PATH_SWITCH_REQUEST_FAILURE + NgapMessage PDU_SESSION_RESOURCE_MODIFY_REQUEST + NgapMessage PDU_SESSION_RESOURCE_MODIFY_RESPONSE + NgapMessage PDU_SESSION_RESOURCE_MODIFY_INDICATION + NgapMessage PDU_SESSION_RESOURCE_MODIFY_CONFIRM + NgapMessage PDU_SESSION_RESOURCE_RELEASE_COMMAND + NgapMessage PDU_SESSION_RESOURCE_RELEASE_RESPONSE + NgapMessage PDU_SESSION_RESOURCE_SETUP_REQUEST + NgapMessage PDU_SESSION_RESOURCE_SETUP_RESPONSE + NgapMessage UE_CONTEXT_MODIFICATION_REQUEST + NgapMessage UE_CONTEXT_MODIFICATION_RESPONSE + NgapMessage UE_CONTEXT_MODIFICATION_FAILURE + NgapMessage UE_CONTEXT_RELEASE_COMMAND + NgapMessage UE_CONTEXT_RELEASE_COMPLETE + NgapMessage WRITE_REPLACE_WARNING_REQUEST + NgapMessage WRITE_REPLACE_WARNING_RESPONSE + NgapMessage PWS_CANCEL_REQUEST + NgapMessage PWS_CANCEL_RESPONSE + NgapMessage UE_RADIO_CAPABILITY_CHECK_REQUEST + NgapMessage UE_RADIO_CAPABILITY_CHECK_RESPONSE + NgapMessage UE_CONTEXT_SUSPEND_REQUEST + NgapMessage UE_CONTEXT_SUSPEND_RESPONSE + NgapMessage UE_CONTEXT_SUSPEND_FAILURE + NgapMessage UE_CONTEXT_RESUME_REQUEST + NgapMessage UE_CONTEXT_RESUME_RESPONSE + NgapMessage UE_CONTEXT_RESUME_FAILURE + NgapMessage UE_RADIO_CAPABILITY_ID_MAPPING_REQUEST + NgapMessage UE_RADIO_CAPABILITY_ID_MAPPING_RESPONSE + + //Table 8.1-2 + NgapMessage DOWNLINK_RAN_CONFIGURATION_TRANSFER + NgapMessage DOWNLINK_RAN_STATUS_TRANSFER + NgapMessage DOWNLINK_NAS_TRANSPORT + NgapMessage ERROR_INDICATION + NgapMessage UPLINK_RAN_CONFIGURATION_TRANSFER + NgapMessage UPLINK_RAN_STATUS_TRANSFER + NgapMessage HANDOVER_NOTIFY + NgapMessage INITIAL_UE_MESSAGE + NgapMessage NAS_NON_DELIVERY_INDICATION + NgapMessage PAGING + NgapMessage PDU_SESSION_RESOURCE_NOTIFY + NgapMessage REROUTE_NAS_REQUEST + NgapMessage UE_CONTEXT_RELEASE_REQUEST + NgapMessage UPLINK_NAS_TRANSPORT + NgapMessage AMF_STATUS_INDICATION + NgapMessage PWS_RESTART_INDICATION + NgapMessage PWS_FAILURE_INDICATION + NgapMessage DOWNLINK_UE_ASSOCIATED_NRPPA_TRANSPORT + NgapMessage UPLINK_UE_ASSOCIATED_NRPPA_TRANSPORT + NgapMessage DOWNLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT + NgapMessage UPLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT + NgapMessage TRACE_START + NgapMessage TRACE_FAILURE_INDICATION + NgapMessage DEACTIVATE_TRACE + NgapMessage CELL_TRAFFIC_TRACE + NgapMessage LOCATION_REPORTING_CONTROL + NgapMessage LOCATION_REPORTING_FAILURE_INDICATION + NgapMessage LOCATION_REPORT + NgapMessage UE_TNLA_BINDING_RELEASE_REQUEST + NgapMessage UE_RADIO_CAPABILITY_INFO_INDICATION + NgapMessage RRC_INACTIVE_TRANSITION_REPORT + NgapMessage OVERLOAD_START + NgapMessage OVERLOAD_STOP + NgapMessage SECONDARY_RAT_DATA_USAGE_REPORT + NgapMessage UPLINK_RIM_INFORMATION_TRANSFER + NgapMessage DOWNLINK_RIM_INFORMATION_TRANSFER + NgapMessage RETRIEVE_UE_INFORMATION + NgapMessage UE_INFORMATION_TRANSFER + NgapMessage RAN_CP_RELOCATION_INDICATION + NgapMessage CONNECTION_ESTABLISHMENT_INDICATION + NgapMessage AMF_CP_RELOCATION_INDICATION + NgapMessage HANDOVER_SUCCESS + NgapMessage UPLINK_RAN_EARLY_STATUS_TRANSFER + NgapMessage DOWNLINK_RAN_EARLY_STATUS_TRANSFER + + NgapMessage SECURITY_MODE_COMPLETE + NgapMessage SECURITY_MODE_REJECT + + // PICS + PICS PICS_A2_1 //NG RAN + PICS PICS_A2_1_1 //gNB + PICS PICS_A2_1_2 //ng-eNB + PICS PICS_A2_2 //AMF + PICS PICS_A3_1_1 //gNB - PDU session management procedure - PDU SESSION RESOURCE SETUP REQUEST + PICS PICS_A3_1_2 //gNB - PDU session management procedure - PDU SESSION RESOURCE RELEASE COMMAND + PICS PICS_A3_1_3 //gNB - PDU session management procedure - PDU SESSION RESOURCE MODIFY REQUEST + PICS PICS_A3_1_4 //gNB - PDU session management procedure - PDU SESSION RESOURCE MODIFY NOTIFY + PICS PICS_A3_1_5 //gNB - PDU session management procedure - PDU SESSION RESOURCE MODIFY INDICATION + PICS PICS_A3_2_1 //gnB - UE Context Management Procedures - INITIAL CONTEXT SETUP REQUEST + PICS PICS_A3_2_2 //gnB - UE Context Management Procedures - UE CONTEXT RELEASE REQUEST + PICS PICS_A3_2_3 //gnB - UE Context Management Procedures - UE CONTEXT RELEASE COMMAND + PICS PICS_A3_2_4 //gnB - UE Context Management Procedures - UE CONTEXT MODIFICATION REQUEST + PICS PICS_A3_2_5 //gnB - UE Context Management Procedures - RRC INACTIVE TRANSITION REPORT + PICS PICS_A3_2_8 //gnB - UE Context Management Procedures - RAN CP Relocation Indication + PICS PICS_A3_2_11 //gnB - UE Context Management Procedures - UE CONTEXT SUSPEND REQUEST + PICS PICS_A3_2_12 //gnB - UE Context Management Procedures - UE CONTEXT RESUME REQUEST + PICS PICS_A3_3_1 //gnB - UE Mobility Management Procedures - HANDOVER REQUIRED + PICS PICS_A3_3_2 //gnB - UE Mobility Management Procedures - HANDOVER REQUEST + PICS PICS_A3_3_3 //gnB - UE Mobility Management Procedures - HANDOVER NOTIFY + PICS PICS_A3_3_4 //gnB - UE Mobility Management Procedures - PATH SWITCH REQUEST + PICS PICS_A3_3_5 //gnB - UE Mobility Management Procedures - HANDOVER CANCEL + PICS PICS_A3_3_6 //gnB - UE Mobility Management Procedures - UPLINK RAN STATUS TRANSFER + PICS PICS_A3_3_8 //gnB - UE Mobility Management Procedures - HANDOVER SUCCESS + PICS PICS_A3_3_9 //gnB - UE Mobility Management Procedures - UPLINK RAN EARLY STATUS TRANSFER + PICS PICS_A3_5_1 //gNB - Transport of NAS Messages Procedures - INITIAL UE MESSAGE + PICS PICS_A3_5_3 //gNB - Transport of NAS Messages Procedures - UPLINK NAS TRANSPORT + PICS PICS_A3_5_4 //gNB - Transport of NAS Messages Procedures - NAS NON DELIVERY INDICATION + PICS PICS_A3_6_1 //gNB - Interface Management Procedures - NG SETUP REQUEST + PICS PICS_A3_6_2 //gNB - Interface Management Procedures - RAN CONFIGURATION UPDATE + PICS PICS_A3_6_3 //gNB - Interface Management Procedures - AMF CONFIGURATION UPDATE + PICS PICS_A3_6_4 //gNB - Interface Management Procedures - NG RESET + PICS PICS_A3_6_5 //gNB - Interface Management Procedures - ERROR INDICATION + PICS PICS_A3_7_1 //gNB - Configuration Transfer Procedures - UPLINK RAN CONFIGURATION TRANSFER + PICS PICS_A3_8_1 //gNB - Warning Message Transmission procedure - WRITE-REPLACE WARNING REQUEST + PICS PICS_A3_8_2 //gNB - Warning Message Transmission procedure - PWS CANCEL REQUEST + PICS PICS_A3_8_3 //gNB - Warning Message Transmission procedure - PWS RESTART INDICATION + PICS PICS_A3_8_4 //gNB - Warning Message Transmission procedure - PWS FAILURE INDICATION + PICS PICS_A3_9_1 //gNB - NRPPa Transport procedure - DOWNLINK UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A3_9_2 //gNB - NRPPa Transport procedure - UPLINK UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A3_9_3 //gNB - NRPPa Transport procedure - DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A3_9_4 //gNB - NRPPa Transport procedure - UPLINK NON UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A3_10_1 //gNB - Trace procedure - TRACE START messages + PICS PICS_A3_10_2 //gNB - Trace procedure - TRACE FAILURE INDICATION messages + PICS PICS_A3_10_3 //gNB - Trace procedure - DEACTIVATE TRACE messages + PICS PICS_A3_10_4 //gNB - Trace procedure - CELL TRAFFIC TRACE messages + PICS PICS_A3_11_1 //gNB - Location Reporting Procedures - LOCATION REPORTING CONTROL + PICS PICS_A3_11_2 //gNB - Location Reporting Procedures - LOCATION REPORTING FAILURE INDICATION + PICS PICS_A3_11_3 //gNB - Location Reporting Procedures - LOCATION REPORT + PICS PICS_A3_12_1 //gNB - TNLA procedure - UE TNLA BINDING RELEASE REQUEST messages + PICS PICS_A3_13_1 //gNB - UE Radio Capability Management procedure - UE RADIO CAPABILITY INFO INDICATION messages + PICS PICS_A3_13_2 //gNB - UE Radio Capability Management procedure - UE RADIO CAPABILITY CHECK REQUEST messages + PICS PICS_A3_13_3 //gNB - UE Radio Capability Management procedure - UE RADIO CAPABILITY ID MAPPING REQUEST messages + PICS PICS_A3_14_1 //gNB - Data Usage Reporting Procedures - SECONDARY RAT DATA USAGE REPORT + PICS PICS_A3_15_1 //gNB - RIM information Transfer procedure - UPLINK RIM INFORMATION TRANSFER + PICS PICS_A3_15_2 //gNB - RIM information Transfer procedure - DOWNLINK RIM INFORMATION TRANSFER + PICS PICS_A4_1_1 //AMF - PDU session management procedure - PDU SESSION RESOURCE SETUP REQUEST + PICS PICS_A4_1_2 //AMF - PDU session management procedure - PDU SESSION RESOURCE RELEASE COMMAND + PICS PICS_A4_1_3 //AMF - PDU session management procedure - PDU SESSION RESOURCE MODIFY REQUEST + PICS PICS_A4_1_4 //AMF - PDU session management procedure - PDU SESSION RESOURCE MODIFY NOTIFY + PICS PICS_A4_1_5 //AMF - PDU session management procedure - PDU SESSION RESOURCE MODIFY INDICATION + PICS PICS_A4_2_1 //AMF - UE Context Management Procedures - INITIAL CONTEXT SETUP REQUEST + PICS PICS_A4_2_3 //AMF - UE Context Management Procedures - UE CONTEXT RELEASE COMMAND + PICS PICS_A4_2_4 //AMF - UE Context Management Procedures - UE CONTEXT MODIFICATION REQUEST + PICS PICS_A4_2_6 //AMF - UE Context Management Procedures - CONNECTION ESTABLISHMENT INDICATION + PICS PICS_A4_2_7 //AMF - UE Context Management Procedures - AMF CP RELOCATION INDICATION + PICS PICS_A4_2_9 //AMF - UE Context Management Procedures - RETRIEVE UE INFORMATION + PICS PICS_A4_2_10 //AMF - UE Context Management Procedures - UE INFORMATION TRANSFER + PICS PICS_A4_2_11 //AMF - UE Context Management Procedures - UE CONTEXT SUSPEND REQUEST + PICS PICS_A4_2_12 //AMF - UE Context Management Procedures - UE CONTEXT RESUME REQUEST + PICS PICS_A4_3_1 //AMF - UE Mobility Management Procedures - HANDOVER REQUIRED + PICS PICS_A4_3_2 //AMF - UE Mobility Management Procedures - HANDOVER REQUEST + PICS PICS_A4_3_4 //AMF - UE Mobility Management Procedures - PATH SWITCH REQUESTS + PICS PICS_A4_3_5 //AMF - UE Mobility Management Procedures - HANDOVER CANCEL + PICS PICS_A4_3_6 //AMF - UE Mobility Management Procedures - UPLINK RAN STATUS TRANSFER + PICS PICS_A4_3_9 //AMF - UE Mobility Management Procedures - UPLINK RAN EARLY STATUS TRANSFER + PICS PICS_A4_4_1 //AMF - Paging procedures - Paging + PICS PICS_A4_5_2 //AMF - Transport of NAS Messages Procedures - DOWNLINK NAS TRANSPORT + PICS PICS_A4_5_5 //AMF - Transport of NAS Messages Procedures - REROUTE NAS REQUEST + PICS PICS_A4_6_1 //AMF - Interface Management Procedures - NG SETUP REQUEST + PICS PICS_A4_6_1_1 //AMF - Rejection of an unacceptable NG SETUP REQUEST message with an NG SETUP FAILURE message + PICS PICS_A4_6_1_2 //AMF - IAB + PICS PICS_A4_6_2 //AMF - Interface Management Procedures - RAN CONFIGURATION UPDATE + PICS PICS_A4_6_3 //AMF - Interface Management Procedures - AMF CONFIGURATION UPDATE + PICS PICS_A4_6_4 //AMF - Interface Management Procedures - NG RESET + PICS PICS_A4_6_5 //AMF - Interface Management Procedures - ERROR INDICATION + PICS PICS_A4_6_6 //AMF - Interface Management Procedures - AMF STATUS INDICATION + PICS PICS_A4_6_7 //AMF - Interface Management Procedures - OVERLOAD START + PICS PICS_A4_6_8 //AMF - Interface Management Procedures - OVERLOAD STOP + PICS PICS_A4_7_2 //AMF - Configuration Transfer Procedures - DOWNLINK RAN CONFIGURATION TRANSFER + PICS PICS_A4_8_1 //AMF - Warning Message Transmission procedure - WRITE-REPLACE WARNING REQUEST + PICS PICS_A4_8_2 //AMF - Warning Message Transmission procedure - PWS CANCEL REQUEST + PICS PICS_A4_8_3 //AMF - Warning Message Transmission procedure - PWS RESTART INDICATION + PICS PICS_A4_8_4 //AMF - Warning Message Transmission procedure - PWS FAILURE INDICATION + PICS PICS_A4_9_1 //AMF - NRPPa Transport procedure - DOWNLINK UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A4_9_2 //AMF - NRPPa Transport procedure - UPLINK UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A4_9_3 //AMF - NRPPa Transport procedure - DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A4_9_4 //AMF - NRPPa Transport procedure - UPLINK NON UE ASSOCIATED NRPPA TRANSPORT messages + PICS PICS_A4_10_1 //AMF - Trace procedure - TRACE START messages + PICS PICS_A4_10_2 //AMF - Trace procedure - TRACE FAILURE INDICATION messages + PICS PICS_A4_10_3 //AMF - Trace procedure - DEACTIVATE TRACE messages + PICS PICS_A4_10_4 //AMF - Trace procedure - CELL TRAFFIC TRACE messages + PICS PICS_A4_11_1 //AMF - Location Reporting Procedures - LOCATION REPORTING CONTROL + PICS PICS_A4_11_2 //AMF - Location Reporting Procedures - LOCATION REPORTING FAILURE INDICATION + PICS PICS_A4_11_3 //AMF - Location Reporting Procedures - LOCATION REPORT + PICS PICS_A4_12_1 //AMF - TNLA procedure - UE TNLA BINDING RELEASE REQUEST messages + PICS PICS_A4_13_1 //AMF - UE Radio Capability Management procedure - UE RADIO CAPABILITY INFO INDICATION messages + PICS PICS_A4_13_2 //AMF - UE Radio Capability Management procedure - UE RADIO CAPABILITY CHECK REQUEST messages + PICS PICS_A4_13_3 //AMF - UE Radio Capability Management procedure - UE RADIO CAPABILITY ID MAPPING REQUEST messages + PICS PICS_A4_14_1 //AMF - Data Usage Reporting Procedures - SECONDARY RAT DATA USAGE REPORT + PICS PICS_A4_15_1 //AMF - RIM information Transfer procedure - UPLINK RIM INFORMATION TRANSFER + PICS PICS_A4_15_2 //AMF - RIM information Transfer procedure - DOWNLINK RIM INFORMATION TRANSFER + + + //PIXIT + PIXIT NgapMessage PX_RAN_UE_NGAP_ID + PIXIT NgapMessage PX_PDU_SessionId + PIXIT NgapMessage PX_PLMN_Identity + PIXIT NgapMessage PX_TAC + PIXIT NgapMessage PX_SST + PIXIT NgapMessage PX_SD + PIXIT NgapMessage PX_QFI + PIXIT NgapMessage PX_5QI + PIXIT NgapMessage PX_Cause + PIXIT NgapMessage PX_2nd_5QI + PIXIT NgapMessage PX_N3_GNB_IP_ADDRESS + PIXIT NgapMessage PX_N3_AMF_IP_ADDRESS + PIXIT NgapMessage PX_QFI_Wrong + PIXIT NgapMessage PX_AMF_Region_ID + PIXIT NgapMessage PX_AMF_Set_ID + PIXIT NgapMessage PX_AMF_Pointer_ID + PIXIT NgapMessage PX_SST_Allowed + PIXIT NgapMessage PX_SD_Allowed + PIXIT NgapMessage PX_NR_Encryption_Algorithms + PIXIT NgapMessage PX_NR_Integrity_Protection_Algorithms + PIXIT NgapMessage PX_E_UTRA_Encryption_Algorithms + PIXIT NgapMessage PX_E_UTRA_Integrity_Protection_Algorithms + PIXIT NgapMessage PX_VA_Cause + PIXIT NgapMessage PX_gNB_ID + PIXIT NgapMessage PX_AMF_Name + PIXIT NgapMessage PX_NOTSUPPORTED_PLMN_Identity + PIXIT NgapMessage PX_RAN_NODE_NAME + PIXIT NgapMessage PX_NID + PIXIT NgapMessage PX_SST_EXTENDED + PIXIT NgapMessage PX_SD_EXTENDED + PIXIT NgapMessage PX_RAN_NODE_NAME_VISIBLE + PIXIT NgapMessage PX_RAN_Node_Name + PIXIT NgapMessage PX_Extended_RAN_Node_Name + PIXIT NgapMessage PX_SST_NEW + PIXIT NgapMessage PX_SD_NEW + PIXIT NgapMessage PX_SST_UNSUPPORTED + PIXIT NgapMessage PX_CAUSE + PIXIT NgapMessage PX_AMF_UE_NGAP_ID + PIXIT NgapMessage PX_N3_ENDPOINT_IP_ADDRESS + PIXIT NgapMessage PX_GTP_TEID + PIXIT NgapMessage PX_GNB_DEF_DRX + +} \ No newline at end of file diff --git a/test_purposes/NGNAS_Common.tdltx b/test_purposes/NGNAS_Common.tdltx new file mode 100644 index 0000000..9874408 --- /dev/null +++ b/test_purposes/NGNAS_Common.tdltx @@ -0,0 +1,191 @@ +Package NGNAS_Common { + + Import all from TDL + Import all from NGAP_Common + + // Configurations + Configuration CF_AMF_N2N1 { + node GNB as Tester, + node IUT as SUT, + connect GNB::g to IUT::g + } + + //TP AMF NGNAS events + Event isInOverloadedState + Event indicateUEdeactivation + Event indicateUEderegistration + + + // This template may be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSPORT message. */ + Template AUTHENTICATION_REQUEST { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + spare_half_octet, + authentication_request_message_identity set to AUTHENTICATION_REQUEST, + ngKSI containing { + nas_key_set_identifier set to "111" + }, + spare_half_octet, + ABBA, + Authentication_parameter_RAND, + Authentication_parameter_AUTN + } + } + to the GNB entity + } + + // This template may be used as default SECURITY_MODE_COMMAND message within a DOWNLINK NAS TRANSPORT message. + Template SECURITY_MODE_COMMAND { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { // SECURITY_MODE_COMMAND + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + message_type set to SECURITY_MODE_COMMAND, + selected_NAS_security_algorithms containing { + type_of_ciphering_algorithm set to PX_SELECTED_NAS_CIPHERING_ALGORITHM, + type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM }, + ngKSI containing { + nas_key_set_identifier set to "111" }, + replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES}} // UE security capability 9.11.3.54 + to the GNB entity + } + + + //Table 8.2 + NgapMessage AUTHENTICATION_RESPONSE + + // Table 9.3.1: Security header type + Bitstring PLAIN_5GS_NAS_MESSAGE // 0 0 0 0 , not security protected + Bitstring INTEGRITY_PROTECTED // 0 0 0 1 + Bitstring INTEGRITY_PROTECTED_AND_CIPHERED // 0 0 1 0 + Bitstring INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT // 0 0 1 1 + Bitstring INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_5G_NAS_SECURITY_CONTEXT // 0 1 0 0 + + // PICS + PICS PICS_A2_1 //AMF + PICS PICS_A3_1 //5GMM-DEREGISTERED + PICS PICS_A3_2 //5GMM-COMMON-PROCEDURE-INITIATED + PICS PICS_A3_3 //5GMM-REGISTERED + PICS PICS_A3_4 //5GMM-DEREGISTERED-INITIATED + PICS PICS_A3_5 //5GSM-PDU SESSION INACTIVE + PICS PICS_A3_6 //5GSM-PDU SESSION ACTIVE + PICS PICS_A3_7 //5GSM-PDU SESSION INACTIVE PENDING + PICS PICS_A3_8 //5GSM-PDU SESSION MODIFICATION PENDING + PICS PICS_A3_9 //5GSM-PROCEDURE TRANSACTION INACTIVE + PICS PICS_A3_10 //5GSM-PROCEDURE TRANSACTION PENDING + PICS PICS_A4_1 //5GMM-Primary authentication and key agreement procedures + PICS PICS_A4_1_1 //Initiation and control of the EAP based primary authentication and key agreement procedures + PICS PICS_A4_1_2 //Initiation and control of the 5G AKA based primary authentication and key agreement procedures + PICS PICS_A4_1_2_1_1 //Provision of new authentication parameters to the UE on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #21 "synch failure" + PICS PICS_A4_1_2_1_2 //Termination of the 5G AKA based primary authentication and key agreement procedure with AUTHENTICATION REJECT on receipt of two consecutive AUTHENTICATION FAILURE message containing 5GMM cause #21 "synch failure" + PICS PICS_A4_1_2_2_1 //Initiation of the identification procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #20 "MAC failure" + PICS PICS_A4_1_2_2_2 //Termination of the 5G AKA based primary authentication and key agreement procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #20 "MAC failure" + PICS PICS_A4_1_2_3_1 //Initiation of the identification procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #26 "non-5G authentication unacceptable" + PICS PICS_A4_1_2_3_2 //Termination of the 5G AKA based primary authentication and key agreement procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #26 "non-5G authentication unacceptable" + PICS PICS_A4_1_2_4 //Re-initiation of the 5G AKA based primary authentication and key agreement procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #71 "ngKSI already in use" + PICS PICS_A4_2 //Security mode control procedures + PICS PICS_A4_2_1 //Initiation of the security mode control procedure to take a 5G NAS security context into use, and initialise and start NAS signalling security + PICS PICS_A4_2_2 //Initiation of the security mode control procedure to change the 5G NAS security algorithms for a current 5G NAS security context already in use + PICS PICS_A4_2_3 //Initiation of the security mode control procedure to change the value of uplink NAS COUNT used in the latest SECURITY MODE COMPLETE message + PICS PICS_A4_2_4 //Initiation of the security mode control procedure to provide the Selected EPS NAS security algorithms to the UE + PICS PICS_A4_3 //Identification procedures + PICS PICS_A4_4 //Generic UE configuration update procedures + PICS PICS_A4_4_1 //Sending of CONFIGURATION UPDATE COMMAND messages to the UE? + PICS PICS_A4_5 //NAS transport procedures + PICS PICS_A4_5_1 //UE-initiated NAS transport procedures (receipt of UL NAS TRANSPORT messages) + PICS PICS_A4_5_1_1 //Sending back to the UE 5GSM messages which were not forwarded due to abnormal case on the network side + PICS PICS_A4_5_2 //Network-initiated NAS transport procedures (sending of DL NAS TRANSPORT messages) + PICS PICS_A4_6 //5GMM status procedures + PICS PICS_A4_7 //Network slice-specific authentication and authorization procedures + PICS PICS_A4_8 //Registration procedures + PICS PICS_A4_8_1 //Initial registration procedures + PICS PICS_A4_8_1_1_1 //Initiation of 5GMM common procedures during the initial registration procedure + PICS PICS_A4_8_1_1_2 //Skipping of the authentication procedure during an (initial) emergency registration procedure, if the AMF is configured to support emergency registration for unauthenticated SUCIs + PICS PICS_A4_8_1_2_1 //Inclusion of service area restrictions in the Service area list IE in the REGISTRATION ACCEPT message + PICS PICS_A4_8_1_2_2 //Inclusion of a list of equivalent PLMNs in the REGISTRATION ACCEPT message + PICS PICS_A4_8_1_2_3 //Inclusion of rejected NSSAI (S-NSSAIs which are included in the requested NSSAI in the REGISTRATION REQUEST message but rejected by the network) in the REGISTRATION ACCEPT message + PICS PICS_A4_8_1_2_4 //Inclusion of operator-defined access category definitions in the REGISTRATION ACCEPT message + PICS PICS_A4_8_1_3 //SMS over NAS in initial registration + PICS PICS_A4_8_1_4 //MICO mode in initial registration i.e., inclusion of the MICO indication IE in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2 //Registration procedures for mobility and periodic registration update + PICS PICS_A4_8_2_1_1 //Initiation of 5GMM common procedures during the mobility and periodic registration update procedure + PICS PICS_A4_8_2_1_2 //Skipping of the authentication procedure during the registration procedure for mobility and periodic registration update for a UE that has only an emergency PDU session + PICS PICS_A4_8_2_2_1 //Inclusion of a new TAI list for the UE in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2_2_2 //Inclusion of a list of equivalent PLMNs in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2_2_3 //Inclusion of new service area restrictions in the Service area list IE in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2_2_4 //Inclusion of rejected NSSAI (S-NSSAIs which are included in the requested NSSAI in the REGISTRATION REQUEST message but rejected by the network) in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2_2_5 //Inclusion of the LADN information IE in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2_2_6 //Inclusion of operator-defined access category definitions in the REGISTRATION ACCEPT message + PICS PICS_A4_8_2_3 //SMS over NAS in mobility and periodic registration updates + PICS PICS_A4_8_2_4 //MICO mode in mobility and periodic registration updates i.e., inclusion of the MICO indication IE in the REGISTRATION ACCEPT message + PICS PICS_A4_9 //Deregistration procedures + PICS PICS_A4_9_1 //UE-initiated deregistration procedures + PICS PICS_A4_9_2 //Network-initiated deregistration procedures + PICS PICS_A4_9_2_1 //Inclusion of the 5GMM cause IE to specify the reason for the deregistration in the DEREGISTRATION REQUEST message + PICS PICS_A4_10 //Service request procedures + PICS PICS_A4_10_1 //Initiation of common procedures during the service request procedure (receipt of SERVICE REQUEST or CONTROL PLANE SERVICE REQUEST message) + PICS PICS_A4_11 //Paging procedures + PICS PICS_A4_11_1 //Re-initiation of network paging on expiry of timer T3513 + PICS PICS_A4_12 //Notification procedures + PICS PICS_A5_1 //PDU session authentication and authorization procedures + PICS PICS_A5_2 //Network-requested PDU session modification procedures + PICS PICS_A5_3 //Network-requested PDU session release procedures + PICS PICS_A5_6 //UE-requested PDU session establishment procedures + PICS PICS_A5_6_1 //Inclusion of the Back-off timer value IE in the PDU SESSION ESTABLISHMENT REJECT message, if a PDU session establishment procedure is not accepted by the network + PICS PICS_A5_7 //UE-requested PDU session modification procedures + PICS PICS_A5_7_1 //Inclusion of the Back-off timer value IE in the PDU SESSION MODIFICATION REJECT message, if a PDU session modification procedure is not accepted by the network + PICS PICS_A5_8 //UE-requested PDU session release procedures + PICS PICS_A5_9 //5GMM status procedures + PICS PICS_A5_10 //Exchange of extended protocol configuration options + PICS PICS_A6_1 //Procedures for handling of unknown, unforeseen, and erroneous protocol data? + PICS PICS_A6_1_1 //Handling (i.e., ignoring) of messages that are too short to contain a complete message type information element + PICS PICS_A6_1_2_1 //Handling of an unknown, erroneous, or unforeseen PTI received in a 5GSM message + PICS PICS_A6_1_2_2 //Handling of an unknown, erroneous, or unforeseen PDU session identity received in the header of a 5GSM message + PICS PICS_A6_1_3 //Sending of a 5GMM STATUS or 5GSM STATUS message (depending on the EPD) with cause #97 "message type non-existent or not implemented" on receipt of a message with message type not defined for the EPD or not implemented by the receiver + PICS PICS_A6_1_4_1 //Treating messages (see note) received with non-semantical mandatory information element errors + PICS PICS_A6_1_4_2 //Ignoring messages (see note) received with non-semantical mandatory information element errors + PICS PICS_A6_1_4_3 //Rejection of PDU SESSION ESTABLISHMENT REQUEST, PDU SESSION MODIFICATION REQUEST, and PDU SESSION RELEASE REQUEST messages with cause #96 "invalid mandatory information" when an error is encountered with a mandatory information element in the 5GSM message + PICS PICS_A6_1_5 //Handling of messages containing unknown or unforeseen (out of sequence, repeated) IEs in the non-imperative message part + PICS PICS_A6_1_6_1 //Treating messages received missing a conditional IE or containing an unexpected or a syntactically incorrect conditional IE + PICS PICS_A6_1_6_2 //Ignoring messages received missing a conditional IE or containing an unexpected or a syntactically incorrect conditional IE + PICS PICS_A6_1_6_2_1 //Returning a status message (5GMM STATUS or 5GSM STATUS depending on the EPD) with cause #100 "conditional IE error" when ignoring a message received missing a conditional IE or containing an unexpected or a syntactically incorrect conditional IE + PICS PICS_A6_1_7 //Responding to messages (where a reaction is foreseen) with semantically incorrect contents with status messages (5GMM STATUS or 5GSM STATUS depending on the EPD) with cause #95 "semantically incorrect message + + + // PIXIT + PIXIT NgapMessage PX_MCC + PIXIT NgapMessage PX_MNC + PIXIT NgapMessage PX_ROUTING_INDICATOR + PIXIT NgapMessage PX_PROTECTION_SCHEME_ID + PIXIT NgapMessage PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER + PIXIT NgapMessage PX_MSIN + PIXIT NgapMessage PX_INVALID_RES_VALUE + PIXIT NgapMessage PX_WRONG_MAC_CODE + PIXIT NgapMessage PX_NON_DEFAULT_NGKSI + PIXIT NgapMessage PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE + PIXIT NgapMessage PX_SELECTED_NAS_CIPHERING_ALGORITHM + PIXIT NgapMessage PX_SELECTED_NAS_INTEGRITY_ALGORITHM + PIXIT NgapMessage PX_UE_SECURITY_CAPABILITIES + PIXIT NgapMessage PX_AMF_REGION_ID + PIXIT NgapMessage PX_AMF_SET_ID + PIXIT NgapMessage PX_AMF_POINTER + PIXIT NgapMessage PX_TAC + PIXIT NgapMessage PX_SEC_ABORT_TWAIT + PIXIT NgapMessage PX_UNASSIGNED_5G_TMSI + PIXIT NgapMessage PX_CUC_TWAIT + PIXIT NgapMessage PX_PDU_session_identity + PIXIT NgapMessage PX_SST + PIXIT NgapMessage PX_SD + PIXIT NgapMessage PX_DNN + PIXIT NgapMessage PX_SST_1 + PIXIT NgapMessage PX_SD_1 + PIXIT NgapMessage PX_SST_2 + PIXIT NgapMessage PX_SD_2 + PIXIT NgapMessage PX_SST_Rejected + PIXIT NgapMessage PX_SD_Rejected + PIXIT NgapMessage PX_DRG_TWAIT + PIXIT NgapMessage PX_T3522 + +} \ No newline at end of file diff --git a/test_purposes/TDL.tdltx b/test_purposes/TDL.tdltx new file mode 100644 index 0000000..0b2a2bb --- /dev/null +++ b/test_purposes/TDL.tdltx @@ -0,0 +1,62 @@ +@Version: "1.8.1" +Package TDL { + + Constraint length + Constraint minLength + Constraint maxLength + Constraint range + Constraint format + Constraint union + Constraint uniontype + + Type Boolean + Type Integer + Type String + Type Verdict + Type Bitstring + + Boolean ^true + Boolean ^false + Boolean True + Boolean False + + Verdict pass + Verdict fail + Verdict inconclusive + + Time second + + Annotation Master + Annotation MappingName + Annotation Version + Annotation check + Annotation where + Annotation PICS + Annotation PIXIT + + //standard annotations for STO + Annotation Initial conditions + Annotation Expected behaviour + Annotation Final conditions + Annotation Test Purpose Description + Annotation when + Annotation then + + Predefined == returns Boolean + Predefined != returns Boolean + Predefined and returns Boolean + Predefined or returns Boolean + Predefined xor returns Boolean + Predefined not returns Boolean + Predefined < returns Boolean + Predefined > returns Boolean + Predefined <= returns Boolean + Predefined >= returns Boolean + Predefined + + Predefined - + Predefined * + Predefined / + Predefined mod + Predefined size returns Integer + +} diff --git a/test_purposes/TP_AMF_NGAP.tdltx b/test_purposes/TP_AMF_NGAP.tdltx new file mode 100644 index 0000000..be9af0f --- /dev/null +++ b/test_purposes/TP_AMF_NGAP.tdltx @@ -0,0 +1,1234 @@ +/* +Copyright (c) ETSI 2025. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +*/ + +/* interface at AMF */ +Package TP_AMF_NGAP { + + + + Package Clause_8_2_PDU_Session_Management_Procedures { + Import all from TDL + Import all from NGAP_Common + + + Test Purpose TP_NGAP_AMF_PDU_01 { + + Objective: "Verify that the IUT successfully processes a PDU Session Establishment Request and initiates the PDU Session Resource Setup procedure for a single PDU_Session_Resource." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.1.2 and 9.2.1.1" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_1 + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasNoPduSessionResourceEstablishedForTheConcernedPduSessionId + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + ul_nas_transport_message_identity set to UL_NAS_TRANSPORT, + payload_container containing { + PDU_session_identity set to PX_PDU_SessionId, + Message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST}}, + User_Location_Information containing { + nr_cgi containing { + PLMN_Identity set to PX_PLMN_Identity}, + tai containing { + PLMN_Identity set to PX_PLMN_Identity, + TAC set to PX_TAC} + } + } + from the UE entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Setup_Request_List containing { + PDU_Session_Resource_Setup_Request_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_NAS_PDU containing { + uL_NAS_TRANSPORT_message_identity set to UL_NAS_TRANSPORT, + payload_container containing { + PDU_session_identity set to PX_PDU_SessionId, + Message_type set to PDU_SESSION_ESTABLISHMENT_ACCEPT, + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}, + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}, + PDU_Session_Resource_Setup_Request_Transfer containing { + PDU_Session_Type set to IPv4, + QoS_Flow_Setup_Request_List containing { + QoS_Flow_Setup_Request_Item containing { + QoSFlowIdentifier set to PX_QFI, + QoSFlowLevelQosParameters containing { + QoSCharacteristics containing { + Non_Dynamic_5QI set to PX_5QI}, + AllocationAndRetentionPriority}}}}}}} + to the GNB entity + } + + } + + } // end TP_NGAP_AMF_PDU_01 + + Test Purpose TP_NGAP_AMF_PDU_01_2 { + + Objective: "Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_SETUP_RESPONSE message and completes the PDU Session Resource Setup procedure for a single PDU_Session_Resource." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.1.2 and 9.2.1.1" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_1 + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasSentPDU_SESSION_RESOURCE_SETUP_REQUEST + } + + Expected behaviour + ensure that { + when { + the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Setup_Request_List containing { + PDU_Session_Resource_Setup_Request_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_NAS_PDU containing { + uL_NAS_TRANSPORT_message_identity set to UL_NAS_TRANSPORT, + payload_container containing { + Message_type set to PDU_SESSION_ESTABLISHMENT_ACCEPT}}, + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}, + PDU_Session_Resource_Setup_Request_Transfer containing { + PDU_Session_Type set to IPv4, + QoS_Flow_Setup_Request_List containing { + QoS_Flow_Setup_Request_Item containing { + QoSFlowIdentifier set to RV_QFI, + QoSFlowLevelQosParameters containing { + QoSCharacteristics containing { + Non_Dynamic_5QI set to PX_5QI}, + AllocationAndRetentionPriority}}}}}}} + to the GNB entity + } + then { + the IUT entity accepts a PDU_SESSION_RESOURCE_SETUP_RESPONSE containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Setup_Response_List containing { + PDU_Session_Resource_Setup_Response_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Setup_Response_Transfer containing { + DL_QoS_Flow_per_TNL_Information containing { + AssociatedQoSFlowList containing { + AssociatedQoSFlowItem containing { + QoSFlowIdentifier set to RV_QFI}}}}}}} + from the GNB entity + } + + } + + } // end TP_NGAP_AMF_PDU_01_2 + + Test Purpose TP_NGAP_AMF_PDU_02 { + + Objective: "Verify that the IUT successfully processes a PDU Session Release request and initiates the PDU Session Resource Release procedure for a single PDU_Session_Resource." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.2.2 and 9.2.1.3" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_2 + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasEstablishedPduSessionResourceForTheConcernedPduSessionId + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + ul_nas_transport_message_identity set to UL_NAS_TRANSPORT, + payload_container containing { + PDU_SessionId set to PX_PDU_SessionId, + Message_type set to PDU_SESSION_RELEASE_REQUEST}}, + User_Location_Information containing { + nr_cgi containing { + PLMN_Identity set to PX_PLMN_Identity}, + tai containing { + PLMN_Identity set to PX_PLMN_Identity, + TAC set to PX_TAC} + } + } + from the GNB entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_RELEASE_COMMAND containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + ul_nas_transport_message_identity set to DL_NAS_TRANSPORT, + payload_container containing { + Message_type set to PDU_SESSION_RELEASE_COMMAND}, + PDU_SessionId set to PX_PDU_SessionId}, + PDU_Session_Resource_To_Release_List containing { + PDU_Session_Resource_To_Release_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Release_Command_Transfer containing { + Cause set to PX_Cause}}}} //normal_release + to the GNB entity + } + } + } // end TP Id TP_NGAP_AMF_PDU_02 + + Test Purpose TP_NGAP_AMF_PDU_02_2 { + + Objective: "Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_RELEASE_RESPONSE message and completes the PDU Session Resource Release procedure for a single PDU_Session_Resource." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.2.2 and 9.2.1.3" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_2 + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasSentPDU_SESSION_RESOURCE_RELEASE_COMMAND + } + + Expected behaviour + ensure that { + when { + the IUT entity sends a PDU_SESSION_RESOURCE_RELEASE_COMMAND containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + ul_nas_transport_message_identity set to DL_NAS_TRANSPORT, + payload_container containing { + Message_type set to PDU_SESSION_RELEASE_COMMAND}, + PDU_SessionId set to PX_PDU_SessionId}, + PDU_Session_Resource_To_Release_List containing { + PDU_Session_Resource_To_Release_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Release_Command_Transfer containing { + Cause set to PX_Cause}}}} //normal_release + to the GNB entity + } + then { + the IUT entity accepts a PDU_SESSION_RESOURCE_RELEASE_RESPONSE containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_To_Release_List containing { + PDU_Session_Resource_To_Release_Item containing { + PDU_SessionId set to PX_PDU_SessionId}}} + from the GNB entity + } + } + } // end TP Id TP_NGAP_AMF_PDU_02_2 + + Test Purpose TP_NGAP_AMF_PDU_03 { + + Objective: "Verify that the IUT initiates the PDU Session Resource Modify procedure to request the setup of an additional QoS flow for an already established PDU session. NOTE: The UE shall be configured in the IUT to require an additional QoS flow for the concerned PDU session." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.3.2 and 9.2.1.5" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_3 + + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasEstablishedPduSessionResourceForTheConcernedPduSessionId + } + + Expected behaviour + ensure that { + when { + the IUT entity initiatesPduSessionResourceModificationToAddQoSFlow + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_MODIFY_REQUEST containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Modify_Request_List containing { + PDU_Session_Resource_Modify_Request_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Modify_Request_Transfer containing { + QoSFlowAddOrModifyRequestList containing { + QoSFlowAddOrModifyRequestItem containing { + QoSFlowIdentifier set to RV_2nd_QFI, + QoSFlowLevelQosParameters containing { + QoSCharacteristics containing { + Non_Dynamic_5QI set to PX_2nd_5QI, + AllocationAndRetentionPriority}}}}}}}} + to the GNB entity + and the IUT entity accepts a PDU_SESSION_RESOURCE_MODIFY_RESPONSE containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Modify_Response_List containing { + PDU_Session_Resource_Modify_Response_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Modify_Response_Transfer containing { + QoSFlowAddOrModifyResponseList containing { + QoSFlowAddOrModifyResponseItem containing { + QoSFlowIdentifier set to RV_2nd_QFI}}}}}} + from the GNB entity + } + } + } // end TP_NGAP_AMF_PDU_03 + + Test Purpose TP_NGAP_AMF_PDU_04 { + + Objective: "Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.5.2 and 9.2.1.8" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_5 + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasEstablishedPduSessionResourceForTheConcernedPduSessionId + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a PDU_SESSION_RESOURCE_MODIFY_INDICATION containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Modify_Indication_List containing { + PDU_Session_Resource_Modify_Indication_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Modify_Indication_Transfer containing { + DLQoSFlowperTNLInformation containing { + UPTransportLayerInformation containing { + EndpointIPAddress set to PX_N3_GNB_IP_ADDRESS, + GTP_TEID set to RV_GTP_TEID}, + AssociatedQoSFlowList containing { + AssociatedQoSFlowItem containing { + QoSFlowIdentifier set to RV_QFI}}}}}}} + from the GNB entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_MODIFY_CONFIRM containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Modify_Confirm_List containing { + PDU_Session_Resource_Modify_Confirm_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Modify_Confirm_Transfer containing { + QoSFlowModifyConfirmList containing { + QoSFlowModifyConfirmItem containing { + QoSFlowIdentifier set to RV_QFI}}, + UL_NG_U_UP_TNLInformation containing { + UP_Transport_Layer_Information containing { + EndpointIPAddress set to PX_N3_AMF_IP_ADDRESS, + GTP_TEID set to RV_GTP_TEID}}}}}} + to the GNB entity + } + } + } // end TP_NGAP_AMF_PDU_04 + + Test Purpose TP_NGAP_AMF_PDU_05 { + + Objective: "Verify that the AMF node processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for not successfully modified PDU session." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.5.2 and 9.2.1.8" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_1_5 + + Initial conditions + with { + the UE entity isInCM_CONNECTED and + the IUT entity hasActiveUeNgapContext and + the IUT entity hasEstablishedPduSessionResourceForTheConcernedPduSessionId + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a PDU_SESSION_RESOURCE_MODIFY_INDICATION containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Modify_Indication_List containing { + PDU_Session_Resource_Modify_Indication_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Modify_Indication_Transfer containing { + DLQoSFlowperTNLInformation containing { + UPTransportLayerInformation containing { + EndpointIPAddress set to PX_N3_GNB_IP_ADDRESS, + GTP_TEID set to RV_GTP_TEID}, + AssociatedQoSFlowList containing { + AssociatedQoSFlowItem containing { + QoSFlowIdentifier set to PX_QFI_Wrong}}}}}}} + from the GNB entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_MODIFY_CONFIRM containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_Failed_To_Modify_List containing { + PDU_Session_Resource_Failed_To_Modify_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Modify_Indication_Unsuccessful_Transfer containing { + Cause set to "Unknown QoS Flow ID"}}}} + to the GNB entity + } + } + } // end TP_NGAP_AMF_PDU_05 + + + + } //end Package Clause_8_2_PDU_Session_Management_Procedures + + Package Clause_8_3_UE_Context_Management_Procedures { + + Package Initial_Context_Setup { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_AMF_CMP_01 { + + Objective: "Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed." + + Reference: "ETSI TS 138 413 [1], Clauses 8.3.1.2" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_2_1 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF and + the IUT entity hasActiveUeNgapContext and + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UplinkNASTransport containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + Message_identity set to SECURITY_MODE_COMPLETE}, + User_Location_Information containing { + nr_cgi containing { + PLMN_Identity set to PX_PLMN_Identity}, + tai containing { + PLMN_Identity set to PX_PLMN_Identity, + TAC set to PX_TAC}}} + from the GNB entity + } + then { + the IUT entity sends an INITIAL_CONTEXT_SETUP_REQUEST containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + GUAMI containing { + PLMN_Identity set to PX_PLMN_Identity, + AMF_Region_ID set to PX_AMF_Region_ID, + AMF_Set_ID set to PX_AMF_Set_ID, + AMF_Pointer set to PX_AMF_Pointer_ID}, + Allowed_NSSAI containing { + Allowed_NSSAI_List containing { + Allowed_NSSAI_Item containing { + S_NSSAI containing { + SST set to PX_SST_Allowed, + SD set to PX_SD_Allowed}}}}, + UE_Security_Capabilities containing { + NR_Encryption_Algorithms set to PX_NR_Encryption_Algorithms, + NR_Integrity_Protection_Algorithms set to PX_NR_Integrity_Protection_Algorithms, + E_UTRA_Encryption_Algorithms set to PX_E_UTRA_Encryption_Algorithms, + E_UTRA_Integrity_Protection_Algorithms set to PX_E_UTRA_Integrity_Protection_Algorithms}, + Security_Key set to RV_Security_Key, + NAS_PDU containing { + Message_identity set to REGISTRATION_ACCEPT}} + to the GNB entity + and the IUT entity accepts a INITIAL_CONTEXT_SETUP_RESPONSE containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID} + from the GNB entity + } + } + } // end TP_NGAP_AMF_CMP_01 + + } //end Package Initial_Context_Setup + + Package UE_Context_Release_AMF_initiated { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_AMF_CMP_02 { + + Objective: "Verify that the IUT can send a UE_CONTEXT_RELEASE_COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID ." + + Reference: "ETSI TS 138 413 [1], Clauses 8.3.3 and 9.2.2.5" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_2_3 + + Initial conditions + with { + the UE entity isRegisteredToAMF and + the IUT entity hasActiveUeNgapContext and + the UE entity hasEstablishedInitialContext + } + + Expected behaviour + ensure that { + when { + // implicit trigger: AMF releases UE Context + the IUT entity processTheUENasDeregistration + } + then { + the IUT entity sends a UE_CONTEXT_RELEASE_COMMAND containing { + CHOICE_UE_NGAP_IDs containing { + UE_NGAP_ID_pair containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID + } + }, + Cause set to "nas.normal_release" + } + to the GNB entity + } + } + } // end TP_NGAP_AMF_CMP_02 + + Test Purpose TP_NGAP_AMF_CMP_03 { + + Objective: "Verify that the IUT executes a UE_CONTEXT_RELEASE procedure when it has received UE_CONTEXT_RELEASE_REQUEST due to GNB generated reasons." + + Reference: "ETSI TS 138 413 [1], Clauses 8.3.2, 8.3.3 and 9.2.2.5" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_2_3 + + Initial conditions + with { + the UE entity isRegisteredToAMF and + the UE entity hasEstablishedInitialContext + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a UE_CONTEXT_RELEASE_REQUEST containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + PDU_Session_Resource_List containing { + PDU_Session_Resource_Item containing { + PDU_SessionId set to PX_PDU_SessionId}}, + Cause set to PX_VA_Cause} + //VA1="RadioNetwork.user-inactivity" + //VA2="RadioNetwork.unspecified"; + //VA3="RadioNetwork.release due to NG-RAN generated reason"; + //VA4="RadioNetwork.cell not available"; + //VA5="RadioNetwork.radio resource not available"; + //VA6="RadioNetwork.radio connection with UE lost"; + from the GNB entity + } + then { + the IUT entity sends a UE_CONTEXT_RELEASE_COMMAND containing { + CHOICE_UE_NGAP_IDs containing { + UE_NGAP_ID_pair containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID}} + , + Cause set to PX_VA_Cause} + //VA1="RadioNetwork.user-inactivity" + //VA2="RadioNetwork.unspecified"; + //VA3="RadioNetwork.release due to NG-RAN generated reason"; + //VA4="RadioNetwork.cell not available"; + //VA5="RadioNetwork.radio resource not available"; + //VA6="RadioNetwork.radio connection with UE lost"; + to the GNB entity + and the IUT entity accepts a UE_CONTEXT_RELEASE_COMPLETE containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID} + } + } + } // end TP_NGAP_AMF_CMP_03 + + } //end Package UE_Context_Release_AMF_initiated + + Package UE_Context_Modification { + + Import all from TDL + Import all from NGAP_Common + + + } //end Package UE_Context_Modification + + Package Connection_Establishment_Indication { + //Currently skipped test since CONNECTION_ESTABLISHMENT_INDICATION is sent only if NG-RAN node is an ng-eNB + + } //end Package Connection_Establishment_Indication + + Package AMF_CP_Relocation_Indication { + + Import all from TDL + Import all from NGAP_Common + + } //end Package AMF_CP_Relocation_Indication + + Package Retrieve_UE_information { + + Import all from TDL + Import all from NGAP_Common + + + } //end Package Retrieve_UE_information + + Package UE_Context_Suspend { + Import all from TDL + Import all from NGAP_Common + + + } //end Package UE_Context_Suspend + + Package UE_Context_Resume { + Import all from TDL + Import all from NGAP_Common + + + } //end Package UE_Context_Resume + + } //end Package Clause_8_3_UE_Context_Management_Procedures + + Package Clause_8_4_UE_Mobility_Management_Procedures { + + Package Handover_Preparation { + Import all from TDL + Import all from NGAP_Common + + + } //end Package Handover_Preparation + + Package Handover_Resource_Allocation { + Import all from TDL + Import all from NGAP_Common + + + } //end Package Handover_Resource_Allocation + + Package Path_Switch_Request { + Import all from TDL + Import all from NGAP_Common + + + } //end Package Path_Switch_Request + + Package Handover_Cancellation { + Import all from TDL + Import all from NGAP_Common + + + } //end Package Handover_Cancellation + + Package Downlink_RAN_Status_Transfer { + Import all from TDL + Import all from NGAP_Common + + + } //end Package Downlink_RAN_Status_Transfer + + Package Handover_Success { + Import all from TDL + Import all from NGAP_Common + + } //end Package Handover_Success + + Package Downlink_RAN_Early_Status_Transfer { + Import all from TDL + Import all from NGAP_Common + } //end Package Downlink_RAN_Early_Status_Transfer + + } //end Package Clause_8_4_UE_Mobility_Management_Procedures + + Package Clause_8_5_Paging_Procedures { + Package Paging { + Import all from TDL + Import all from NGAP_Common + + } // end "Paging" + + } // end "8.5 Paging Procedures" + + Package Clause_8_6_Transport_of_NAS_Messages_Procedures { + Package Downlink_NAS_Transport { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_AMF_NAS_01 { + + Objective: "Verify that the IUT can send a DOWNLINK_NAS_TRANSPORT message to carry NAS information over the NG interface after INITIAL_UE_MESSAGE to start with UE registration procedure." + + Reference: "ETSI TS 138 413 [1], Clauses 8.6.2.2, 9.2.5.1 and 9.2.5.2", + "ETSI TS 123 502 [3], Clause 4.24.1" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_5_2 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + Message_identity set to REGISTRATION_REQUEST}, + User_Location_Information containing { + nr_cgi containing { + PLMN_Identity set to PX_PLMN_Identity}, + tai containing { + PLMN_Identity set to PX_PLMN_Identity, + TAC set to PX_TAC}}, + RRC_Establishmnet_Cause set to "mo-Signalling"} + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID, + NAS_PDU containing { + Message_identity set to AUTHENTICATION_REQUEST}} + to the GNB entity + } + } + } // end TP_NGAP_AMF_NAS_01 + + } // end "Downlink NAS Transport" + + Package Reroute_NAS_Request { + Import all from TDL + Import all from NGAP_Common + + } // end "Reroute NAS Request" + + } //end Package Reroute_NAS_Request + + Package Clause_8_7_Interface_Management_Procedures { + Package NG_Setup { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_AMF_IMP_01 { + + Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing { the PLMN identity, TAC, and supported slice IEs, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_1 + + Initial conditions + with { + the GNB entity hasNotEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_SETUP_REQUEST containing { + Global_RAN_Node_ID containing { + Global_gNB_ID containing { + PLMN_Identity set to PX_PLMN_Identity, + gNB_ID set to PX_gNB_ID}}, + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}} + }} + from the GNB entity + } + then { + the IUT entity sends an NG_SETUP_RESPONSE containing { + AMF_Name set to PX_AMF_Name, + Served_GUAMI_List containing { + Served_GUAMI_Item containing { + GUAMI containing { + PLMN_Identity set to PX_PLMN_Identity, + AMF_Region_ID set to PX_AMF_Region_ID, + AMF_Set_ID set to PX_AMF_Set_ID, + AMF_Pointer set to PX_AMF_Pointer_ID}}}, + PLMN_Support_List containing { + PLMN_Support_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_01 + + Test Purpose TP_NGAP_AMF_IMP_02 { + + Objective: "Verify that the AMF node successfully decline an NG_SETUP_REQUEST message containing { only PLMNs/SNPNs that does not recognize or support, rejects the NG Setup procedure by responding with NG_SETUP_FAILURE message including the appropriate cause value." + //Possible test for not supported slice at AMF and cause would be "slice-not-supported"; + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.3, 9.2.6.1 and 9.2.6.3" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_1 + + Initial conditions + with { + the GNB entity hasEstablishedTNL_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_SETUP_REQUEST containing { + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_NOTSUPPORTED_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}}//, + //Default_Paging_DRX + }} + from the GNB entity + } + then { + the IUT entity sends an NG_SETUP_FAILURE containing { + Cause set to "unknown-PLMN-or-SNPN"} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_02 + + Test Purpose TP_NGAP_AMF_IMP_04 { + + Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message including the appropriate data and answers with NG_SETUP_RESPONSE to acknowledge the setup." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_1 + + Initial conditions + with { + the GNB entity hasEstablishedTNL_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_SETUP_REQUEST containing { + Global_RAN_Node_ID containing { + Global_gNB_ID containing { + PLMN_Identity set to PX_PLMN_Identity, + gNB_ID set to PX_gNB_ID}}, + RAN_Node_Name set to PX_RAN_NODE_NAME, + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}, + NPN_Support containing { + SNPN containing { + NID set to PX_NID}}, + Extended_TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST_EXTENDED, + SD set to PX_SD_EXTENDED}}}}, + RAT_Information set to "unlicensed"}, + Extended_RAN_Node_Name containing { + RAN_Node_Name_Visible set to PX_RAN_NODE_NAME_VISIBLE}}} + from the GNB entity + } + then { + the IUT entity sends an NG_SETUP_RESPONSE containing { + AMF_Name set to PX_AMF_Name, + Served_GUAMI_List containing { + Served_GUAMI_Item containing { + GUAMI containing { + PLMN_Identity set to PX_PLMN_Identity, + AMF_Region_ID set to PX_AMF_Region_ID, + AMF_Set_ID set to PX_AMF_Set_ID, + AMF_Pointer set to PX_AMF_Pointer_ID}}}, + Relative_AMF_Capacity, + PLMN_Support_List containing { + PLMN_Support_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}, + NPN_Support containing { + SNPN containing { + NID set to PX_NID}}, + Extended_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST_EXTENDED, + SD set to PX_SD_EXTENDED}}}}, + Extended_RAN_Node_Name containing { + RAN_Node_Name_Visible set to PX_RAN_NODE_NAME_VISIBLE}} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_04 + + Test Purpose TP_NGAP_AMF_IMP_01_2 { + + Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing { the PLMN identity, TAC, supported slice IEs and Extended RAN Node Name, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_1 + + Initial conditions + with { + the GNB entity hasNotEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_SETUP_REQUEST containing { + Global_RAN_Node_ID containing { + Global_gNB_ID containing { + PLMN_Identity set to PX_PLMN_Identity, + gNB_ID set to PX_gNB_ID}}, + RAN_Node_Name set to PX_RAN_Node_Name, + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}}, + Extended_RAN_Node_Name set to PX_Extended_RAN_Node_Name + }} + from the GNB entity + } + then { + the IUT entity sends an NG_SETUP_RESPONSE containing { + AMF_Name set to PX_AMF_Name, + Served_GUAMI_List containing { + Served_GUAMI_Item containing { + GUAMI containing { + PLMN_Identity set to PX_PLMN_Identity, + AMF_Region_ID set to PX_AMF_Region_ID, + AMF_Set_ID set to PX_AMF_Set_ID, + AMF_Pointer set to PX_AMF_Pointer_ID}}}, + PLMN_Support_List containing { + PLMN_Support_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_01_2 + + Test Purpose TP_NGAP_AMF_IMP_01_3 { + + Objective: "Verify that the AMF with IAB support successfully processes an NG_SETUP_REQUEST message containing { the PLMN identity, TAC and supported slice IEs, and responds with an NG_SETUP_RESPONSE message containing IAB Supported IE to acknowledge the setup." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_1 and PICS_A4_6_1_2 + + Initial conditions + with { + the GNB entity hasNotEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_SETUP_REQUEST containing { + Global_RAN_Node_ID containing { + Global_gNB_ID containing { + PLMN_Identity set to PX_PLMN_Identity, + gNB_ID set to PX_gNB_ID}}, + RAN_Node_Name set to PX_RAN_Node_Name, + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}} + }} + from the GNB entity + } + then { + the IUT entity sends an NG_SETUP_RESPONSE containing { + AMF_Name set to PX_AMF_Name, + Served_GUAMI_List containing { + Served_GUAMI_Item containing { + GUAMI containing { + PLMN_Identity set to PX_PLMN_Identity, + AMF_Region_ID set to PX_AMF_Region_ID, + AMF_Set_ID set to PX_AMF_Set_ID, + AMF_Pointer set to PX_AMF_Pointer_ID}}}, + PLMN_Support_List containing { + PLMN_Support_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}}}}, + IAB_Supported set to "true"} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_01_3 + + } //end Package NG_Setup + + Package RAN_Configuration_Update { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_AMF_IMP_05 { + + Objective: "Verify that the AMF node successfully processes a RAN_CONFIGURATION_UPDATE message containing { new slice with RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE to acknowledge the update with supported slice at AMF." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.2.2, 9.2.6.4 and 9.2.6.5" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_2 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF + + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a RAN_CONFIGURATION_UPDATE containing { + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST_NEW, + SD set to PX_SD_NEW}}}}}}} + from the GNB entity + } + then { + the IUT entity sends a RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_05 + + Test Purpose TP_NGAP_AMF_IMP_06 { + + Objective: "Verify that the AMF node successfully declines a RAN_CONFIGURATION_UPDATE message with RAN_CONFIGURATION_UPDATE_FAILURE and appropriate cause value (i.e. slice not supported) when the AMF is not able to handle new slice type as requested." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.2.3 and 9.2.6.4 and 9.2.6.6" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_2 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a RAN_CONFIGURATION_UPDATE containing { + Supported_TA_List containing { + Supported_TA_Item containing { // Implementation note: RAN has been reconfigured via O&M interface to support different SST + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST_UNSUPPORTED, // Implementation note: The new SST indicated is not supported by Core side. + SD set to PX_SD_NEW}}}}}}} + from the GNB entity + } + then { + the IUT entity sends a RAN_CONFIGURATION_UPDATE_FAILURE containing { + Cause set to "RadioNetwork_slice-not-supported"} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_06 + + } //end Package RAN_Configuration_Update + + Package AMF_Configuration_Update { + Import all from TDL + Import all from NGAP_Common + + } //end Package AMF_Configuration_Update + + Package NG_Reset { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_AMF_IMP_08 { + + Objective: "Verify that the AMF node successfully processes a full NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the reset." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.4.2.2, 9.2.6.11 and 9.2.6.12" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_4 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_RESET containing { + Cause set to PX_CAUSE, + CHOICE_Reset_Type containing { + NG_interface containing { + Reset_All set to "Reset all"}}} + from the GNB entity + } + then { + the IUT entity sends an NG_RESET_ACKNOWLEDGE containing { + not UE_associated_Logical_NGconnection_List} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_08 + + Test Purpose TP_NGAP_AMF_IMP_08_2 { + + Objective: "Verify that the AMF node successfully processes a partial NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the partial reset." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.4.2.2, 9.2.6.11 and 9.2.6.12" + + Configuration: CF_AMF_N2 + + PICS: PICS_A2_2 and PICS_A4_6_4 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_RESET containing { + Cause set to PX_CAUSE, + CHOICE_Reset_Type containing { + Part_of_NG_interface containing { + UE_associated_Logical_NGconnection_List containing { + UE_associated_Logical_NGconnection_Item containing { + AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID}}}}} + from the GNB entity + } + then { + the IUT entity sends an NG_RESET_ACKNOWLEDGE containing { + not UE_associated_Logical_NGconnection_List} + to the GNB entity + } + } + } // end TP TP_NGAP_AMF_IMP_08_2 + + } //end Package NG_Reset + } +} //end Package TP_AMF_NGAP + diff --git a/test_purposes/TP_AMF_NGNAS.tdltx b/test_purposes/TP_AMF_NGNAS.tdltx new file mode 100644 index 0000000..c7acf36 --- /dev/null +++ b/test_purposes/TP_AMF_NGNAS.tdltx @@ -0,0 +1,1281 @@ +/* +Copyright (c) ETSI 2025. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +*/ + +/* interface at AMF */ +Package TP_AMF_NGNAS { + + + Package Clause_5_4_5_GMM_Common_Procedures { + Package Clause_5_4_1_Primary_authentication_and_key_agreement_procedure { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + Test Purpose TP_5GNAS_AMF_AUT_REQ_01 { + + Objective: "Verify that the IUT sends an AUTHENTICATION_REQUEST message upon receipt of an initial REGISTRATION_REQUEST containing { a SUCI, when no active 5G NAS security context exists." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_1_2 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}}} + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing { + nas_key_set_identifier set to "111"}, + ABBA containing { + ABBA_contents set to " '0000'H "}, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN}} + to the GNB entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_01 + + Test Purpose TP_5GNAS_AMF_AUT_REQ_02 { + + Objective: "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing { an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_1_2 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + Type_of_identity set to SUCI}}} and + event AUTHENTICATION_REQUEST occurs + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_RESPONSE, + authentication_response_parameter containing { + RES set to PX_INVALID_RES_VALUE}}} + from the GNB entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REJECT}} + to the GNB entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_02 + + Test Purpose TP_5GNAS_AMF_AUT_REQ_03 { + + Objective: "Verify that the IUT stops re-sending an AUTHENTICATION_REQUEST message if no AUTHENTICATION_RESPONSE message is received on the fifth expire of timer T3560." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1" + + Configuration: CF_AMF_N2N1 + + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + and (.) at time point start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + and (!) 6s after @start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + and (!) 12s after @start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + and (!) 18s after @start_initial_T3560 : event AUTHENTICATION_REQUEST occurs + } + Expected behaviour + ensure that { + when { + (.) at time point start_trigger_T3560 : event AUTHENTICATION_REQUEST occurs + } + then { + (!) 6s after @start_trigger_T3560 : the IUT entity aborts an AUTHENTICATION_REQUEST procedure + //(Note 1: "It is not expected to receive another AUTHENTICATION message on the N2N1 interface.") + } + } + } // end TP_5GNAS_AMF_AUT_REQ_03 + + Test Purpose TP_5GNAS_AMF_AUT_REQ_04 { + + Objective: "Verify that the IUT sends an IDENTITY_REQUEST message correctly upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #20 - MAC failure." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c), 5.4.3 and 8.2.4" + + Configuration: CF_AMF_N2N1 + + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + security_header_type set to INTEGRITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + authentication_parameter_AUTN containing { + AUTN set to PX_WRONG_MAC_CODE}}} + to the GNB entity + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + message_type set to AUTHENTICATION_FAILURE, + 5GMM_cause set to MAC_failure}} + from the GNB entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + message_type set to IDENTITY_REQUEST, + identity_type set to SUCI}} + to the GNB entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_04 + + Test Purpose TP_5GNAS_AMF_AUT_REQ_05 { + + Objective: "Verify that the IUT sends a new AUTHENTICATION_REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4" + + Configuration: CF_AMF_N2N1 + + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing { + nas_key_set_identifier set to "111"}, //value for nas_key_set_identifier was already used before + ABBA containing { + ABBA_contents set to " '0000'H "}, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN}} + to the GNB entity + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + message_type set to AUTHENTICATION_FAILURE, + 5GMM_cause set to ngKSI_already_in_use}} + from the GNB entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing { + nas_key_set_identifier set to PX_NON_DEFAULT_NGKSI}, + ABBA containing { + ABBA_contents set to " '0000'H "}, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN}} + to the GNB entity + } + } + } // end TP_5GNAS_AMF_AUT_REQ_05 + + + + Test Purpose TP_5GNAS_AMF_AUT_ABN_01 { + + Objective: "Verify that the IUT sends an IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.7, 8.2.4, 5.4.3.2 and 8.2.21.1" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_1_2_3_1 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing { + nas_key_set_identifier set to "111"}, + ABBA containing { + ABBA_contents set to " '0000'H "}, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE}} //the "separation bit" in the AMF field of AUTN is set to 0 + to the GNB entity + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED, + message_type set to AUTHENTICATION_FAILURE, + 5GMM_cause set to "Non-5G authentication unacceptable (26)"}} + from the GNB entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to IDENTITY_REQUEST, + identity_type set to SUCI}} + to the GNB entity + } + } + + } // end TP_5GNAS_AMF_AUT_ABN_01 + + } //end Package Clause_5_4_1_Primary_authentication_and_key_agreement_procedure + + Package Clause_5_4_2_Security_mode_control_procedure { + + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + Test Purpose TP_5GNAS_AMF_AUT_SEQ_01 { + + Objective: "Verify that the IUT sends a SECURITY_MODE_COMMAND message to initiate the NAS security mode control procedure upon receipt of an AUTHENTICATION_RESPONSE message in a 5G AKA based primary authentication procedure." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.2.2, 5.4.2.3 and 8.2.25" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_2_1 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + event AUTHENTICATION_REQUEST occurs with { + argument replaced by the AUTHENTICATION_REQUEST containing { + security_header_type set to NOT_SECURITY_PROTECTED} + } + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a UPLINK_NAS_TRANSPORT containing { // AUTHENTICATION_RESPONSE + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_RESPONSE}} //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + from the GNB entity + } + then { + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { // SECURITY_MODE_COMMAND + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + message_type set to SECURITY_MODE_COMMAND, + selected_NAS_security_algorithms containing { + type_of_ciphering_algorithm set to PX_SELECTED_NAS_CIPHERING_ALGORITHM, + type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM}, + ngKSI containing { + nas_key_set_identifier set to "111"}, + replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES}} // UE security capability 9.11.3.54 + to the GNB entity + } + } + } // end TP_5GNAS_AMF_AUT_SEQ_01 + + Test Purpose TP_5GNAS_AMF_SEC_ACC_01 { + + Objective: "Verify that the IUT, upon receiving the NAS SECURITY_MODE_COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.2.4, 5.5.1.2.4, 8.2.7 and 8.2.26" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_2 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + + Expected behaviour + ensure that { + when { + the IUT entity receives a UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + message_type set to SECURITY_MODE_COMPLETE}} + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to REGISTRATION_ACCEPT, + 5GS_registration_result containing { + 5GS_registration_result_value set to 3GPP_ACCESS}, + 5G_GUTI containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}, + TAI_list containing { + Partial_tracking_area_list_1 containing { + MCC set to PX_MCC, + MNC set to PX_MNC, + TAC set to PX_TAC}}, + T3512_value containing { + Timer_value set to nonZeroValue}}} + to the GNB entity + } + + } + + } // end TP_5GNAS_AMF_SEC_ACC_01 + + Test Purpose TP_5GNAS_AMF_SEC_REJ_01 { + + Objective: "Verify that the IUT aborts the ongoing procedure that triggered the NAS security mode control procedure upon receipt of a SECURITY_MODE_REJECT message containing { 5GMM cause #23 'UE security capabilities mismatch'." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.2.5 and 8.2.27" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_2 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + (.) at time point start_SMC_event : event SECURITY_MODE_COMMAND occurs + } + + Expected behaviour + ensure that { + when { + (.) at time point start_SMC_event : event SECURITY_MODE_COMMAND occurs and + the IUT entity receives a UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, + message_type set to SECURITY_MODE_REJECT, + 5GMM_cause set to "UE security capabilities mismatch (23)"}} + from the GNB entity + } + then { + // PX_SEC_ABORT_TWAIT: observation timer to verify that no further registration progression occurs + (!) PX_SEC_ABORT_TWAIT after @start_SMC_event : the IUT entity does not send a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to REGISTRATION_ACCEPT}} + to the GNB entity + //(Note 1: "The IUT is expected to abort the ongoing procedure and shall not proceed with registration completion.") + } + + } + + } // end TP_5GNAS_AMF_SEC_REJ_01 + + + + } //end Package Clause_5_4_2_Security_mode_control_procedure + + Package Clause_5_4_3_Identification_procedure { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + Test Purpose TP_5GNAS_AMF_IDN_REQ_01 { + + Objective: "Verify that the IUT initiates the identification procedure by sending an IDENTITY_REQUEST message with identity type set to SUCI when the IUT receives a REGISTRATION_REQUEST message containing { a 5G-GUTI that is not known by the IUT." + + Reference: "ETSI TS 123 502 [2], Clause 4.2.2.2.2 + ETSI TS 124 501 [1], Clauses 5.4.3.2 and 8.2.21" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_3 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_mobile_identity containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to PX_UNASSIGNED_5G_TMSI}}} + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to IDENTITY_REQUEST, + identity_type set to SUCI}} + to the GNB entity + } + } + + } // end TP_5GNAS_AMF_IDN_REQ_01 + + } //end Package Clause_5_4_3_Identification_procedure + + Package Clause_5_4_4_Generic_UE_configuration_update_procedure { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + Test Purpose TP_5GNAS_AMF_CNF_COM_01 { + + Objective: "Verify that the IUT does not retransmit a CONFIGURATION_UPDATE_COMMAND containing { only NITZ-related information elements when the Configuration update indication IE is absent or indicates that acknowledgement is not requested." + // Example trigger observed in implementation: CONFIGURATION_UPDATE_COMMAND sent after PDU_SESSION_ESTABLISHMENT_REQUEST; + // note that the base specification does not explicitly define when the CONFIGURATION_UPDATE_COMMAND shall be sent. + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.4.2 and 8.2.19" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_4_1 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + (.) at time point start_CUC_event :the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to CONFIGURATION_UPDATE_COMMAND, + Full_name_for_network, + Short_name_for_network, + Local_time_zone, + Universal_time_and_local_time_zone, + Daylight_saving_time, + not Configuration_update_indication OR + Configuration_update_indication containing { + Acknowledgement_requested set to 0 + }}} + to the GNB entity + } + then { + // PX_CUC_TWAIT value for timer awaiting no response after CUC message + (!) PX_CUC_TWAIT after @start_CUC_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to CONFIGURATION_UPDATE_COMMAND}} + to the GNB entity + //(Note 1: "It is not expected to receive a retransmission of the same NITZ-only CONFIGURATION_UPDATE_COMMAND on the N2N1 interface.") + } + } + } // end TP_5GNAS_AMF_CNF_COM_01 + + } //end Package Clause_5_4_4_Generic_UE_configuration_update_procedure + + Package Clause_5_4_5_NAS_transport_procedure { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + Test Purpose TP_5GNAS_AMF_DLN_ACC_01 { + + Objective: "Verify that the IUT, upon receipt of a UL NAS TRANSPORT message containing { a PDU SESSION ESTABLISHMENT REQUEST, sends a PDU_SESSION_RESOURCE_SETUP_REQUEST carrying a DL NAS TRANSPORT message with a PDU SESSION ESTABLISHMENT ACCEPT." + + Reference: "ETSI TS 124 501 [1], Clauses 5.4.5, 6.4.1, 8.2.10 and 8.2.11" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A5_6 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to UL_NAS_TRANSPORT, + payload_container_type set to "N1 SM information", + payload_container containing { + 5GSM_PDU containing { + extended_protocol_discriminator set to 5GS_SESSION_MANAGEMENT_MESSAGES, + message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, + PDU_session_type set to "IPv4", + SSC_mode set to "SSC mode 1"}}, + pDU_session_identity set to PX_PDU_session_identity, + request_type set to "Initial request", + s_NSSAI containing { + sst set to PX_SST, + sd set to PX_SD}, + dNN set to PX_DNN}} + from the GNB entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DL_NAS_TRANSPORT, + payload_container_type set to "N1 SM information", + payload_container containing { + 5GSM_PDU containing { + extended_protocol_discriminator set to 5GS_SESSION_MANAGEMENT_MESSAGES, + message_type set to PDU_SESSION_ESTABLISHMENT_ACCEPT}}, + pDU_session_identity set to PX_PDU_session_identity}} + to the GNB entity + } + + } + }// end TP_5GNAS_AMF_DLN_ACC_01 + + } //end Package Clause_5_4_5_NAS_transport_procedure + + } //end Package Clause_5_4_5_GMM_Common_Procedures + + Package Clause_5_5_1_2_Registration_Procedure_for_initial_registration { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + Test Purpose TP_5GNAS_AMF_REG_ACC_01 { + + Objective: "Verify that, after successful completion of the initial registration procedure over 3GPP access, the IUT sends a REGISTRATION_ACCEPT message containing { the 5GS registration result, TAI list, 5G-GUTI and T3512 value." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_8_1 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}}} + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to REGISTRATION_ACCEPT, + 5GS_registration_result containing { + 5GS_registration_result_value set to 3GPP_ACCESS}, + 5G_GUTI containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}, + TAI_list containing { + Partial_tracking_area_list_1 containing { + MCC set to PX_MCC, + MNC set to PX_MNC, + TAC set to PX_TAC}}, + T3512_value containing { + Timer_value set to nonZeroValue}}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_ACC_01 + + + Test Purpose TP_5GNAS_AMF_REG_ACC_02 { + + Objective: "Verify that, when the UE requests SMS over NAS transport during initial registration and the IUT supports SMS over NAS in initial registration, the IUT sends a REGISTRATION_ACCEPT message with the SMS allowed bit in the 5GS registration result IE set to 'SMS over NAS allowed'." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_8_1_3 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}, + 5GS_update_type containing { + SMS_over_NAS_transport_requested set to 1}}} //SMS over NAS supported + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to REGISTRATION_ACCEPT, + 5GS_registration_result containing { + 5GS_registration_result_value set to 3GPP_ACCESS, + SMS_over_NAS_transport_allowed set to 1}}} //SMS over NAS allowed + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_ACC_02 + + + Test Purpose TP_5GNAS_AMF_REG_ACC_03 { + + Objective: "Verify that the IUT sends a REGISTRATION_ACCEPT message with the SMS over NAS transport allowed bit set to 'not allowed' when the UE requests SMS over NAS during initial registration and the IUT does not support SMS over NAS in initial registration." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" + + Configuration: CF_AMF_N2N1 + + PICS: not PICS_A4_8_1_3 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}, + 5GS_update_type containing { + SMS_over_NAS_transport_requested set to 1}}} //SMS over NAS supported + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to REGISTRATION_ACCEPT, + 5GS_registration_result containing { + 5GS_registration_result_value set to 3GPP_ACCESS, + SMS_over_NAS_transport_allowed set to 0}}} //SMS over NAS not allowed + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_ACC_03 + + Test Purpose TP_5GNAS_AMF_REG_ACC_04 { + + Objective: "Verify that the IUT, during the initial registration procedure, sends a REGISTRATION_ACCEPT message including the Allowed NSSAI IE when the UE includes a Requested NSSAI IE in the REGISTRATION_REQUEST message and the IUT allows one or more S-NSSAIs from the requested NSSAI." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_8_1 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}, + Requested_NSSAI containing { + S_NSSAI_1 containing { + SST set to PX_SST_1, + SD set to PX_SD_1}, + S_NSSAI_2 containing { + SST set to PX_SST_2, + SD set to PX_SD_2}}}} + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to REGISTRATION_ACCEPT, + 5G_GUTI containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}, + Allowed_NSSAI containing { + S_NSSAI_1 containing { + SST set to PX_SST_1, + SD set to PX_SD_1}}}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_ACC_04 + + Test Purpose TP_5GNAS_AMF_REG_ACC_05 { + + Objective: "Verify that, during the initial registration procedure, the IUT includes the Rejected NSSAI IE in the REGISTRATION_ACCEPT message when the UE includes a Requested NSSAI IE in the REGISTRATION_REQUEST message and the IUT rejects one or more S-NSSAIs from the requested NSSAI." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_8_1_2_3 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}, + Requested_NSSAI containing { + S_NSSAI_1 containing { + SST set to PX_SST_1, + SD set to PX_SD_1}, + S_NSSAI_2 containing { + SST set to PX_SST_Rejected, + SD set to PX_SD_Rejected}}}} + from the GNB entity + } + then { + the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to REGISTRATION_ACCEPT, + 5G_GUTI containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}, + Rejected_NSSAI containing { + S_NSSAI_1 containing { + SST set to PX_SST_Rejected, + SD set to PX_SD_Rejected}}}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_ACC_05 + + Test Purpose TP_5GNAS_AMF_REG_REJ_01 { + + Objective: "Verify that the IUT sends a REGISTRATION_REJECT message with 5GMM cause value #22 'congestion' and includes the T3346 value IE when the initial registration request is rejected due to general NAS level mobility management congestion control." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9" + + Configuration: CF_AMF_N2N1 + + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + the AMF entity isInOverloadedState + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an INITIAL_UE_MESSAGE containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to REGISTRATION_REQUEST, + 5GS_registration_type containing { + 5GS_registration_type_value set to INITIAL_REGISTRATION}, + 5GS_mobile_identity containing { + SUPI_format set to IMSI, + Type_of_identity set to SUCI, + MCC set to PX_MCC, + MNC set to PX_MNC, + Routing_indicator set to PX_ROUTING_INDICATOR, + Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, + Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, + MSIN set to PX_MSIN}}} + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to REGISTRATION_REJECT, + 5GMM_cause set to "Congestion (22)", + T3346_value containing { + Timer_value set to nonZeroValue}}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_REJ_01 + + Test Purpose TP_5GNAS_AMF_REG_REJ_02 { + + Objective: "Verify that, during the initial registration procedure, the IUT sends a REGISTRATION_REJECT message with 5GMM cause value #9 'UE identity cannot be derived by the network' when the UE responds to an IDENTITY_REQUEST for SUCI with an IDENTITY_RESPONSE indicating that no identity is available." + + Reference: "ETSI TS 123 502 [2], Clause 4.2.2.2.2 + ETSI TS 124 501 [1], Clauses 5.4.3.2, 5.4.3.3, 5.5.1.2.5 and 8.2.9" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_3 + + Initial conditions + with { + the UE entity isNotRegisteredToAMF and + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to IDENTITY_REQUEST, + identity_type set to SUCI}} + to the GNB entity + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to IDENTITY_RESPONSE, + 5GS_mobile_identity containing { + Type_of_identity set to NO_IDENTITY}}} + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + message_type set to REGISTRATION_REJECT, + 5GMM_cause set to "UE identity cannot be derived by the network (9)"}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_REG_REJ_02 + + } //end Package Clause_5_5_1_2_Registration_Procedure_for_initial_registration + + Package Clause_5_5_2_2_3_UE_initiated_de_registration_procedure_completion { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + + Test Purpose TP_5GNAS_AMF_DRG_ACC_01 { + + Objective: "Verify that the IUT sends a DEREGISTRATION_ACCEPT message upon receipt of a UE-originated DEREGISTRATION_REQUEST message indicating normal de-registration." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_9_1 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST, + Deregistration_type containing { + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS}, + 5GS_mobile_identity containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}}} + from the GNB entity + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_ACCEPT}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_DRG_ACC_01 + + Test Purpose TP_5GNAS_AMF_DRG_ACC_02 { + + Objective: "Verify that the IUT does not send a DEREGISTRATION_ACCEPT message upon receipt of a UE-originated DEREGISTRATION_REQUEST message indicating switch off." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_9_1 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + (.) at time point start_DRG_event : the IUT entity receives an UPLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST, + Deregistration_type containing { + Switch_off set to SWITCH_OFF, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS}, + 5GS_mobile_identity containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}}} + from the GNB entity + } + then { + // PX_DRG_TWAIT: Test system observation timer used to verify that no DEREGISTRATION_ACCEPT message is sent after receipt of a switch-off DEREGISTRATION_REQUEST (no corresponding NAS timer defined in the specification) + (!) PX_DRG_TWAIT after @start_DRG_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_ACCEPT}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_DRG_ACC_02 + + } //end Package Clause_5_5_2_2_3_UE_initiated_de_registration_procedure_completion + + Package Clause_5_5_2_3_1_Network_initiated_de_registration_procedure_initiation { + Import all from TDL + Import all from NGAP_Common + Import all from NGNAS_Common + + + Test Purpose TP_5GNAS_AMF_DRG_REQ_01 { + + Objective: "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing { the De-registration type IE with re-registration not required for 3GPP access. **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_9_2 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity indicateUEdeactivation + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST, + Deregistration_type containing { + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_NOT_REQUIRED, + Access_type set to 3GPP_ACCESS}, + 5GS_mobile_identity containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_DRG_REQ_01 + + Test Purpose TP_5GNAS_AMF_DRG_REQ_02 { + + Objective: "Verify that the IUT retransmits the DEREGISTRATION_REQUEST message if no DEREGISTRATION_ACCEPT is received from the UE. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_9_2 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity indicateUEdeactivation and + (.) at time point start_DRG_event : the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST}} + to the GNB entity + } + then { + (!) PX_T3522 after @start_DRG_event : the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_DRG_REQ_02 + + Test Purpose TP_5GNAS_AMF_DRG_REQ_03 { + + Objective: "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing { the De-registration type IE with re-registration required for 3GPP access." + // NOTE: After receipt of this message, the UE is expected to respond with DEREGISTRATION_ACCEPT and to initiate a new registration procedure. These subsequent steps are not part of the verification objective of this TP, but need to be handled by the TTCN-3 test implementation and postamble. + // **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" + + Reference: "ETSI TS 124 501 [1], Clauses 5.5.2.3.1, 5.5.2.3.2 and 8.2.14" + + Configuration: CF_AMF_N2N1 + + PICS: PICS_A4_9_2 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity indicateUEderegistration + } + then { + the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, + security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, + message_type set to DEREGISTRATION_REQUEST, + Deregistration_type containing { + Switch_off set to NORMAL_DEREGISTRATION, + Reregistration_required set to REREGISTRATION_REQUIRED, + Access_type set to 3GPP_ACCESS}, + 5GS_mobile_identity containing { + Type_of_identity set to 5G_GUTI, + MCC set to PX_MCC, + MNC set to PX_MNC, + AMF_Region_ID set to PX_AMF_REGION_ID, + AMF_Set_ID set to PX_AMF_SET_ID, + AMF_Pointer set to PX_AMF_POINTER, + 5G_TMSI set to RV_5G_TMSI}}} + to the GNB entity + } + } + }// end TP_5GNAS_AMF_DRG_REQ_03 + + + } //end Package Clause_5_5_2_3_1_Network_initiated_de_registration_procedure_initiation + + + + +} //end Package TP_AMF_NGNAS + diff --git a/test_purposes/TP_GNB_NGAP.tdltx b/test_purposes/TP_GNB_NGAP.tdltx new file mode 100644 index 0000000..0f373f1 --- /dev/null +++ b/test_purposes/TP_GNB_NGAP.tdltx @@ -0,0 +1,524 @@ +/* +Copyright (c) ETSI 2025. + +This software is subject to copyrights owned by ETSI. Non-exclusive permission +is hereby granted, free of charge, to copy, reproduce and amend this file +under the following conditions: It is provided "as is", without warranty of any +kind, expressed or implied. + +ETSI shall never be liable for any claim, damages, or other liability arising +from its use or inability of use.This permission does not apply to any documentation +associated with this file for which ETSI keeps all rights reserved. The present +copyright notice shall be included in all copies of whole or part of this +file and shall not imply any sub-license right. +*/ + +/* interface at GNB */ +Package TP_GNB_NGAP { + + Package Clause_8_2_PDU_Session_Management_Procedures { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_GNB_PDU_01 { + + Objective: "Verify that the GNB successfully processes a PDU_SESSION_RESOURCE_SETUP_REQUEST and answers with PDU_SESSION_RESOURCE_SETUP_RESPONSE for successfully established PDU session." + + Reference: "ETSI TS 138 413 [1], Clauses 8.2.1.2, 9.2.1.1 and 9.2.1.2" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_1_1 + + Initial conditions + with { + the UE entity isRegisteredToAMF and + the UE entity havingSentPDUSessionEstablishment + } + + Expected behaviour + ensure that { + when { + the IUT entity receives a PDU_SESSION_RESOURCE_SETUP_REQUEST containing { + AMF_UE_NGAP_ID set to PX_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to RV_RAN_UE_NGAP_ID, + PDU_Session_Resource_Setup_Request_List containing { + PDU_Session_Resource_Setup_Request_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_NAS_PDU containing { + uL_NAS_TRANSPORT_message_identity set to UL_NAS_TRANSPORT, + payload_container containing { + Message_type set to PDU_SESSION_ESTABLISHMENT_ACCEPT}}, + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD}, + PDU_Session_Resource_Setup_Request_Transfer containing { + UL_NG_U_UP_TNL_Information containing { + EndpointIPAddress set to PX_N3_ENDPOINT_IP_ADDRESS, + GTP_TEID set to PX_GTP_TEID}, + PDU_Session_Type set to "IPv4", + QoS_Flow_Setup_Request_List containing { + QoS_Flow_Setup_Request_Item containing { + QoSFlowIdentifier set to PX_QFI, + QoSFlowLevelQosParameters containing { + QoSCharactersistics containing { + Non_Dynamic_5QI set to PX_5QI}, + Allocation_and_Retention_Priority}}}}}}} + from the AMF entity + } + then { + the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_RESPONSE containing { + AMF_UE_NGAP_ID set to PX_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to RV_RAN_UE_NGAP_ID, + PDU_Session_Resource_Setup_Response_List containing { + PDU_Session_Resource_Setup_Response_Item containing { + PDU_SessionId set to PX_PDU_SessionId, + PDU_Session_Resource_Setup_Response_Transfer containing { + DL_QoS_Flow_per_TNL_Information containing { + UP_Transport_Layer_Information containing { + EndpointIPAddress set to RV_N3_GNB_ADDRESS, + GTP_TEID set to RV_GTP_TEID}, + Associated_QoS_Flow_List containing { + Associated_QoS_Flow_Item containing { + QoS_Flow_Identifier set to PX_QFI}}}}}}} + to the AMF entity + } + } + + } // end TP_NGAP_GNB_PDU_01 + + } //end Package Clause_8_2_PDU_Session_Management_Procedures + + Package Clause_8_3_UE_Context_Management_Procedures { + Import all from TDL + Import all from NGAP_Common + + Package Initial_Context_Setup { + Import all from TDL + Import all from NGAP_Common + } //end Package Initial_Context_Setup + + Package UE_Context_Release_NG_RAN_node_initiated { + + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_GNB_CMP_07 { + + Objective: "Verify that the GNB successfully requests the AMF to release the UE-associated logical NG-connection due to user inactivity." + //from CM_CONNECTED to CM_IDLE state + Reference: "ETSI TS 138 413 [1], Clauses 8.3.2.2 and 9.2.2.4" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_2_2 + + Initial conditions + with { + the UE entity isRegisteredToAMF and + the UE entity hasEstablishedPDUsession + } + + Expected behaviour + ensure that { + when { + the IUT entity u_Plane_inactivity_timer_expires + } + then { + the IUT entity sends a UE_CONTEXT_RELEASE_REQUEST containing { + AMF_UE_NGAP_ID set to PX_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to RV_RAN_UE_NGAP_ID, + PDU_Session_Resource_List containing { + PDU_Session_Resource_Item containing { + PDU_SessionId set to PX_PDU_SessionId}}, + Cause set to "RadioNetwork.user-inactivity"} + to the AMF entity + } + + } + + } // End TP TP_NGAP_GNB_CMP_07 + + Test Purpose TP_NGAP_GNB_CMP_07_2 { + + Objective: "Verify that the GNB successfully requests the AMF to release the UE-associated logical NG-connection after rejected registration procedure." + //from CM_CONNECTED to CM_IDLE state + Reference: "ETSI TS 138 413 [1], Clauses 8.3.2.2 and 9.2.2.4 + ETSI TS 123 502 [3], Clause 4.2.6" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_2_2 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the AMF entity sends a DOWNLINK_NAS_TRANSPORT containing { + NAS_PDU containing { + Message_identity set to REGISTRATION_REJECT}} + } + then { + the IUT entity sends a UE_CONTEXT_RELEASE_REQUEST containing { + AMF_UE_NGAP_ID set to PX_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to RV_RAN_UE_NGAP_ID, + PDU_Session_Resource_List containing { + PDU_Session_Resource_Item containing { + PDU_SessionId set to PX_PDU_SessionId}}, + Cause set to "RadioNetwork.unspecified"} + to the AMF entity + } + + } + + } // End TP TP_NGAP_GNB_CMP_07_2 + + } //end Package UE_Context_Release_NG_RAN_node_initiated + + Package UE_Context_Release_AMF_initiated { + Import all from TDL + Import all from NGAP_Common + + } //end Package UE_Context_Release_AMF_initiated + + Package UE_Context_Modification { + Import all from TDL + Import all from NGAP_Common + + } //end Package UE_Context_Modification + + Package RRC_Inactive_Transition_Report { + Import all from TDL + Import all from NGAP_Common + + } //end Package RRC_Inactive_Transition_Report + + Package RAN_CP_Relocation_Indication { + + Import all from TDL + Import all from NGAP_Common + + } //end Package RAN_CP_Relocation_Indication + + Package UE_Context_Suspend { + Import all from TDL + Import all from NGAP_Common + + } //end Package UE_Context_Suspend + + Package UE_Context_Resume { + Import all from TDL + Import all from NGAP_Common + + } //end Package UE_Context_Resume + + } //end Package Clause_8_3_UE_Context_Management_Procedures + + Package Clause_8_4_UE_Mobility_Management_Procedures { + + Package Handover_Preparation { + Import all from TDL + Import all from NGAP_Common + + } //end Package Handover_Preparation + + Package Handover_Resource_Allocation { + Import all from TDL + Import all from NGAP_Common + + } //end Package Handover_Resource_Allocation + + Package Handover_Notification { + Import all from TDL + Import all from NGAP_Common + + } //end Package Handover_Notification + + Package Path_Switch_Request { + Import all from TDL + Import all from NGAP_Common + + } //end Package Path_Switch_Request + + Package Handover_Cancellation { + Import all from TDL + Import all from NGAP_Common + } //end Package Handover_Cancellation + + Package Uplink_RAN_Status_Transfer { + Import all from TDL + Import all from NGAP_Common + } //end Package Uplink_RAN_Status_Transfer + + + Package Uplink_RAN_Early_Status_Transfer { + Import all from TDL + Import all from NGAP_Common + + } //end Package Uplink_RAN_Early_Status_Transfer + + } //end Package Clause_8_4_UE_Mobility_Management_Procedures + + Package Clause_8_6_Transport_of_NAS_Messages_Procedures { + Package Initial_UE_Message { + Import all from TDL + Import all from NGAP_Common + } // end "Initial UE Message" + + Package Uplink_NAS_Transport { + Import all from TDL + Import all from NGAP_Common + + } // end "Uplink NAS Transport" + + Package NAS_Non_Delivery_Indication { + Import all from TDL + Import all from NGAP_Common + + } // end "NAS Non Delivery Indication" + + } //end Package NAS_Non_Delivery_Indication + + Package Clause_8_7_Interface_Management_Procedures { + Package NG_Setup { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_GNB_IMP_01 { + + Objective: "Verify that the GNB sends an NG_SETUP_REQUEST message to the AMF after TNL establishment." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2 and 9.2.6.1" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_6_1 + + Expected behaviour + ensure that { + when { + the IUT entity hasSuccessfullyEstablishedTNLconnection + } + then { + the IUT entity sends an NG_SETUP_REQUEST containing { + Global_RAN_Node_ID containing { + Global_gNB_ID containing { + PLMN_Identity set to PX_PLMN_Identity, + gNB_ID set to PX_gNB_ID}}, + Supported_TA_List containing { + Supported_TA_Item containing { + TAC set to PX_TAC, + Broadcast_PLMN_List containing { + Broadcast_PLMN_Item containing { + PLMN_Identity set to PX_PLMN_Identity, + TAI_Slice_Support_List containing { + S_NSSAI containing { + SST set to PX_SST, + SD set to PX_SD + OR NOT SD}}}}}}, + Default_Paging_DRX set to PX_GNB_DEF_DRX} + to the AMF entity + } + } + } // end TP TP_NGAP_GNB_IMP_01 + } //end Package NG_Setup + + Package RAN_Configuration_Update { + Import all from TDL + Import all from NGAP_Common + } //end Package RAN_Configuration_Update + + Package AMF_Configuration_Update { + Import all from TDL + Import all from NGAP_Common + + } //end Package AMF_Configuration_Update + + Package NG_Reset { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_GNB_IMP_05 { + + Objective: "Verify that the GNB successfully processes a full NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the reset." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.4.2.1, 9.2.6.11 and 9.2.6.12" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_6_4 + + Initial conditions + with { + the GNB entity hasEstablished_NG_C_AssociationToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_RESET containing { + Cause set to PX_CAUSE, + CHOICE_Reset_Type containing { + NG_interface containing { + Reset_All set to "Reset all"}}} + from the AMF entity + } + then { + the IUT entity sends an NG_RESET_ACKNOWLEDGE containing { + not UE_associated_Logical_NGconnection_List} + to the AMF entity + } + } + } // end TP TP_NGAP_GNB_IMP_05 + + Test Purpose TP_NGAP_GNB_IMP_05_2 { + + Objective: "Verify that the GNB successfully processes a partial NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the partial reset." + + Reference: "ETSI TS 138 413 [1], Clauses 8.7.4.2.1, 9.2.6.11 and 9.2.6.12" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_6_4 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + the IUT entity receives an NG_RESET containing { + Cause set to PX_CAUSE, + CHOICE_Reset_Type containing { + Part_of_NG_interface containing { + UE_associated_Logical_NGconnection_List containing { + UE_associated_Logical_NGconnection_Item containing { + AMF_UE_NGAP_ID set to PX_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to RV_RAN_UE_NGAP_ID}}}}} + from the AMF entity + } + then { + the IUT entity sends an NG_RESET_ACKNOWLEDGE containing { + not UE_associated_Logical_NGconnection_List} + to the AMF entity + } + } + } // end TP TP_NGAP_GNB_IMP_05_2 + + } //end Package NG_Reset + + Package Error_Indication { + Import all from TDL + Import all from NGAP_Common + } //end Package Error_Indication + } //end Package Clause_8_7_Interface_Management_Procedures + + Package Clause_8_8_Configuration_Transfer_Procedure { + Package Uplink_RAN_Configuration_Transfer { + Import all from TDL + Import all from NGAP_Common + } // end "Uplink RAN Configuration Transfer" + } //end Package Uplink_RAN_Configuration_Transfer + + Package Clause_8_9_Warning_Message_Transmission_Procedures { + Import all from TDL + Import all from NGAP_Common + } // end "8.9 Warning Message Transmission Procedures" + + Package Clause_8_10_NRPPa_Transport_Procedures { + Import all from TDL + Import all from NGAP_Common + + } // end "8.10 NRPPa Transport Procedures" + + Package Clause_8_11_Trace_Procedures { + Import all from TDL + Import all from NGAP_Common + + } // end "8.11 Trace Procedures" + + Package Clause_8_12_Location_Reporting_Procedures { + Package Location_Reporting_Failure_Indication { + Import all from TDL + Import all from NGAP_Common + + } // end "Location Reporting Failure Indication" + + Package Location_Report { + Import all from TDL + Import all from NGAP_Common + + } // end "Location Report" + + } // end "8.12 Location Reporting Procedures" + + Package Clause_8_13_UE_TNLA_Binding_Procedures { + + } //end Package Clause_8_13_UE_TNLA_Binding_Procedures + + Package Clause_8_14_UE_Radio_Capability_Management_Procedures { + Import all from TDL + Import all from NGAP_Common + + Test Purpose TP_NGAP_GNB_URP_01 { + + Objective: "Verify that the IUT sends correct UE_RADIO_CAPABILITY_INFO_INDICATION." + + Reference: "ETSI TS 138 413 [1], Clauses 8.14.1.2 and 9.2.13.1" + + Configuration: CF_GNB_N2 + + PICS: PICS_A2_1 and PICS_A3_13_1 + + Initial conditions + with { + the UE entity isRegisteredToAMF + } + + Expected behaviour + ensure that { + when { + + the IUT entity receives a INITIAL_CONTEXT_SETUP_REQUEST containing { + not UE_Radio_Capability} + } + then { + the IUT entity sends a UE_RADIO_CAPABILITY_INFO_INDICATION containing { + AMF_UE_NGAP_ID set to PX_AMF_UE_NGAP_ID, + RAN_UE_NGAP_ID set to RV_RAN_UE_NGAP_ID, + UE_Radio_Capability containing { + UERadioAccessCapabilityInformation containing { + criticalExtensions containing { + c1 containing { + ueRadioAccessCapabilityInformation containing { + UE_CapabilityRAT_ContainerList containing { + UE_CapabilityRAT_Container containing { + rat_Type set to "nr", + UE_NR_Capability containing { + accessStratumRelease set to "rel16"}}}}}}}}} + to the AMF entity + } + } + } // end TP_NGAP_GNB_URP_01 + + } //end Package Clause_8_14_UE_Radio_Capability_Management_Procedures + + Package Clause_8_15_Data_Usage_Reporting_Procedures { + Import all from TDL + Import all from NGAP_Common + + } //end Package Clause_8_15_Data_Usage_Reporting_Procedures + + Package Clause_8_16_RIM_Information_Transfer_Procedures { + Import all from TDL + Import all from NGAP_Common + + } //end Package Clause_8_16_RIM_Information_Transfer_Procedures + +} //end Package TP_GNB_NGAP -- GitLab From b7a2af98690c090952f369e295240a543f746cf8 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 22 May 2026 13:08:18 +0000 Subject: [PATCH 118/151] Removal of { inTest Objectives --- test_purposes/TP_AMF_NGNAS.tdltx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test_purposes/TP_AMF_NGNAS.tdltx b/test_purposes/TP_AMF_NGNAS.tdltx index c7acf36..7681837 100644 --- a/test_purposes/TP_AMF_NGNAS.tdltx +++ b/test_purposes/TP_AMF_NGNAS.tdltx @@ -25,7 +25,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_AUT_REQ_01 { - Objective: "Verify that the IUT sends an AUTHENTICATION_REQUEST message upon receipt of an initial REGISTRATION_REQUEST containing { a SUCI, when no active 5G NAS security context exists." + Objective: "Verify that the IUT sends an AUTHENTICATION_REQUEST message upon receipt of an initial REGISTRATION_REQUEST containing a SUCI, when no active 5G NAS security context exists." Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" @@ -77,7 +77,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_AUT_REQ_02 { - Objective: "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing { an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message." + Objective: "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message." Reference: "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" @@ -415,7 +415,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_SEC_REJ_01 { - Objective: "Verify that the IUT aborts the ongoing procedure that triggered the NAS security mode control procedure upon receipt of a SECURITY_MODE_REJECT message containing { 5GMM cause #23 'UE security capabilities mismatch'." + Objective: "Verify that the IUT aborts the ongoing procedure that triggered the NAS security mode control procedure upon receipt of a SECURITY_MODE_REJECT message containing 5GMM cause #23 'UE security capabilities mismatch'." Reference: "ETSI TS 124 501 [1], Clauses 5.4.2.5 and 8.2.27" @@ -466,7 +466,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_IDN_REQ_01 { - Objective: "Verify that the IUT initiates the identification procedure by sending an IDENTITY_REQUEST message with identity type set to SUCI when the IUT receives a REGISTRATION_REQUEST message containing { a 5G-GUTI that is not known by the IUT." + Objective: "Verify that the IUT initiates the identification procedure by sending an IDENTITY_REQUEST message with identity type set to SUCI when the IUT receives a REGISTRATION_REQUEST message containing a 5G-GUTI that is not known by the IUT." Reference: "ETSI TS 123 502 [2], Clause 4.2.2.2.2 ETSI TS 124 501 [1], Clauses 5.4.3.2 and 8.2.21" @@ -519,7 +519,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_CNF_COM_01 { - Objective: "Verify that the IUT does not retransmit a CONFIGURATION_UPDATE_COMMAND containing { only NITZ-related information elements when the Configuration update indication IE is absent or indicates that acknowledgement is not requested." + Objective: "Verify that the IUT does not retransmit a CONFIGURATION_UPDATE_COMMAND containing only NITZ-related information elements when the Configuration update indication IE is absent or indicates that acknowledgement is not requested." // Example trigger observed in implementation: CONFIGURATION_UPDATE_COMMAND sent after PDU_SESSION_ESTABLISHMENT_REQUEST; // note that the base specification does not explicitly define when the CONFIGURATION_UPDATE_COMMAND shall be sent. @@ -575,7 +575,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_DLN_ACC_01 { - Objective: "Verify that the IUT, upon receipt of a UL NAS TRANSPORT message containing { a PDU SESSION ESTABLISHMENT REQUEST, sends a PDU_SESSION_RESOURCE_SETUP_REQUEST carrying a DL NAS TRANSPORT message with a PDU SESSION ESTABLISHMENT ACCEPT." + Objective: "Verify that the IUT, upon receipt of a UL NAS TRANSPORT message containing a PDU SESSION ESTABLISHMENT REQUEST, sends a PDU_SESSION_RESOURCE_SETUP_REQUEST carrying a DL NAS TRANSPORT message with a PDU SESSION ESTABLISHMENT ACCEPT." Reference: "ETSI TS 124 501 [1], Clauses 5.4.5, 6.4.1, 8.2.10 and 8.2.11" @@ -640,7 +640,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_REG_ACC_01 { - Objective: "Verify that, after successful completion of the initial registration procedure over 3GPP access, the IUT sends a REGISTRATION_ACCEPT message containing { the 5GS registration result, TAI list, 5G-GUTI and T3512 value." + Objective: "Verify that, after successful completion of the initial registration procedure over 3GPP access, the IUT sends a REGISTRATION_ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 value." Reference: "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" @@ -1148,7 +1148,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_DRG_REQ_01 { - Objective: "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing { the De-registration type IE with re-registration not required for 3GPP access. **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" + Objective: "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration not required for 3GPP access. **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" Reference: "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" @@ -1228,7 +1228,7 @@ Package TP_AMF_NGNAS { Test Purpose TP_5GNAS_AMF_DRG_REQ_03 { - Objective: "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing { the De-registration type IE with re-registration required for 3GPP access." + Objective: "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration required for 3GPP access." // NOTE: After receipt of this message, the UE is expected to respond with DEREGISTRATION_ACCEPT and to initiate a new registration procedure. These subsequent steps are not part of the verification objective of this TP, but need to be handled by the TTCN-3 test implementation and postamble. // **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" -- GitLab From 49ef81283647fde4a55965d616e232ec0c4fe53f Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 22 May 2026 13:15:47 +0000 Subject: [PATCH 119/151] { removed in Test Objective --- test_purposes/TP_AMF_NGAP.tdltx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test_purposes/TP_AMF_NGAP.tdltx b/test_purposes/TP_AMF_NGAP.tdltx index be9af0f..e15e560 100644 --- a/test_purposes/TP_AMF_NGAP.tdltx +++ b/test_purposes/TP_AMF_NGAP.tdltx @@ -767,7 +767,7 @@ Package TP_AMF_NGAP { Test Purpose TP_NGAP_AMF_IMP_01 { - Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing { the PLMN identity, TAC, and supported slice IEs, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." + Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing the PLMN identity, TAC, and supported slice IEs, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" @@ -825,7 +825,7 @@ Package TP_AMF_NGAP { Test Purpose TP_NGAP_AMF_IMP_02 { - Objective: "Verify that the AMF node successfully decline an NG_SETUP_REQUEST message containing { only PLMNs/SNPNs that does not recognize or support, rejects the NG Setup procedure by responding with NG_SETUP_FAILURE message including the appropriate cause value." + Objective: "Verify that the AMF node successfully decline an NG_SETUP_REQUEST message containing only PLMNs/SNPNs that does not recognize or support, rejects the NG Setup procedure by responding with NG_SETUP_FAILURE message including the appropriate cause value." //Possible test for not supported slice at AMF and cause would be "slice-not-supported"; Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.3, 9.2.6.1 and 9.2.6.3" @@ -945,7 +945,7 @@ Package TP_AMF_NGAP { Test Purpose TP_NGAP_AMF_IMP_01_2 { - Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing { the PLMN identity, TAC, supported slice IEs and Extended RAN Node Name, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." + Objective: "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message containing the PLMN identity, TAC, supported slice IEs and Extended RAN Node Name, and responds with an NG_SETUP_RESPONSE message to acknowledge the setup." Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" @@ -1005,7 +1005,7 @@ Package TP_AMF_NGAP { Test Purpose TP_NGAP_AMF_IMP_01_3 { - Objective: "Verify that the AMF with IAB support successfully processes an NG_SETUP_REQUEST message containing { the PLMN identity, TAC and supported slice IEs, and responds with an NG_SETUP_RESPONSE message containing IAB Supported IE to acknowledge the setup." + Objective: "Verify that the AMF with IAB support successfully processes an NG_SETUP_REQUEST message containing the PLMN identity, TAC and supported slice IEs, and responds with an NG_SETUP_RESPONSE message containing IAB Supported IE to acknowledge the setup." Reference: "ETSI TS 138 413 [1], Clauses 8.7.1.2, 9.2.6.1 and 9.2.6.2" @@ -1071,7 +1071,7 @@ Package TP_AMF_NGAP { Test Purpose TP_NGAP_AMF_IMP_05 { - Objective: "Verify that the AMF node successfully processes a RAN_CONFIGURATION_UPDATE message containing { new slice with RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE to acknowledge the update with supported slice at AMF." + Objective: "Verify that the AMF node successfully processes a RAN_CONFIGURATION_UPDATE message containing new slice with RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE to acknowledge the update with supported slice at AMF." Reference: "ETSI TS 138 413 [1], Clauses 8.7.2.2, 9.2.6.4 and 9.2.6.5" -- GitLab From 6cc5e6ecf8003ebd46802ad47bba0e73446e6e38 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 26 May 2026 06:53:30 +0000 Subject: [PATCH 120/151] Empty comments removed, ! added to some comments to hide them during word conversion --- test_purposes/TP_AMF_NGAP.tdltx | 4 ++-- test_purposes/TP_AMF_NGNAS.tdltx | 40 ++++++++++++++++---------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/test_purposes/TP_AMF_NGAP.tdltx b/test_purposes/TP_AMF_NGAP.tdltx index e15e560..70f7b8e 100644 --- a/test_purposes/TP_AMF_NGAP.tdltx +++ b/test_purposes/TP_AMF_NGAP.tdltx @@ -852,8 +852,8 @@ Package TP_AMF_NGAP { TAI_Slice_Support_List containing { S_NSSAI containing { SST set to PX_SST, - SD set to PX_SD}}}}}//, - //Default_Paging_DRX + SD set to PX_SD}}}}}, + //!Default_Paging_DRX }} from the GNB entity } diff --git a/test_purposes/TP_AMF_NGNAS.tdltx b/test_purposes/TP_AMF_NGNAS.tdltx index 7681837..4f6ef94 100644 --- a/test_purposes/TP_AMF_NGNAS.tdltx +++ b/test_purposes/TP_AMF_NGNAS.tdltx @@ -43,7 +43,7 @@ Package TP_AMF_NGNAS { when { the IUT entity receives an INITIAL_UE_MESSAGE containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to REGISTRATION_REQUEST, 5GS_registration_type containing { @@ -61,7 +61,7 @@ Package TP_AMF_NGNAS { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_REQUEST, ngKSI containing { @@ -105,7 +105,7 @@ Package TP_AMF_NGNAS { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_RESPONSE, authentication_response_parameter containing { @@ -115,7 +115,7 @@ Package TP_AMF_NGNAS { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_REJECT}} to the GNB entity @@ -178,7 +178,7 @@ Package TP_AMF_NGNAS { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to MAC_failure}} @@ -187,7 +187,7 @@ Package TP_AMF_NGNAS { then { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to IDENTITY_REQUEST, identity_type set to SUCI}} @@ -214,7 +214,7 @@ Package TP_AMF_NGNAS { security_header_type set to NOT_SECURITY_PROTECTED, message_type set to AUTHENTICATION_REQUEST, ngKSI containing { - nas_key_set_identifier set to "111"}, //value for nas_key_set_identifier was already used before + nas_key_set_identifier set to "111"}, //!value for nas_key_set_identifier was already used before ABBA containing { ABBA_contents set to " '0000'H "}, Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, @@ -227,7 +227,7 @@ Package TP_AMF_NGNAS { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to ngKSI_already_in_use}} @@ -275,7 +275,7 @@ Package TP_AMF_NGNAS { ABBA containing { ABBA_contents set to " '0000'H "}, Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN set to PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE}} //the "separation bit" in the AMF field of AUTN is set to 0 + Authentication_parameter_AUTN set to PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE}} //!the "separation bit" in the AMF field of AUTN is set to 0 to the GNB entity } @@ -284,7 +284,7 @@ Package TP_AMF_NGNAS { when { the IUT entity receives an UPLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED, message_type set to AUTHENTICATION_FAILURE, 5GMM_cause set to "Non-5G authentication unacceptable (26)"}} @@ -333,17 +333,17 @@ Package TP_AMF_NGNAS { Expected behaviour ensure that { when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing { // AUTHENTICATION_RESPONSE + the IUT entity receives a UPLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_RESPONSE}} //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + message_type set to AUTHENTICATION_RESPONSE}} //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values from the GNB entity } then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { // SECURITY_MODE_COMMAND + the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, message_type set to SECURITY_MODE_COMMAND, selected_NAS_security_algorithms containing { @@ -351,7 +351,7 @@ Package TP_AMF_NGNAS { type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM}, ngKSI containing { nas_key_set_identifier set to "111"}, - replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES}} // UE security capability 9.11.3.54 + replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES}} //! UE security capability 9.11.3.54 to the GNB entity } } @@ -738,7 +738,7 @@ Package TP_AMF_NGNAS { Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, MSIN set to PX_MSIN}, 5GS_update_type containing { - SMS_over_NAS_transport_requested set to 1}}} //SMS over NAS supported + SMS_over_NAS_transport_requested set to 1}}} //!SMS over NAS supported from the GNB entity } then { @@ -749,7 +749,7 @@ Package TP_AMF_NGNAS { message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing { 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 1}}} //SMS over NAS allowed + SMS_over_NAS_transport_allowed set to 1}}} //!SMS over NAS allowed to the GNB entity } } @@ -791,7 +791,7 @@ Package TP_AMF_NGNAS { Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, MSIN set to PX_MSIN}, 5GS_update_type containing { - SMS_over_NAS_transport_requested set to 1}}} //SMS over NAS supported + SMS_over_NAS_transport_requested set to 1}}} //!SMS over NAS supported from the GNB entity } then { @@ -802,7 +802,7 @@ Package TP_AMF_NGNAS { message_type set to REGISTRATION_ACCEPT, 5GS_registration_result containing { 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 0}}} //SMS over NAS not allowed + SMS_over_NAS_transport_allowed set to 0}}} //!SMS over NAS not allowed to the GNB entity } } -- GitLab From 52b24aaeda316e3afd0146157929cc8d0c5df01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Thu, 28 May 2026 16:38:39 +0200 Subject: [PATCH 121/151] TPLan files removed --- test_purposes/Ngnas_Common.tplan2 | 357 ------ test_purposes/ngnas/TP_AMF_NGNAS.tplan2 | 1325 ----------------------- 2 files changed, 1682 deletions(-) delete mode 100644 test_purposes/Ngnas_Common.tplan2 delete mode 100644 test_purposes/ngnas/TP_AMF_NGNAS.tplan2 diff --git a/test_purposes/Ngnas_Common.tplan2 b/test_purposes/Ngnas_Common.tplan2 deleted file mode 100644 index 63f8e5f..0000000 --- a/test_purposes/Ngnas_Common.tplan2 +++ /dev/null @@ -1,357 +0,0 @@ -/* ETSI Software License -* As long as the here under conditions are respected, non-exclusive permission is hereby granted, -* free of charge, to use, reproduce and modify this software source code, under the following conditions: -* This source code is provided AS IS with no warranties, express or implied, including but not limited to, -* the warranties of merchant ability, fitness for a particular purpose and warranties for non-infringement -* of intellectual property rights. -* ETSI shall not be held liable in any event for any direct or indirect damages whatsoever (including, without -* limitation, damages for loss of profits, business interruption, loss of information, or any other pecuniary -* loss) arising out of or related to the use of or inability to use the source code. -* This permission is granted to facilitate the implementation of the related ETSI standard, provided that -* ETSI is given the right to use, reproduce and amend the modified source code under the same conditions -* as the present permission. -* This permission does not apply to any documentation associated with this source code for which ETSI keeps -* all rights reserved. -* The present ETSI Source Code license shall be included in all copies of whole or part of this source code -* and shall not imply any sub-license right. -* (c) ETSI 2023-2024 -*/ - - -Package Ngnas_Common { - Domain { - pics: - - NONE - //5G NAS PICS - - PICS_A2/1 //AMF - - PICS_A3/1 //5GMM-DEREGISTERED - - PICS_A3/2 //5GMM-COMMON-PROCEDURE-INITIATED - - PICS_A3/3 //5GMM-REGISTERED - - PICS_A3/4 //5GMM-DEREGISTERED-INITIATED - - PICS_A3/5 //5GSM-PDU SESSION INACTIVE - - PICS_A3/6 //5GSM-PDU SESSION ACTIVE - - PICS_A3/7 //5GSM-PDU SESSION INACTIVE PENDING - - PICS_A3/8 //5GSM-PDU SESSION MODIFICATION PENDING - - PICS_A3/9 //5GSM-PROCEDURE TRANSACTION INACTIVE - - PICS_A3/10 //5GSM-PROCEDURE TRANSACTION PENDING - - PICS_A4/1 //5GMM-Primary authentication and key agreement procedures - - PICS_A4/1_1 //Initiation and control of the EAP based primary authentication and key agreement procedures - - PICS_A4/1_2 //Initiation and control of the 5G AKA based primary authentication and key agreement procedures - - PICS_A4/1_2_1_1 //Provision of new authentication parameters to the UE on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #21 "synch failure" - - PICS_A4/1_2_1_2 //Termination of the 5G AKA based primary authentication and key agreement procedure with AUTHENTICATION REJECT on receipt of two consecutive AUTHENTICATION FAILURE message containing 5GMM cause #21 "synch failure" - - PICS_A4/1_2_2_1 //Initiation of the identification procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #20 "MAC failure" - - PICS_A4/1_2_2_2 //Termination of the 5G AKA based primary authentication and key agreement procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #20 "MAC failure" - - PICS_A4/1_2_3_1 //Initiation of the identification procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #26 "non-5G authentication unacceptable" - - PICS_A4/1_2_3_2 //Termination of the 5G AKA based primary authentication and key agreement procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #26 "non-5G authentication unacceptable" - - PICS_A4/1_2_4 //Re-initiation of the 5G AKA based primary authentication and key agreement procedure on receipt of an AUTHENTICATION FAILURE message containing 5GMM cause #71 "ngKSI already in use" - - PICS_A4/2 //Security mode control procedures - - PICS_A4/2_1 //Initiation of the security mode control procedure to take a 5G NAS security context into use, and initialise and start NAS signalling security - - PICS_A4/2_2 //Initiation of the security mode control procedure to change the 5G NAS security algorithms for a current 5G NAS security context already in use - - PICS_A4/2_3 //Initiation of the security mode control procedure to change the value of uplink NAS COUNT used in the latest SECURITY MODE COMPLETE message - - PICS_A4/2_4 //Initiation of the security mode control procedure to provide the Selected EPS NAS security algorithms to the UE - - PICS_A4/3 //Identification procedures - - PICS_A4/4 //Generic UE configuration update procedures - - PICS_A4/4_1 //Sending of CONFIGURATION UPDATE COMMAND messages to the UE? - - PICS_A4/5 //NAS transport procedures - - PICS_A4/5_1 //UE-initiated NAS transport procedures (receipt of UL NAS TRANSPORT messages) - - PICS_A4/5_1_1 //Sending back to the UE 5GSM messages which were not forwarded due to abnormal case on the network side - - PICS_A4/5_2 //Network-initiated NAS transport procedures (sending of DL NAS TRANSPORT messages) - - PICS_A4/6 //5GMM status procedures - - PICS_A4/7 //Network slice-specific authentication and authorization procedures - - PICS_A4/8 //Registration procedures - - PICS_A4/8_1 //Initial registration procedures - - PICS_A4/8_1_1_1 //Initiation of 5GMM common procedures during the initial registration procedure - - PICS_A4/8_1_1_2 //Skipping of the authentication procedure during an (initial) emergency registration procedure, if the AMF is configured to support emergency registration for unauthenticated SUCIs - - PICS_A4/8_1_2_1 //Inclusion of service area restrictions in the Service area list IE in the REGISTRATION ACCEPT message - - PICS_A4/8_1_2_2 //Inclusion of a list of equivalent PLMNs in the REGISTRATION ACCEPT message - - PICS_A4/8_1_2_3 //Inclusion of rejected NSSAI (S-NSSAIs which are included in the requested NSSAI in the REGISTRATION REQUEST message but rejected by the network) in the REGISTRATION ACCEPT message - - PICS_A4/8_1_2_4 //Inclusion of operator-defined access category definitions in the REGISTRATION ACCEPT message - - PICS_A4/8_1_3 //SMS over NAS in initial registration - - PICS_A4/8_1_4 //MICO mode in initial registration i.e., inclusion of the MICO indication IE in the REGISTRATION ACCEPT message - - PICS_A4/8_2 //Registration procedures for mobility and periodic registration update - - PICS_A4/8_2_1_1 //Initiation of 5GMM common procedures during the mobility and periodic registration update procedure - - PICS_A4/8_2_1_2 //Skipping of the authentication procedure during the registration procedure for mobility and periodic registration update for a UE that has only an emergency PDU session - - PICS_A4/8_2_2_1 //Inclusion of a new TAI list for the UE in the REGISTRATION ACCEPT message - - PICS_A4/8_2_2_2 //Inclusion of a list of equivalent PLMNs in the REGISTRATION ACCEPT message - - PICS_A4/8_2_2_3 //Inclusion of new service area restrictions in the Service area list IE in the REGISTRATION ACCEPT message - - PICS_A4/8_2_2_4 //Inclusion of rejected NSSAI (S-NSSAIs which are included in the requested NSSAI in the REGISTRATION REQUEST message but rejected by the network) in the REGISTRATION ACCEPT message - - PICS_A4/8_2_2_5 //Inclusion of the LADN information IE in the REGISTRATION ACCEPT message - - PICS_A4/8_2_2_6 //Inclusion of operator-defined access category definitions in the REGISTRATION ACCEPT message - - PICS_A4/8_2_3 //SMS over NAS in mobility and periodic registration updates - - PICS_A4/8_2_4 //MICO mode in mobility and periodic registration updates i.e., inclusion of the MICO indication IE in the REGISTRATION ACCEPT message - - PICS_A4/9 //Deregistration procedures - - PICS_A4/9_1 //UE-initiated deregistration procedures - - PICS_A4/9_2 //Network-initiated deregistration procedures - - PICS_A4/9_2_1 //Inclusion of the 5GMM cause IE to specify the reason for the deregistration in the DEREGISTRATION REQUEST message - - PICS_A4/10 //Service request procedures - - PICS_A4/10_1 //Initiation of common procedures during the service request procedure (receipt of SERVICE REQUEST or CONTROL PLANE SERVICE REQUEST message) - - PICS_A4/11 //Paging procedures - - PICS_A4/11_1 //Re-initiation of network paging on expiry of timer T3513 - - PICS_A4/12 //Notification procedures - - PICS_A5/1 //PDU session authentication and authorization procedures - - PICS_A5/2 //Network-requested PDU session modification procedures - - PICS_A5/3 //Network-requested PDU session release procedures - - PICS_A5/6 //UE-requested PDU session establishment procedures - - PICS_A5/6_1 //Inclusion of the Back-off timer value IE in the PDU SESSION ESTABLISHMENT REJECT message, if a PDU session establishment procedure is not accepted by the network - - PICS_A5/7 //UE-requested PDU session modification procedures - - PICS_A5/7_1 //Inclusion of the Back-off timer value IE in the PDU SESSION MODIFICATION REJECT message, if a PDU session modification procedure is not accepted by the network - - PICS_A5/8 //UE-requested PDU session release procedures - - PICS_A5/9 //5GMM status procedures - - PICS_A5/10 //Exchange of extended protocol configuration options - - PICS_A6/1 //Procedures for handling of unknown, unforeseen, and erroneous protocol data? - - PICS_A6/1_1 //Handling (i.e., ignoring) of messages that are too short to contain a complete message type information element - - PICS_A6/1_2_1 //Handling of an unknown, erroneous, or unforeseen PTI received in a 5GSM message - - PICS_A6/1_2_2 //Handling of an unknown, erroneous, or unforeseen PDU session identity received in the header of a 5GSM message - - PICS_A6/1_3 //Sending of a 5GMM STATUS or 5GSM STATUS message (depending on the EPD) with cause #97 "message type non-existent or not implemented" on receipt of a message with message type not defined for the EPD or not implemented by the receiver - - PICS_A6/1_4_1 //Treating messages (see note) received with non-semantical mandatory information element errors - - PICS_A6/1_4_2 //Ignoring messages (see note) received with non-semantical mandatory information element errors - - PICS_A6/1_4_3 //Rejection of PDU SESSION ESTABLISHMENT REQUEST, PDU SESSION MODIFICATION REQUEST, and PDU SESSION RELEASE REQUEST messages with cause #96 "invalid mandatory information" when an error is encountered with a mandatory information element in the 5GSM message - - PICS_A6/1_5 //Handling of messages containing unknown or unforeseen (out of sequence, repeated) IEs in the non-imperative message part - - PICS_A6/1_6_1 //Treating messages received missing a conditional IE or containing an unexpected or a syntactically incorrect conditional IE - - PICS_A6/1_6_2 //Ignoring messages received missing a conditional IE or containing an unexpected or a syntactically incorrect conditional IE - - PICS_A6/1_6_2_1 //Returning a status message (5GMM STATUS or 5GSM STATUS depending on the EPD) with cause #100 "conditional IE error" when ignoring a message received missing a conditional IE or containing an unexpected or a syntactically incorrect conditional IE - - PICS_A6/1_7 //Responding to messages (where a reaction is foreseen) with semantically incorrect contents with status messages (5GMM STATUS or 5GSM STATUS depending on the EPD) with cause #95 "semantically incorrect message - - ; - entities: - - UE - - GNB - - AMF - - IUT - ; - events: - - receives - - receive - - sends - - send - - forwards - - aborts - // Initial conditions - - isNotRegisteredToAMF - - isRegisteredToAMF - - hasEstablishedInitialContext - - hasEstablishedPDUsession - - indicateConnectionEstablishmentIndicationProcedure - - hasEstablished_NG_C_AssociationToAMF - - hasNotEstablished_NG_C_AssociationToAMF - - hasEstablishedTNL_AssociationToAMF - - processTheUEderegistration - - isInOverloadedState - //When Triggers - - u_Plane_inactivity_timer_expires - - hasSuccessfullyEstablishedTNLconnection - - indicateUEdeactivation - - indicateUEderegistration - ; - event templates: - /* This template can be used as default AUTHENTICATION_REQUEST message within a DOWNLINK NAS TRANSPORT message. */ - - AUTHENTICATION_REQUEST { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, - ABBA containing - ABBA_contents set to '0000'H;, - Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; - to the GNB entity - } - /* This template can be used as default SECURITY_MODE_COMMAND message within a DOWNLINK NAS TRANSPORT message. */ - - SECURITY_MODE_COMMAND { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // SECURITY_MODE_COMMAND - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - message_type set to SECURITY_MODE_COMMAND, - selected_NAS_security_algorithms containing - type_of_ciphering_algorithm set to PX_SELECTED_NAS_CIPHERING_ALGORITHM, - type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM;, - ngKSI containing - nas_key_set_identifier set to "111";, - replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES;; // UE security capability 9.11.3.54 - to the GNB entity - } - ; - } // End of Domain section - - Data { - - type NgapMessage; - type Cause; - type Bitstring; - type PIXIT; - - PIXIT PX_WRONG_ARP_IEI; //0x20 - - //Table 8.1-1 - NgapMessage AMF_CONFIGURATION_UPDATE; - NgapMessage AMF_CONFIGURATION_UPDATE_ACKNOWLEDGE; - NgapMessage AMF_CONFIGURATION_UPDATE_FAILURE; - NgapMessage RAN_CONFIGURATION_UPDATE; - NgapMessage RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE; - NgapMessage RAN_CONFIGURATION_UPDATE_FAILURE; - NgapMessage HANDOVER_CANCEL; - NgapMessage HANDOVER_CANCEL_ACKNOWLEDGE; - NgapMessage HANDOVER_REQUIRED; - NgapMessage HANDOVER_COMMAND; - NgapMessage HANDOVER_PREPARATION_FAILURE; - NgapMessage HANDOVER_REQUEST ; - NgapMessage HANDOVER_REQUEST_ACKNOWLEDGE; - NgapMessage HANDOVER_FAILURE; - NgapMessage INITIAL_CONTEXT_SETUP_REQUEST; - NgapMessage INITIAL_CONTEXT_SETUP_RESPONSE; - NgapMessage INITIAL_CONTEXT_SETUP_FAILURE; - NgapMessage NG_RESET; - NgapMessage NG_RESET_ACKNOWLEDGE; - NgapMessage NG_SETUP_REQUEST; - NgapMessage NG_SETUP_RESPONSE; - NgapMessage NG_SETUP_FAILURE; - NgapMessage PATH_SWITCH_REQUEST; - NgapMessage PATH_SWITCH_REQUEST_ACKNOWLEDGE; - NgapMessage PATH_SWITCH_REQUEST_FAILURE; - NgapMessage PDU_SESSION_RESOURCE_MODIFY_REQUEST; - NgapMessage PDU_SESSION_RESOURCE_MODIFY_RESPONSE; - NgapMessage PDU_SESSION_RESOURCE_MODIFY_INDICATION; - NgapMessage PDU_SESSION_RESOURCE_MODIFY_CONFIRM; - NgapMessage PDU_SESSION_RESOURCE_RELEASE_COMMAND; - NgapMessage PDU_SESSION_RESOURCE_RELEASE_RESPONSE; - NgapMessage PDU_SESSION_RESOURCE_SETUP_REQUEST; - NgapMessage PDU_SESSION_RESOURCE_SETUP_RESPONSE; - NgapMessage UE_CONTEXT_MODIFICATION_REQUEST; - NgapMessage UE_CONTEXT_MODIFICATION_RESPONSE; - NgapMessage UE_CONTEXT_MODIFICATION_FAILURE; - NgapMessage UE_CONTEXT_RELEASE_COMMAND; - NgapMessage UE_CONTEXT_RELEASE_COMPLETE; - NgapMessage WRITE_REPLACE_WARNING_REQUEST; - NgapMessage WRITE_REPLACE_WARNING_RESPONSE; - NgapMessage PWS_CANCEL_REQUEST; - NgapMessage PWS_CANCEL_RESPONSE; - NgapMessage UE_RADIO_CAPABILITY_CHECK_REQUEST; - NgapMessage UE_RADIO_CAPABILITY_CHECK_RESPONSE; - NgapMessage UE_CONTEXT_SUSPEND_REQUEST; - NgapMessage UE_CONTEXT_SUSPEND_RESPONSE; - NgapMessage UE_CONTEXT_SUSPEND_FAILURE; - NgapMessage UE_CONTEXT_RESUME_REQUEST; - NgapMessage UE_CONTEXT_RESUME_RESPONSE; - NgapMessage UE_CONTEXT_RESUME_FAILURE; - NgapMessage UE_RADIO_CAPABILITY_ID_MAPPING_REQUEST; - NgapMessage UE_RADIO_CAPABILITY_ID_MAPPING_RESPONSE; - - //Table 8.1-2 - NgapMessage DOWNLINK_RAN_CONFIGURATION_TRANSFER; - NgapMessage DOWNLINK_RAN_STATUS_TRANSFER; - NgapMessage DOWNLINK_NAS_TRANSPORT; - NgapMessage ERROR_INDICATION; - NgapMessage UPLINK_RAN_CONFIGURATION_TRANSFER; - NgapMessage UPLINK_RAN_STATUS_TRANSFER; - NgapMessage HANDOVER_NOTIFY; - NgapMessage INITIAL_UE_MESSAGE; - NgapMessage NAS_NON_DELIVERY_INDICATION; - NgapMessage PAGING; - NgapMessage PDU_SESSION_RESOURCE_NOTIFY; - NgapMessage REROUTE_NAS_REQUEST; - NgapMessage UE_CONTEXT_RELEASE_REQUEST; - NgapMessage UPLINK_NAS_TRANSPORT; - NgapMessage AMF_STATUS_INDICATION; - NgapMessage PWS_RESTART_INDICATION; - NgapMessage PWS_FAILURE_INDICATION; - NgapMessage DOWNLINK_UE_ASSOCIATED_NRPPA_TRANSPORT; - NgapMessage UPLINK_UE_ASSOCIATED_NRPPA_TRANSPORT; - NgapMessage DOWNLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT; - NgapMessage UPLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT; - NgapMessage TRACE_START; - NgapMessage TRACE_FAILURE_INDICATION; - NgapMessage DEACTIVATE_TRACE; - NgapMessage CELL_TRAFFIC_TRACE; - NgapMessage LOCATION_REPORTING_CONTROL; - NgapMessage LOCATION_REPORTING_FAILURE_INDICATION; - NgapMessage LOCATION_REPORT; - NgapMessage UE_TNLA_BINDING_RELEASE_REQUEST; - NgapMessage UE_RADIO_CAPABILITY_INFO_INDICATION; - NgapMessage RRC_INACTIVE_TRANSITION_REPORT; - NgapMessage OVERLOAD_START; - NgapMessage OVERLOAD_STOP; - NgapMessage SECONDARY_RAT_DATA_USAGE_REPORT; - NgapMessage UPLINK_RIM_INFORMATION_TRANSFER; - NgapMessage DOWNLINK_RIM_INFORMATION_TRANSFER; - NgapMessage RETRIEVE_UE_INFORMATION; - NgapMessage UE_INFORMATION_TRANSFER; - NgapMessage RAN_CP_RELOCATION_INDICATION; - NgapMessage CONNECTION_ESTABLISHMENT_INDICATION; - NgapMessage AMF_CP_RELOCATION_INDICATION; - NgapMessage HANDOVER_SUCCESS; - NgapMessage UPLINK_RAN_EARLY_STATUS_TRANSFER; - NgapMessage DOWNLINK_RAN_EARLY_STATUS_TRANSFER; - - NgapMessage SECURITY_MODE_COMPLETE; - NgapMessage SECURITY_MODE_REJECT; - - //Table 8.2 - NgapMessage AUTHENTICATION_REQUEST; - NgapMessage AUTHENTICATION_RESPONSE; - - // Table 9.3.1: Security header type - Bitstring PLAIN_5GS_NAS_MESSAGE; // 0 0 0 0 , not security protected - Bitstring INTEGRITY_PROTECTED; // 0 0 0 1 - Bitstring INTEGRITY_PROTECTED_AND_CIPHERED; // 0 0 1 0 - Bitstring INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT; // 0 0 1 1 - Bitstring INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_5G_NAS_SECURITY_CONTEXT; // 0 1 0 0 - - //Section 9.11.3.2 - Cause MAC_failure; - - - - } // End of Data section - - Configuration { - Interface Type defaultGT accepts NgapMessage; - Component Type NgapComponent with gate g of type defaultGT; - Component Type NgapComponent with gate g2 of type defaultGT; - - - Test Configuration CF_GNB_N2N1 - containing - Tester component AMF of type NgapComponent - SUT component IUT of type NgapComponent - connection between AMF.g and IUT.g; - - Test Configuration CF_AMF_N2N1 - containing - Tester component GNB of type NgapComponent - SUT component IUT of type NgapComponent - connection between GNB.g and IUT.g; - - - Test Configuration CF_GNB_2N2 - containing - Tester component AMF of type NgapComponent - SUT component IUT of type NgapComponent - connection between AMF.g and IUT.g; - - Test Configuration CF_AMF_2N2 - containing - Tester component GNB of type NgapComponent - SUT component IUT of type NgapComponent - connection between GNB.g and IUT.g; - - Test Configuration CF_GNB_2N2N1 - containing - Tester component AMF of type NgapComponent - SUT component IUT of type NgapComponent - connection between AMF.g and IUT.g; - - Test Configuration CF_AMF_2N2N1 - containing - Tester component GNB of type NgapComponent - SUT component IUT of type NgapComponent - connection between GNB.g and IUT.g; - - } - - -} // End of Package Ngnas_Common - diff --git a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 b/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 deleted file mode 100644 index 811625d..0000000 --- a/test_purposes/ngnas/TP_AMF_NGNAS.tplan2 +++ /dev/null @@ -1,1325 +0,0 @@ -/* -Copyright (c) ETSI 2025. - -This software is subject to copyrights owned by ETSI. Non-exclusive permission -is hereby granted, free of charge, to copy, reproduce and amend this file -under the following conditions: It is provided "as is", without warranty of any -kind, expressed or implied. - -ETSI shall never be liable for any claim, damages, or other liability arising -from its use or inability of use.This permission does not apply to any documentation -associated with this file for which ETSI keeps all rights reserved. The present -copyright notice shall be included in all copies of whole or part of this -file and shall not imply any sub-license right. -*/ - -/* interface at AMF */ -Package TP_AMF { - - - Group "5.4 5GMM Common Procedures" - { - Group "5.4.1 Primary authentication and key agreement procedure" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_01 - - Test objective "Verify that the IUT sends an AUTHENTICATION_REQUEST message upon receipt of an initial REGISTRATION_REQUEST containing a SUCI, when no active 5G NAS security context exists." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.2 and 8.2.1" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/1_2 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;;; - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, - ABBA containing - ABBA_contents set to '0000'H;, - Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; - to the GNB entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_02 - - Test objective "Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.5 and 8.2.5" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/1_2 - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - Type_of_identity set to SUCI;;; and - event AUTHENTICATION_REQUEST occurs - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_RESPONSE, - authentication_response_parameter containing - RES set to PX_INVALID_RES_VALUE;;; - from the GNB entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_REJECT;; - to the GNB entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_02 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_03 - - Test objective "Verify that the IUT stops re-sending an AUTHENTICATION_REQUEST message if no AUTHENTICATION_RESPONSE message is received on the fifth expire of timer T3560." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF - and (.) at time point start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 6s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 12s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - and (!) 18s after start_initial_T3560 : event AUTHENTICATION_REQUEST occurs - } - Expected behaviour - ensure that { - when { - (.) at time point start_trigger_T3560 : event AUTHENTICATION_REQUEST occurs - } - then { - (!) 6s after start_trigger_T3560 : the IUT entity aborts an AUTHENTICATION_REQUEST procedure - (Note 1: "It is not expected to receive another AUTHENTICATION message on the N2N1 interface.") - } - } - } // end TP_5GNAS_AMF_AUT_REQ_03 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_04 - - Test objective "Verify that the IUT sends an IDENTITY_REQUEST message correctly upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #20 - MAC failure." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c), 5.4.3 and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - security_header_type set to INTEGRITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - authentication_parameter_AUTN containing - AUTN set to PX_WRONG_MAC_CODE;;; - to the GNB entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - message_type set to AUTHENTICATION_FAILURE, - 5GMM_cause set to MAC_failure;; - from the GNB entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - message_type set to IDENTITY_REQUEST, - identity_type set to SUCI;; - to the GNB entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_04 - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_REQ_05 - - Test objective "Verify that the IUT sends a new AUTHENTICATION_REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, //value for nas_key_set_identifier was already used before - ABBA containing - ABBA_contents set to '0000'H;, - Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; - to the GNB entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - message_type set to AUTHENTICATION_FAILURE, - 5GMM_cause set to ngKSI_already_in_use;; - from the GNB entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to PX_NON_DEFAULT_NGKSI;, - ABBA containing - ABBA_contents set to '0000'H;, - Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN;; - to the GNB entity - } - } - } // end TP_5GNAS_AMF_AUT_REQ_05 - - - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_ABN_01 - - Test objective "Verify that the IUT sends an IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.1.3.7, 8.2.4, 5.4.3.2 and 8.2.21.1" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/1_2_3_1 - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - ngKSI containing - nas_key_set_identifier set to "111";, - ABBA containing - ABBA_contents set to '0000'H;, - Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, - Authentication_parameter_AUTN set to PX_Authentication_parameter_AUTN_NON_5G_UNACCEPTABLE;; //the "separation bit" in the AMF field of AUTN is set to 0 - to the GNB entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED, - message_type set to AUTHENTICATION_FAILURE, - 5GMM_cause set to "Non-5G authentication unacceptable (26)";; - from the GNB entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to IDENTITY_REQUEST, - identity_type set to SUCI;; - to the GNB entity - } - } - - } // end TP_5GNAS_AMF_AUT_ABN_01 - - } // end Group Primary authentication and key agreement procedure - - Group "5.4.2 Security mode control procedure" - { - - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_AUT_SEQ_01 - - Test objective "Verify that the IUT sends a SECURITY_MODE_COMMAND message to initiate the NAS security mode control procedure upon receipt of an AUTHENTICATION_RESPONSE message in a 5G AKA based primary authentication procedure." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.2.2, 5.4.2.3 and 8.2.25" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2_1 - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - event AUTHENTICATION_REQUEST occurs with { - argument replaced by the AUTHENTICATION_REQUEST containing - security_header_type set to NOT_SECURITY_PROTECTED; - } - } - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing // AUTHENTICATION_RESPONSE - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to AUTHENTICATION_RESPONSE;; //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - from the GNB entity - } - then { - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing // SECURITY_MODE_COMMAND - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - message_type set to SECURITY_MODE_COMMAND, - selected_NAS_security_algorithms containing - type_of_ciphering_algorithm set to PX_SELECTED_NAS_CIPHERING_ALGORITHM, - type_of_integrity_algorithm set to PX_SELECTED_NAS_INTEGRITY_ALGORITHM;, - ngKSI containing - nas_key_set_identifier set to "111";, - replayed_UE_security_capabilities set to PX_UE_SECURITY_CAPABILITIES;; // UE security capability 9.11.3.54 - to the GNB entity - } - } - } // end TP_5GNAS_AMF_AUT_SEQ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_SEC_ACC_01 - - Test objective "Verify that the IUT, upon receiving the NAS SECURITY_MODE_COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.2.4, 5.5.1.2.4, 8.2.7 and 8.2.26" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - - Expected behaviour - ensure that { - when { - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - message_type set to SECURITY_MODE_COMPLETE;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS;, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - MCC set to PX_MCC, - MNC set to PX_MNC, - TAC set to PX_TAC;;, - T3512_value containing - Timer_value set to nonZeroValue;;; - to the GNB entity - } - - } - - } // end TP_5GNAS_AMF_SEC_ACC_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_SEC_REJ_01 - - Test objective "Verify that the IUT aborts the ongoing procedure that triggered the NAS security mode control procedure upon receipt of a SECURITY_MODE_REJECT message containing 5GMM cause #23 'UE security capabilities mismatch'." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.2.5 and 8.2.27" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/2 - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - (.) at time point start_SMC_event : event SECURITY_MODE_COMMAND occurs - } - - Expected behaviour - ensure that { - when { - (.) at time point start_SMC_event : event SECURITY_MODE_COMMAND occurs and - the IUT entity receives a UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_WITH_NEW_5G_NAS_SECURITY_CONTEXT, - message_type set to SECURITY_MODE_REJECT, - 5GMM_cause set to "UE security capabilities mismatch (23)";; - from the GNB entity - } - then { - // PX_SEC_ABORT_TWAIT: observation timer to verify that no further registration progression occurs - (!) PX_SEC_ABORT_TWAIT after start_SMC_event : the IUT entity does not send a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - message_type set to REGISTRATION_ACCEPT;; - to the GNB entity - (Note 1: "The IUT is expected to abort the ongoing procedure and shall not proceed with registration completion.") - } - - } - - } // end TP_5GNAS_AMF_SEC_REJ_01 - - - - } // end Group Security mode control procedure - - Group "5.4.3 Identification procedure" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_IDN_REQ_01 - - Test objective "Verify that the IUT initiates the identification procedure by sending an IDENTITY_REQUEST message with identity type set to SUCI when the IUT receives a REGISTRATION_REQUEST message containing a 5G-GUTI that is not known by the IUT." - - Reference - "ETSI TS 123 502 [2], Clause 4.2.2.2.2 - ETSI TS 124 501 [1], Clauses 5.4.3.2 and 8.2.21" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/3 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to PX_UNASSIGNED_5G_TMSI;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - message_type set to IDENTITY_REQUEST, - identity_type set to SUCI;; - to the GNB entity - } - } - - } // end TP_5GNAS_AMF_IDN_REQ_01 - - } // end Group Identification procedure - - Group "5.4.4 Generic UE configuration update procedure" - { - import all from Ngnas_Common; - - Test Purpose { - TP Id TP_5GNAS_AMF_CNF_COM_01 - - Test objective "Verify that the IUT does not retransmit a CONFIGURATION_UPDATE_COMMAND containing only NITZ-related information elements when the Configuration update indication IE is absent or indicates that acknowledgement is not requested." - // Example trigger observed in implementation: CONFIGURATION_UPDATE_COMMAND sent after PDU_SESSION_ESTABLISHMENT_REQUEST; - // note that the base specification does not explicitly define when the CONFIGURATION_UPDATE_COMMAND shall be sent. - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.4.2 and 8.2.19" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/4_1 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - (.) at time point start_CUC_event :the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to CONFIGURATION_UPDATE_COMMAND, - Full_name_for_network, - Short_name_for_network, - Local_time_zone, - Universal_time_and_local_time_zone, - Daylight_saving_time, - not Configuration_update_indication OR - Configuration_update_indication containing - Acknowledgement_requested set to 0 - ;;; - to the GNB entity - } - then { - // PX_CUC_TWAIT value for timer awaiting no response after CUC message - (!) PX_CUC_TWAIT after start_CUC_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to CONFIGURATION_UPDATE_COMMAND;; - to the GNB entity - (Note 1: "It is not expected to receive a retransmission of the same NITZ-only CONFIGURATION_UPDATE_COMMAND on the N2N1 interface.") - } - } - } // end TP_5GNAS_AMF_CNF_COM_01 - - }//end group Generic UE configuration update procedure - - Group "5.4.5 NAS transport procedure" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_DLN_ACC_01 - - Test objective "Verify that the IUT, upon receipt of a UL NAS TRANSPORT message containing a PDU SESSION ESTABLISHMENT REQUEST, sends a PDU_SESSION_RESOURCE_SETUP_REQUEST carrying a DL NAS TRANSPORT message with a PDU SESSION ESTABLISHMENT ACCEPT." - - Reference - "ETSI TS 124 501 [1], Clauses 5.4.5, 6.4.1, 8.2.10 and 8.2.11" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A5/6 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to UL_NAS_TRANSPORT, - payload_container_type set to "N1 SM information", - payload_container containing - 5GSM_PDU containing - extended_protocol_discriminator set to 5GS_SESSION_MANAGEMENT_MESSAGES, - message_type set to PDU_SESSION_ESTABLISHMENT_REQUEST, - PDU_session_type set to "IPv4", - SSC_mode set to "SSC mode 1";;, - pDU_session_identity set to PX_PDU_session_identity, - request_type set to "Initial request", - s_NSSAI containing - sst set to PX_SST, - sd set to PX_SD;, - dNN set to PX_DNN;; - from the GNB entity - } - then { - the IUT entity sends a PDU_SESSION_RESOURCE_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DL_NAS_TRANSPORT, - payload_container_type set to "N1 SM information", - payload_container containing - 5GSM_PDU containing - extended_protocol_discriminator set to 5GS_SESSION_MANAGEMENT_MESSAGES, - message_type set to PDU_SESSION_ESTABLISHMENT_ACCEPT;;, - pDU_session_identity set to PX_PDU_session_identity;; - to the GNB entity - } - - } - }// end TP_5GNAS_AMF_DLN_ACC_01 - - } // end Group 5.4.5 NAS transport procedure - - } // end Group 5.4 5GMM Common Procedures - - Group "5.5.1.2 Registration Procedure for initial registration" - { - import all from Ngnas_Common; - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_01 - - Test objective "Verify that, after successful completion of the initial registration procedure over 3GPP access, the IUT sends a REGISTRATION_ACCEPT message containing the 5GS registration result, TAI list, 5G-GUTI and T3512 value." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS;, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;, - TAI_list containing - Partial_tracking_area_list_1 containing - MCC set to PX_MCC, - MNC set to PX_MNC, - TAC set to PX_TAC;;, - T3512_value containing - Timer_value set to nonZeroValue;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_01 - - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_02 - - Test objective "Verify that, when the UE requests SMS over NAS transport during initial registration and the IUT supports SMS over NAS in initial registration, the IUT sends a REGISTRATION_ACCEPT message with the SMS allowed bit in the 5GS registration result IE set to 'SMS over NAS allowed'." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1_3 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;, - 5GS_update_type containing - SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 1;;; //SMS over NAS allowed - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_02 - - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_03 - - Test objective "Verify that the IUT sends a REGISTRATION_ACCEPT message with the SMS over NAS transport allowed bit set to 'not allowed' when the UE requests SMS over NAS during initial registration and the IUT does not support SMS over NAS in initial registration." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection not PICS_A4/8_1_3 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;, - 5GS_update_type containing - SMS_over_NAS_transport_requested set to 1;;; //SMS over NAS supported - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_ACCEPT, - 5GS_registration_result containing - 5GS_registration_result_value set to 3GPP_ACCESS, - SMS_over_NAS_transport_allowed set to 0;;; //SMS over NAS not allowed - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_03 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_04 - - Test objective "Verify that the IUT, during the initial registration procedure, sends a REGISTRATION_ACCEPT message including the Allowed NSSAI IE when the UE includes a Requested NSSAI IE in the REGISTRATION_REQUEST message and the IUT allows one or more S-NSSAIs from the requested NSSAI." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;, - Requested_NSSAI containing - S_NSSAI_1 containing - SST set to PX_SST_1, - SD set to PX_SD_1;, - S_NSSAI_2 containing - SST set to PX_SST_2, - SD set to PX_SD_2;;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_ACCEPT, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;, - Allowed_NSSAI containing - S_NSSAI_1 containing - SST set to PX_SST_1, - SD set to PX_SD_1;;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_04 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_ACC_05 - - Test objective "Verify that, during the initial registration procedure, the IUT includes the Rejected NSSAI IE in the REGISTRATION_ACCEPT message when the UE includes a Requested NSSAI IE in the REGISTRATION_REQUEST message and the IUT rejects one or more S-NSSAIs from the requested NSSAI." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.4 and 8.2.7" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/8_1_2_3 - - Initial conditions with { - the UE entity isNotRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;, - Requested_NSSAI containing - S_NSSAI_1 containing - SST set to PX_SST_1, - SD set to PX_SD_1;, - S_NSSAI_2 containing - SST set to PX_SST_Rejected, - SD set to PX_SD_Rejected;;;; - from the GNB entity - } - then { - the IUT entity sends a INITIAL_CONTEXT_SETUP_REQUEST containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to REGISTRATION_ACCEPT, - 5G_GUTI containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;, - Rejected_NSSAI containing - S_NSSAI_1 containing - SST set to PX_SST_Rejected, - SD set to PX_SD_Rejected;;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_ACC_05 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_REJ_01 - - Test objective "Verify that the IUT sends a REGISTRATION_REJECT message with 5GMM cause value #22 'congestion' and includes the T3346 value IE when the initial registration request is rejected due to general NAS level mobility management congestion control." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.1.2.5 and 8.2.9" - - Config Id CF_AMF_N2N1 - - PICS Selection NONE - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - the AMF entity isInOverloadedState - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an INITIAL_UE_MESSAGE containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to NOT_SECURITY_PROTECTED, - message_type set to REGISTRATION_REQUEST, - 5GS_registration_type containing - 5GS_registration_type_value set to INITIAL_REGISTRATION;, - 5GS_mobile_identity containing - SUPI_format set to IMSI, - Type_of_identity set to SUCI, - MCC set to PX_MCC, - MNC set to PX_MNC, - Routing_indicator set to PX_ROUTING_INDICATOR, - Protection_scheme_id set to PX_PROTECTION_SCHEME_ID, - Home_network_public_key_identifier set to PX_HOME_NETWORK_PUBLIC_KEY_IDENTIFIER, - MSIN set to PX_MSIN;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - message_type set to REGISTRATION_REJECT, - 5GMM_cause set to "Congestion (22)", - T3346_value containing - Timer_value set to nonZeroValue;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_REJ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_REG_REJ_02 - - Test objective "Verify that, during the initial registration procedure, the IUT sends a REGISTRATION_REJECT message with 5GMM cause value #9 'UE identity cannot be derived by the network' when the UE responds to an IDENTITY_REQUEST for SUCI with an IDENTITY_RESPONSE indicating that no identity is available." - - Reference - "ETSI TS 123 502 [2], Clause 4.2.2.2.2 - ETSI TS 124 501 [1], Clauses 5.4.3.2, 5.4.3.3, 5.5.1.2.5 and 8.2.9" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/3 - - Initial conditions with { - the UE entity isNotRegisteredToAMF and - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - message_type set to IDENTITY_REQUEST, - identity_type set to SUCI;; - to the GNB entity - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - message_type set to IDENTITY_RESPONSE, - 5GS_mobile_identity containing - Type_of_identity set to NO_IDENTITY;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - message_type set to REGISTRATION_REJECT, - 5GMM_cause set to "UE identity cannot be derived by the network (9)";; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_REG_REJ_02 - - } //end Group "5.5.1.2 Registration Procedure for initial registration" - - Group "5.5.2.2.3 UE-initiated de-registration procedure completion" - { - import all from Ngnas_Common; - - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_ACC_01 - - Test objective "Verify that the IUT sends a DEREGISTRATION_ACCEPT message upon receipt of a UE-originated DEREGISTRATION_REQUEST message indicating normal de-registration." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_1 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off set to NORMAL_DEREGISTRATION, - Reregistration_required set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;;; - from the GNB entity - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_ACCEPT;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_ACC_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_ACC_02 - - Test objective "Verify that the IUT does not send a DEREGISTRATION_ACCEPT message upon receipt of a UE-originated DEREGISTRATION_REQUEST message indicating switch off." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.2.3, 8.2.12 and 8.2.13" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_1 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - (.) at time point start_DRG_event : the IUT entity receives an UPLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off set to SWITCH_OFF, - Reregistration_required set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;;; - from the GNB entity - } - then { - // PX_DRG_TWAIT: Test system observation timer used to verify that no DEREGISTRATION_ACCEPT message is sent after receipt of a switch-off DEREGISTRATION_REQUEST (no corresponding NAS timer defined in the specification) - (!) PX_DRG_TWAIT after start_DRG_event : the IUT entity does not send a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_ACCEPT;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_ACC_02 - - } //end Group "5.5.2.2.3 UE-initiated de-registration procedure completion" - - Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" - { - import all from Ngnas_Common; - - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_REQ_01 - - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration not required for 3GPP access. **NOTE:** explicit network deregistration triggered by O&M - deactivation of UE" - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_2 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity indicateUEdeactivation - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off set to NORMAL_DEREGISTRATION, - Reregistration_required set to REREGISTRATION_NOT_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_REQ_01 - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_REQ_02 - - Test objective "Verify that the IUT retransmits the DEREGISTRATION_REQUEST message if no DEREGISTRATION_ACCEPT is received from the UE. **NOTE:** explicit network deregistration triggered by O&M - UE deregistration." - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.3.1 and 8.2.14" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_2 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity indicateUEdeactivation and - (.) at time point start_DRG_event : the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST;; - to the GNB entity - } - then { - (!) PX_T3522 after start_DRG_event : the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_REQ_02 - - Test Purpose { - - TP Id TP_5GNAS_AMF_DRG_REQ_03 - - Test objective "Verify that the IUT initiates network de-registration by sending a DEREGISTRATION_REQUEST message containing the De-registration type IE with re-registration required for 3GPP access." - // NOTE: After receipt of this message, the UE is expected to respond with DEREGISTRATION_ACCEPT and to initiate a new registration procedure. These subsequent steps are not part of the verification objective of this TP, but need to be handled by the TTCN-3 test implementation and postamble. - // **NOTE 1:** UE sends DEREGISTRATION_ACCEPT and starts with re-registration procedure.(also used ref 5.5.2.3.2 1st paragraph) **NOTE 2:** explicit network deregistration triggered by O&M - UE deregistration" - - Reference - "ETSI TS 124 501 [1], Clauses 5.5.2.3.1, 5.5.2.3.2 and 8.2.14" - - Config Id CF_AMF_N2N1 - - PICS Selection PICS_A4/9_2 - - Initial conditions with { - the UE entity isRegisteredToAMF - } - - Expected behaviour - ensure that { - when { - the IUT entity indicateUEderegistration - } - then { - the IUT entity sends a DOWNLINK_NAS_TRANSPORT containing - NAS_PDU containing - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, - security_header_type set to INTEGRITY_PROTECTED_AND_CIPHERED, - message_type set to DEREGISTRATION_REQUEST, - Deregistration_type containing - Switch_off set to NORMAL_DEREGISTRATION, - Reregistration_required set to REREGISTRATION_REQUIRED, - Access_type set to 3GPP_ACCESS;, - 5GS_mobile_identity containing - Type_of_identity set to 5G_GUTI, - MCC set to PX_MCC, - MNC set to PX_MNC, - AMF_Region_ID set to PX_AMF_REGION_ID, - AMF_Set_ID set to PX_AMF_SET_ID, - AMF_Pointer set to PX_AMF_POINTER, - 5G_TMSI set to RV_5G_TMSI;;; - to the GNB entity - } - } - }// end TP_5GNAS_AMF_DRG_REQ_03 - - - } //end Group "5.5.2.3.1 Network-initiated de-registration procedure initiation" - - - - -} // End of Package TP_AMF - -- GitLab From a32822a0a9f3c2a8dc755a5596fb1c0e9a7bf00c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Thu, 28 May 2026 16:38:54 +0200 Subject: [PATCH 122/151] typo with a comma corrected --- test_purposes/TP_AMF_NGAP.tdltx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_purposes/TP_AMF_NGAP.tdltx b/test_purposes/TP_AMF_NGAP.tdltx index 70f7b8e..29c9001 100644 --- a/test_purposes/TP_AMF_NGAP.tdltx +++ b/test_purposes/TP_AMF_NGAP.tdltx @@ -852,7 +852,7 @@ Package TP_AMF_NGAP { TAI_Slice_Support_List containing { S_NSSAI containing { SST set to PX_SST, - SD set to PX_SD}}}}}, + SD set to PX_SD}}}}} //!Default_Paging_DRX }} from the GNB entity -- GitLab From b9c351a469715251757345fc63606d2a30a55c6d Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Mon, 8 Jun 2026 09:10:29 +0000 Subject: [PATCH 123/151] Variant introduced in TP_NGAP_AMF_CMP_03 --- test_purposes/TP_AMF_NGAP.tdltx | 46 +++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/test_purposes/TP_AMF_NGAP.tdltx b/test_purposes/TP_AMF_NGAP.tdltx index 29c9001..0ac7306 100644 --- a/test_purposes/TP_AMF_NGAP.tdltx +++ b/test_purposes/TP_AMF_NGAP.tdltx @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2025. +Copyright (c) ETSI 2026. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -567,12 +567,6 @@ Package TP_AMF_NGAP { PDU_Session_Resource_Item containing { PDU_SessionId set to PX_PDU_SessionId}}, Cause set to PX_VA_Cause} - //VA1="RadioNetwork.user-inactivity" - //VA2="RadioNetwork.unspecified"; - //VA3="RadioNetwork.release due to NG-RAN generated reason"; - //VA4="RadioNetwork.cell not available"; - //VA5="RadioNetwork.radio resource not available"; - //VA6="RadioNetwork.radio connection with UE lost"; from the GNB entity } then { @@ -583,17 +577,41 @@ Package TP_AMF_NGAP { RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID}} , Cause set to PX_VA_Cause} - //VA1="RadioNetwork.user-inactivity" - //VA2="RadioNetwork.unspecified"; - //VA3="RadioNetwork.release due to NG-RAN generated reason"; - //VA4="RadioNetwork.cell not available"; - //VA5="RadioNetwork.radio resource not available"; - //VA6="RadioNetwork.radio connection with UE lost"; to the GNB entity and the IUT entity accepts a UE_CONTEXT_RELEASE_COMPLETE containing { AMF_UE_NGAP_ID set to RV_AMF_UE_NGAP_ID, RAN_UE_NGAP_ID set to PX_RAN_UE_NGAP_ID} } + } + Variant TP_NGAP_AMF_CMP_03_ID_01 { + Bindings { + value PX_VA_Cause set to "RadioNetwork.user-inactivity" + } + } + Variant TP_NGAP_AMF_CMP_03_ID_02 { + Bindings { + value PX_VA_Cause set to "RadioNetwork.unspecified" + } + } + Variant TP_NGAP_AMF_CMP_03_ID_03 { + Bindings { + value PX_VA_Cause set to "RadioNetwork.release due to NG-RAN generated reason" + } + } + Variant TP_NGAP_AMF_CMP_03_ID_04 { + Bindings { + value PX_VA_Cause set to "RadioNetwork.cell not available" + } + } + Variant TP_NGAP_AMF_CMP_03_ID_05 { + Bindings { + value PX_VA_Cause set to "RadioNetwork.radio resource not available" + } + } + Variant TP_NGAP_AMF_CMP_03_ID_06 { + Bindings { + value PX_VA_Cause set to "RadioNetwork.radio connection with UE lost" + } } } // end TP_NGAP_AMF_CMP_03 @@ -1229,6 +1247,6 @@ Package TP_AMF_NGAP { } // end TP TP_NGAP_AMF_IMP_08_2 } //end Package NG_Reset - } + } //end Package Clause_8_7_Interface_Management_Procedures } //end Package TP_AMF_NGAP -- GitLab From 1f06ab76be42b0c40e171d74d52241702f032071 Mon Sep 17 00:00:00 2001 From: juvancic Date: Mon, 8 Jun 2026 12:43:04 +0200 Subject: [PATCH 124/151] check nas pdusessionreleasecommand --- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 20 +++++++++++++++++++ .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 17 ++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 844fb5c..2fc30bc 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -357,6 +357,26 @@ module LibNGAP_Templates { /** * @see ETSI TS 138 413 V16.12.0 (2023-05) 9.2.1.3 PDU SESSION RESOURCE RELEASE COMMAND */ + + template (present) InitiatingMessage mw_n2_PDUSessionResourceReleaseCommand_base_nas := { + + procedureCode := id_PDUSessionResourceRelease, + criticality := reject, + value_ := { + PDUSessionResourceReleaseCommand := { + protocolIEs := { + *, + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { NAS_PDU := ? } + }, + * + } + } + } + } // End of template mw_n2_PDUSessionResourceReleaseCommand_base_nas + template (present) InitiatingMessage mw_n2_PDUSessionResourceReleaseCommand( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 6373a5f..c5d65f9 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -2218,6 +2218,23 @@ module LibNGAP_Functions { log( vc_recvNgNasUl_Msg ); log("****************************************"); + } + } + } else if (match(vc_recvNGAP_PDU.initiatingMessage, mw_n2_PDUSessionResourceReleaseCommand_base_nas)) { + var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.PDUSessionResourceReleaseCommand.protocolIEs) + + for (var integer i:=0;i Date: Mon, 8 Jun 2026 11:06:19 +0000 Subject: [PATCH 125/151] Event descriptions added --- test_purposes/NGAP_Common.tdltx | 43 ++++++++++++++++---------------- test_purposes/NGNAS_Common.tdltx | 26 +++++++++---------- 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/test_purposes/NGAP_Common.tdltx b/test_purposes/NGAP_Common.tdltx index 4743778..4a9a401 100644 --- a/test_purposes/NGAP_Common.tdltx +++ b/test_purposes/NGAP_Common.tdltx @@ -35,31 +35,32 @@ Package NGAP_Common { Event accepts Event aborts + //TP_AMF NGAP events - Event isInCM_CONNECTED - Event hasActiveUeNgapContext - Event hasNoPduSessionResourceEstablishedForTheConcernedPduSessionId - Event hasSentPDU_SESSION_RESOURCE_SETUP_REQUEST - Event hasEstablishedPduSessionResourceForTheConcernedPduSessionId - Event hasSentPDU_SESSION_RESOURCE_RELEASE_COMMAND - Event isNotRegisteredToAMF - Event hasEstablishedInitialContext - Event hasEstablished_NG_C_AssociationToAMF - Event hasNotEstablished_NG_C_AssociationToAMF - Event hasEstablishedTNL_AssociationToAMF - Event isRegisteredToAMF - Event initiatesPduSessionResourceModificationToAddQoSFlow - Event processTheUENasDeregistration + Event isInCM_CONNECTED //UE is in CM_CONNECTED state + Event hasActiveUeNgapContext //The AMF maintains a valid UE NGAP context identified by the AMF UE NGAP ID and RAN UE NGAP ID and associated with an active UE-associated logical NG-connection towards the NG-RAN node. + Event hasNoPduSessionResourceEstablishedForTheConcernedPduSessionId //The AMF does not maintain any established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID, and no NGAP PDU Session Resource Setup procedure is ongoing for that PDU Session ID. + Event hasSentPDU_SESSION_RESOURCE_SETUP_REQUEST //The AMF has transmitted a PDU_SESSION_RESOURCE_SETUP_REQUEST message to the NG-RAN node for the concerned UE and is awaiting the corresponding PDU_SESSION_RESOURCE_SETUP_RESPONSE. + Event hasEstablishedPduSessionResourceForTheConcernedPduSessionId //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. + Event hasSentPDU_SESSION_RESOURCE_RELEASE_COMMAND //The AMF has transmitted a PDU_SESSION_RESOURCE_RELEASE_COMMAND message to the NG-RAN node for the concerned UE and is awaiting the corresponding PDU_SESSION_RESOURCE_RELEASE_RESPONSE. + Event isNotRegisteredToAMF //The UE has no active 5G registration with the AMF. + Event hasEstablishedInitialContext //The UE context is established in the gNB after successful Initial Context Setup procedure triggered by the AMF. + Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. + Event hasNotEstablished_NG_C_AssociationToAMF //No NG-C (NGAP) association exists between the gNB and AMF. + Event hasEstablishedTNL_AssociationToAMF //A transport-layer (SCTP) association between gNB and AMF is established before any NGAP procedures. + Event isRegisteredToAMF //The UE has completed the 5G Registration procedure and received a Registration Accept from the AMF. + Event initiatesPduSessionResourceModificationToAddQoSFlow //AMF initiates PDU_SESSION_RESOURCE_MODIFY_REQUEST to add the QoS flow for already established PDU session. + Event processTheUENasDeregistration //UE performs the NAS Deregistration signalling to release its registration and associated contexts from the AMF. //TP_GNB NGAP events - Event isRegisteredToAMF - Event havingSentPDUSessionEstablishment - Event hasEstablishedPDUsession - Event hasEstablished_NG_C_AssociationToAMF - Event u_Plane_inactivity_timer_expires - Event hasSuccessfullyEstablishedTNLconnection - + Event isRegisteredToAMF //The UE has completed the 5G Registration procedure and received a Registration Accept from the AMF. + Event havingSentPDUSessionEstablishment //The UE has sent a PDU Session Establishment Request and is awaiting the network response. + Event hasEstablishedPDUsession //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. + Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. + Event u_Plane_inactivity_timer_expires //The user-plane inactivity timer expires when no uplink or downlink user-plane traffic is detected for a configured duration. + Event hasSuccessfullyEstablishedTNLconnection //A transport network layer (TNL) connection is successfully established after completion of the SCTP association setup between the gNB and the AMF. + // NGAP messages //Table 8.1-1 diff --git a/test_purposes/NGNAS_Common.tdltx b/test_purposes/NGNAS_Common.tdltx index 9874408..9a16d21 100644 --- a/test_purposes/NGNAS_Common.tdltx +++ b/test_purposes/NGNAS_Common.tdltx @@ -11,26 +11,24 @@ Package NGNAS_Common { } //TP AMF NGNAS events - Event isInOverloadedState - Event indicateUEdeactivation - Event indicateUEderegistration + Event isInOverloadedState // The AMF is in an overload condition and overload control procedures are active. + Event indicateUEdeactivation // The UE is administratively deactivated in the 5GC. + Event indicateUEderegistration // The UE is administratively de-registered in the 5GC. // This template may be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSPORT message. */ Template AUTHENTICATION_REQUEST { the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { NAS_PDU containing { - extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values - security_header_type set to NOT_SECURITY_PROTECTED, - spare_half_octet, - authentication_request_message_identity set to AUTHENTICATION_REQUEST, - ngKSI containing { - nas_key_set_identifier set to "111" - }, - spare_half_octet, - ABBA, - Authentication_parameter_RAND, - Authentication_parameter_AUTN + extended_protocol_discriminator set to 5GS_MOBILITY_MANAGEMENT_MESSAGES, //!reference ts_124007v180200p: Table 11.2.3.1.1A.1: EPD values + security_header_type set to NOT_SECURITY_PROTECTED, + message_type set to AUTHENTICATION_REQUEST, + ngKSI containing { + nas_key_set_identifier set to "111"}, + ABBA containing { + ABBA_contents set to " '0000'H "}, + Authentication_parameter_RAND set to RV_Authentication_parameter_RAND, + Authentication_parameter_AUTN set to RV_Authentication_parameter_AUTN } } to the GNB entity -- GitLab From 87607f2ef68abc3b04a6451254f7210786fc5e26 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 9 Jun 2026 11:42:07 +0200 Subject: [PATCH 126/151] Adding Kgnb key calculation; Bug foixed in f_Check_5GAKA_NAS_DL_Message (inner message); TITAN issue pending --- NAS_ETSI.code-workspace | 5 +- captures/TC_NGAP_AMF_CMP_01.pcap | Bin 2940 -> 2940 bytes captures/TC_NGAP_AMF_PDU_02.pcap | Bin 5506 -> 3660 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 34 +- etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ | 6 +- etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 817 +++++++++--------- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 263 +++--- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 281 +++--- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 26 +- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 14 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 205 +++-- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 177 +++- .../lib/Lib_NG_NAS_Security_Functions.ttcn | 96 +- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn | 78 ++ .../lib_system/Lib_NG_NAS_Functions.ttcn | 16 +- 16 files changed, 1217 insertions(+), 805 deletions(-) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index 8b89674..7e2f7ec 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -13,7 +13,10 @@ "path": "../UERANSIM" }, { - "path": "../../tmp/titan_5gngap_per_issue" + "path": "../../tmp/tobedeleted/nas-TTF_T048_AMF" + }, + { + "path": "../../tmp/tobedeleted/nas-TTF_T048_GNB" } ], "settings": { diff --git a/captures/TC_NGAP_AMF_CMP_01.pcap b/captures/TC_NGAP_AMF_CMP_01.pcap index 0cebcdfd4508579d17a7c0ecfc62c3f0d875e098..b7b030854b9399466144f8471c24b84f69eaef3e 100644 GIT binary patch literal 2940 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 literal 5506 zcmca|c+)~A1{MYcU}0cnU|=}6gDLBDEE7Wz0|OW%HW_)Et|FgI5KEc4szyVSVq7STK6a~>- zx(tlyZU@rmGp{B&Z&d9-_m(%yQzxm|N^xFD7re~ogJGt+JOhm@-%QK@>tM46$iCsR}`t1GA zbrNz6TntKTGrln~?D`6_4aU}lhJ;AEKjlRbcefq{`Bje!>=%?J`<0F^GH z4vY>A3?R2xNAoh+F))BJNDT~w-EL4h0c7)`jUZb=wj;ZpnSnt7Y%}BhYam@9(-<;% z8Oj(Kz!)S3!(h`gDkp+XtH5R&12cmgIF~}S*eHmCf)rFz^07AL7o_HyrWflb=B61i zBrtF=fIPy);J^^(!1$jbfPn+V2YU?cCy@+%eqvw-xx&UC`B^eo_92g}S3LHS?3&>R` z>v$O^F))BJNFNM?UDZ-K3FN9n(IEeUT!tmyPJ+uukTzz9pl>tOl);q}1A`3%i-R2~ z1#y9033IEqRvkka0}}&-;#KPtUJDZE=rrgh3QyRm-LD{Ud-1$xvC9n%X%&5O2N%h% zfut3|-Vpz!;3n3ti7fdP!cWvAe5 zgIss02;?%53$cXXDJ0iff19DE!oUa)K~VUqV}_rIa2<2t1>V~Xbqujg3``$BJTzlu z0;krlH@pnn7#P49>Ig6ecF76`HjqoKkAPeOat)SnQbBS_dG^-brx`%jgUrx#NX85& zTbnu-=Iau!40Q}~s*cUe{r+|EMh!x}mkWa9L=V>HgEd4e^O_hNWl-w9>82A_(CV&bp z;|NsBUpyr^jSI5N5^Y8{^9fK1iV>tu&rM zJhTR68^~5H;d};WBgnL=EKJ}S1H~NFATR|s?FIt}$TaIoAd^5QBD+Z7* zpaKn~N6*0!Nm12Y4p?6d)8KGaaq z)Tm=J-1>JVQyoKyGyenze})2vRE9hTQwDd2V7CVMqyWVLA)^LQMn;h9A|^30d}3e# zW0=c8G}v`dDyM^7cMw$HfN~Qfatt#tGaUXlLrtB55!~IdVUT5LSce{%UJMOA3=WK8 zbxg_AmiIH)F=Q|@xa%=89uj2WWMp77G-PD_&&bC7MTPl`iY6-~mo5X75+h?J0~@1) zBO@bcH3NSG11}2)2L}h3VqrlFaUn(q1$~f(O$=N-*0WAA7=Q?dZU!#K5A_TT>|RuF)%P(*};_c=QR^U9RmXx z!~6uI!Tu^>;0Bpy{T*Zy$V9Zf3#v~qKw3=TJcqqLW$IbLYrqW7b8LEyj29zSgs^!I zDjl;vh@@5B9mgs37a1R~SQwQmWVX!ICekh`szC{PMm;RbF#}4c_x&Qws zPD{y0@9BbUFgncxYVLwD%ybY9wm}8j$42U0}A z(>9nJf6bFRg6>9;4QI4TbL096U{j%P)Y-|D<@Ji4gmB#0g6hVDiaN`~xR5x;&?^^|Pqx}C&19UfnY{);! zNRk`(@PJK)x-o4hQuBM*lPRn4E++|YTx){rMxNTkg)ld^#h;ml?naOe{dYM@ Na^qSPu&Gct0sw$7^0NQ{ diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 339d37a..e1973f6 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -110,9 +110,9 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" #AtsImsIot_TestControl.control # Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. -NGAP_TestCases.TC_NGAP_AMF_PDU_01 +#NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. -#NGAP_TestCases.TC_NGAP_AMF_PDU_02 +NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_03 # Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. @@ -127,21 +127,21 @@ NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs -#NGAP_TestCases.TC_NGAP_AMF_CMP_04 -# Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs -#NGAP_TestCases.TC_NGAP_AMF_CMP_05 -# Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs -#NGAP_TestCases.TC_NGAP_AMF_CMP_06 -# Verify that the IUT can successfully request UE information from the AMF -#NGAP_TestCases.TC_NGAP_AMF_CMP_07 -# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context -#NGAP_TestCases.TC_NGAP_AMF_CMP_08 -# Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension -#NGAP_TestCases.TC_NGAP_AMF_CMP_09 -# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context -#NGAP_TestCases.TC_NGAP_AMF_CMP_10 -# Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context -#NGAP_TestCases.TC_NGAP_AMF_CMP_11 +##NGAP_TestCases.TC_NGAP_AMF_CMP_04 +## Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs +##NGAP_TestCases.TC_NGAP_AMF_CMP_05 +## Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs +##NGAP_TestCases.TC_NGAP_AMF_CMP_06 +## Verify that the IUT can successfully request UE information from the AMF +##NGAP_TestCases.TC_NGAP_AMF_CMP_07 +## Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context +##NGAP_TestCases.TC_NGAP_AMF_CMP_08 +## Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST containing mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension +##NGAP_TestCases.TC_NGAP_AMF_CMP_09 +## Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context +##NGAP_TestCases.TC_NGAP_AMF_CMP_10 +## Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context +##NGAP_TestCases.TC_NGAP_AMF_CMP_11 diff --git a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ index 9e6cba8..16d9c2e 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ @@ -34,6 +34,11 @@ LibNGAP_Pixits.PX_TIME_ZONE := '80'O # 0x40 for GMT+1, 0x80 for GMT+2 LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 +LibNGAP_Pixits.PX_NR_ENCRYPTION_ALGORITHMS := '1110000000000000'B +LibNGAP_Pixits.PX_NR_INTEGRITY_PROTECTION_ALGORITHMS := '1110000000000000'B +LibNGAP_Pixits.PX_EUTRA_ENCRYPTION_ALGORITHMS := '1110000000000000'B +LibNGAP_Pixits.PX_EUTRA_INTEGRITY_PROTECTION_ALGORITHMS := '1110000000000000'B + Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type @@ -52,7 +57,6 @@ Lib_NG_NAS_Pixits.PX_SQN := '00000000000000000000000 #Lib_NG_NAS_Pixits.PX_AMF := oct2bit('8000'O) #Lib_NG_NAS_Pixits.PX_RAND_VALUE := oct2bit('23553cbe9637a89d218ae64dae47bf35'O) - Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 Parameters.px_IMEISV_Def := '73806121856151f1'H NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index e5ef0d5..7bedf2a 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -147,7 +147,7 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_11 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_12_02 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_01 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_14_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_15_01 @@ -176,6 +176,8 @@ NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_13 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 +NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_27_01 + [GROUPS] # In this section you can specify groups of hosts. These groups can be used inside the diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 01bfe31..c22172a 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -57,49 +57,57 @@ module NGAP_TCFunctions { // f_await_registration_request(); f_NGAP_gnb_UE_Authentication(); // f_send_authentication_request_await_authentication_response f_NGAP_gnb_UE_SecurityMode(); // f_send_security_mode_command_await_security_mode_complete - stop; f_NGAP_gnb_UE_InitialContextSetup(); // f_send_initial_context_setup_request_await_initial_context_setup_response + f_NGAP_gnb_RegistrationComplete(); //f_await_registration_complete f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Body + var PDUSessionResourceSetupRequestTransfer v_pdu_session_resource_setup_request_transfer := valueof( + m_pDUSessionResourceSetupRequestTransfer( + m_pDUSessionResourceSetupRequestTransfer_mandatories( + m_pDUSessionType(ipv4), + { + m_qosFlowSetupRequestItem( + PX_QOS_FLOW_IDENTIFIER, + m_qosFlowLevelQosParameters( + m_qosCharacteristics_dynamic5QI( + m_dynamic5QIDescriptor( + 1,//in template (value) PriorityLevelQos p_priorityLevelQos, + 0,//in template (value) PacketDelayBudget p_packetDelayBudget, + m_PacketErrorRate( + 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, + 0//in template (value) PacketErrorRate.pERExponent p_pERExponent + ))), + m_allocationAndRetentionPriority( + 1,//in template (value) PriorityLevelARP p_priorityLevelARP, + shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, + not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, + ))) + }, + m_uPTransportLayerInformation_gTPTunnel( + m_gTPTunnel + )))); + log("v_pdu_session_resource_setup_request_transfer: ", v_pdu_session_resource_setup_request_transfer); + var octetstring v_os := bit2oct( + encvalue( + v_pdu_session_resource_setup_request_transfer + )); + log("v_os: ", v_os); + var PDUSessionResourceSetupItemSUReq v_pdu_session_resource_setup_item_su_req := valueof( + m_pDUSessionResourceSetupItemSUReq( + -, + m_s_NSSAI('00'O, '000000'O), + v_os + )); + log("v_pdu_session_resource_setup_item_su_req: ", v_pdu_session_resource_setup_item_su_req); f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_PDUSessionResourceSetupRequest( - -, - -, - { - m_pDUSessionResourceSetupItemSUReq( - -, - m_s_NSSAI('00'O, '000000'O), - bit2oct( - encvalue( - m_pDUSessionResourceSetupRequestTransfer( - m_pDUSessionResourceSetupRequestTransfer_mandatories( - m_pDUSessionType(ipv4), - { - m_qosFlowSetupRequestItem( - PX_QOS_FLOW_IDENTIFIER, - m_qosFlowLevelQosParameters( - m_qosCharacteristics_dynamic5QI( - m_dynamic5QIDescriptor( - 1,//in template (value) PriorityLevelQos p_priorityLevelQos, - 0,//in template (value) PacketDelayBudget p_packetDelayBudget, - m_PacketErrorRate( - 0,//in template (value) PacketErrorRate.pERScalar p_pERScalar, - 0//in template (value) PacketErrorRate.pERExponent p_pERExponent - ))), - m_allocationAndRetentionPriority( - 1,//in template (value) PriorityLevelARP p_priorityLevelARP, - shall_not_trigger_pre_emption,//in template (value) Pre_emptionCapability p_pre_emptionCapability, - not_pre_emptable//in template (value) Pre_emptionVulnerability p_pre_emptionVulnerability, - ))) - }, - m_uPTransportLayerInformation_gTPTunnel( - m_gTPTunnel - )))))) - } - ))); + m_ngap_initMsg( + m_n2_PDUSessionResourceSetupRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + { v_pdu_session_resource_setup_item_su_req } + ))); f_recv_NGAP_PDU( mw_ngap_succMsg( @@ -1026,6 +1034,7 @@ module NGAP_TCFunctions { // Body + /* FIXME TODO To be fixed f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq @@ -1041,7 +1050,7 @@ module NGAP_TCFunctions { m_uESecurityCapabilities, - ))); - +*/ f_recv_NGAP_PDU( mw_ngap_succMsg( @@ -3804,7 +3813,8 @@ module NGAP_TCFunctions { mw_NG_DL_NAS_TRANSPORT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); setverdict(fail); @@ -3888,14 +3898,16 @@ module NGAP_TCFunctions { var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, - mw_NG_PDU_SESSION_RELEASE_COMMAND, + mw_NG_DL_NAS_TRANSPORT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_PDU_SESSION_RELEASE_COMMAND ***"); setverdict(fail); } else { + log("*** " & __SCOPE__ & ": DBG: vc_inner_message ", vc_inner_message); log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); var NG_PDU_SESSION_RELEASE_COMMAND v_ng_pdu_session_release_command; @@ -3934,43 +3946,50 @@ module NGAP_TCFunctions { * @desc Testcase function for TC_NGAP_AMF_PDU_03 */ function f_TC_NGAP_AMF_PDU_03() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - f_NGAP_amf_UE_PDU_ResourceSetup(); + // Local variables - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request + f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command + f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request + f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - action("Trigger PDU session resource MODIFY!"); + // Body + action("Trigger PDU session resource MODIFY!"); - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_PDUSessionResourceModify( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - { - mw_pDUSessionResourceModifyItemModReq( - PX_PDU_SESSION_ID, - ?,//decmatch(mw_pDUSessionResourceModifyRequestTransfer(*)),OCTETSTRING - -,//template NAS_PDU p_nAS_PDU := *, - -//template PDUSessionResourceModifyItemModReq.iE_Extensions p_iE_Extensions := * - ) - } - ) - ) - ); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceModify( + PX_AMF_UE_NGAP_ID, + PX_RAN_UE_NGAP_ID, + { + mw_pDUSessionResourceModifyItemModReq( + PX_PDU_SESSION_ID, + ?,//decmatch(mw_pDUSessionResourceModifyRequestTransfer(*)),OCTETSTRING + -,//template NAS_PDU p_nAS_PDU := *, + -//template PDUSessionResourceModifyItemModReq.iE_Extensions p_iE_Extensions := * + ) + } + ) + ) + ); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_AMF_PDU_03 @@ -4214,7 +4233,14 @@ module NGAP_TCFunctions { // Check security f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: mw_NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -4338,47 +4364,46 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_04 */ - function f_TC_NGAP_AMF_CMP_04() runs on aMFNGAPComponent { - - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - - // TODO: hasEstablishedInitialContext - if (not(f_NGAP_amf_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly - f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - } else { - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - } - - // Body - action("Trigger a PDU UE context modification procedure!"); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UEContextModificationRequest( - vc_AMF_UE_ID, - vc_RAN_UE_ID - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_CMP_04 - + // function f_TC_NGAP_AMF_CMP_04() runs on aMFNGAPComponent { + + // // Local variables + + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + + // // TODO: hasEstablishedInitialContext + // if (not(f_NGAP_amf_UE_Has_EstablishedContextInproperly())) { // TODO FSCOM To check, not sure it address hasEstablishedInitialContext properly + // f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // } else { + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // } + + // // Body + // action("Trigger a PDU UE context modification procedure!"); + + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_UEContextModificationRequest( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + // } // End of function f_TC_NGAP_AMF_CMP_04 } // End of group UE_Context_Modification //8.3.5 @@ -4390,41 +4415,41 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_05 */ - function f_TC_NGAP_AMF_CMP_05() runs on aMFNGAPComponent { + // function f_TC_NGAP_AMF_CMP_05() runs on aMFNGAPComponent { - // Local variables + // // Local variables - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - action("Trigger a PDU UE context modification procedure!"); + // // Body + // action("Trigger a PDU UE context modification procedure!"); - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_ConnectionEstablishmentIndication( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID - ))); + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_ConnectionEstablishmentIndication( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID + // ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_AMF_CMP_05 + // } // End of function f_TC_NGAP_AMF_CMP_05 } // End of group Connection_Establishment_Indication @@ -4434,41 +4459,41 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_06 */ - function f_TC_NGAP_AMF_CMP_06() runs on aMFNGAPComponent { + // function f_TC_NGAP_AMF_CMP_06() runs on aMFNGAPComponent { - // Local variables + // // Local variables - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - action("Trigger a AMF CP relocation indication procedure!"); + // // Body + // action("Trigger a AMF CP relocation indication procedure!"); - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_AMFCPRelocationIndication( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_AMFCPRelocationIndication( + // PX_AMF_UE_NGAP_ID, + // PX_RAN_UE_NGAP_ID + // ))); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_AMF_CMP_06 + // } // End of function f_TC_NGAP_AMF_CMP_06 } // End of group AMF_CP_Relocation_Indication //8.3.8 @@ -4480,51 +4505,51 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_07 */ - function f_TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent { - - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_RetrieveUEInformation( - m_fiveG_S_TMSI( // FiveG_S_TMSI - PX_AMF_SET_ID, - PX_AMF_POINTER, - '00000001'O, - omit - )))); - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UEInformationTransfer( - mw_fiveG_S_TMSI( - PX_AMF_SET_ID, - PX_AMF_POINTER, - ?, - * - )))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_CMP_07 + // function f_TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent { + + // // Local variables + + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // // Body + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_RetrieveUEInformation( + // m_fiveG_S_TMSI( // FiveG_S_TMSI + // PX_AMF_SET_ID, + // PX_AMF_POINTER, + // '00000001'O, + // omit + // )))); + + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_UEInformationTransfer( + // mw_fiveG_S_TMSI( + // PX_AMF_SET_ID, + // PX_AMF_POINTER, + // ?, + // * + // )))); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + // } // End of function f_TC_NGAP_AMF_CMP_07 } // End of group Retrieve_UE_Information //8.3.10 group UE_Information_Transfer{ @@ -4535,113 +4560,113 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_08 */ - function f_TC_NGAP_AMF_CMP_08() runs on aMFNGAPComponent { - - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UEContextSuspendRequest( - -, - -, - { - m_pDUSessionResourceSuspendItemSUSReq( - -, - bit2oct( - encvalue( - m_uEContextSuspendRequestTransfer - )), - - - ) - } - ))); - - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_UEContextSuspendResponse - )); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_CMP_08 + // function f_TC_NGAP_AMF_CMP_08() runs on aMFNGAPComponent { + + // // Local variables + + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + + // // Body + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UEContextSuspendRequest( + // -, + // -, + // { + // m_pDUSessionResourceSuspendItemSUSReq( + // -, + // bit2oct( + // encvalue( + // m_uEContextSuspendRequestTransfer + // )), + // - + // ) + // } + // ))); + + // f_recv_NGAP_PDU( + // mw_ngap_succMsg( + // mw_n2_UEContextSuspendResponse + // )); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + // } // End of function f_TC_NGAP_AMF_CMP_08 /** * @desc Testcase function for TP_NGAP_AMF_CMP_09 */ - function f_TC_NGAP_AMF_CMP_09() runs on aMFNGAPComponent { - - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete - - if (not(f_NGAP_amf_UE_HasPendingDataTransmission())) { - log("*** " & __SCOPE__ & ": INFO: Preamble failed. ***"); - f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); - } else { - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - f_selfOrClientSyncAndVerdict(c_prDone, e_success); - } - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UEContextSuspendRequest( - -, - -, - { - m_pDUSessionResourceSuspendItemSUSReq( - -, - bit2oct( - encvalue( - m_uEContextSuspendRequestTransfer(-,-) - )), - - - ) - } - ))); - - f_recv_NGAP_PDU( - mw_ngap_unsuccMsg( - mw_n2_UEContextSuspendFailure( - ?, - ?, - ? - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_CMP_09 + // function f_TC_NGAP_AMF_CMP_09() runs on aMFNGAPComponent { + + // // Local variables + + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + + // if (not(f_NGAP_amf_UE_HasPendingDataTransmission())) { + // log("*** " & __SCOPE__ & ": INFO: Preamble failed. ***"); + // f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + // } else { + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // f_selfOrClientSyncAndVerdict(c_prDone, e_success); + // } + + // // Body + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UEContextSuspendRequest( + // -, + // -, + // { + // m_pDUSessionResourceSuspendItemSUSReq( + // -, + // bit2oct( + // encvalue( + // m_uEContextSuspendRequestTransfer(-,-) + // )), + // - + // ) + // } + // ))); + + // f_recv_NGAP_PDU( + // mw_ngap_unsuccMsg( + // mw_n2_UEContextSuspendFailure( + // ?, + // ?, + // ? + // ))); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + // } // End of function f_TC_NGAP_AMF_CMP_09 } // End of group UE_Context_Suspend //8.3.12 @@ -4650,89 +4675,89 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TP_NGAP_AMF_CMP_10 */ - function f_TC_NGAP_AMF_CMP_10() runs on aMFNGAPComponent { - - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); - if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { - f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - return; - } - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UEContextResumeRequest - )); - - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_UEContextResumeResponse( - ?, - ? - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_CMP_10 + // function f_TC_NGAP_AMF_CMP_10() runs on aMFNGAPComponent { + + // // Local variables + + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); + // if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { + // f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // return; + // } + + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // // Body + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UEContextResumeRequest + // )); + + // f_recv_NGAP_PDU( + // mw_ngap_succMsg( + // mw_n2_UEContextResumeResponse( + // ?, + // ? + // ))); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + // } // End of function f_TC_NGAP_AMF_CMP_10 /** * @desc Testcase function for TP_NGAP_AMF_CMP_11 */ - function f_TC_NGAP_AMF_CMP_11() runs on aMFNGAPComponent { - - // Local variables - - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); - // f_send_registration_request(); - f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); - f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); - f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse - if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { - f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - return; - } - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - // Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_UEContextResumeRequest - )); - - f_recv_NGAP_PDU( - mw_ngap_unsuccMsg( - mw_n2_UEContextResumeFailure( - ?, - ?, - ? - ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - - } // End of function f_TC_NGAP_AMF_CMP_11 + // function f_TC_NGAP_AMF_CMP_11() runs on aMFNGAPComponent { + + // // Local variables + + // // Preamble + // f_NGAP_amf_init(); + // f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // // f_send_registration_request(); + // f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + // f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + // f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + // if (not(f_NGAP_amf_UE_Has_Suspended_Context())) { + // f_selfOrClientSyncAndVerdict(c_prDone, e_timeout); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // return; + // } + + // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // // Body + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_UEContextResumeRequest + // )); + + // f_recv_NGAP_PDU( + // mw_ngap_unsuccMsg( + // mw_n2_UEContextResumeFailure( + // ?, + // ?, + // ? + // ))); + // f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // // Postamble + // f_postamble_NGAP_AMF(); + // f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + // log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + // } // End of function f_TC_NGAP_AMF_CMP_11 } // End of group UE_Context_Resume diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 79c9a1f..ba7e6dd 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -2252,29 +2252,29 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs." */ - testcase TC_NGAP_AMF_CMP_04() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_04() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_04()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_04()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_04 + // } // End of testcase TC_NGAP_AMF_CMP_04 } // End of group UE_Context_Modification //8.3.5 @@ -2286,29 +2286,29 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send a CONNECTION ESTABLISHMENT INDICATION that contains mandatory IEs." */ - testcase TC_NGAP_AMF_CMP_05() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_05() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_6)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_6' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_6)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_6' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_05()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_05()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_05 + // } // End of testcase TC_NGAP_AMF_CMP_05 } // End of group Connection_Establishment_Indication //8.3.7 @@ -2317,31 +2317,30 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can send an AMF CP RELOCATION INDICATION that contains mandatory IEs." */ - testcase TC_NGAP_AMF_CMP_06() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_06() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_7)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_6' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_7)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_6' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_06()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_06()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_06 - - + // } // End of testcase TC_NGAP_AMF_CMP_06 + } // End of group AMF_CP_Relocation_Indication //8.3.8 group RAN_CP_Relocation_Indication{ @@ -2352,29 +2351,30 @@ module NGAP_TestCases { /** * @desc "Verify that the IUT can successfully request UE information from the AMF." */ - testcase TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_10)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_10' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_10)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_10' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_07()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_07()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); + + // } // End of testcase TC_NGAP_AMF_CMP_07 - } // End of testcase TC_NGAP_AMF_CMP_07 } // End of group Retrieve_UE_Information //8.3.10 group UE_Information_Transfer{ @@ -2385,56 +2385,56 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST contains mandatory IEs and answers with UE CONTEXT SUSPEND REQUEST RESPONSE with successfully suspend UE context." */ - testcase TC_NGAP_AMF_CMP_08() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_08() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_11' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_11' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_08()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_08()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_08 + // } // End of testcase TC_NGAP_AMF_CMP_08 /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT SUSPEND REQUEST contains mandatory IEs and answers with UE CONTEXT SUSPEND FAILURE with failed suspension." */ - testcase TC_NGAP_AMF_CMP_09() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_09() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_11' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_11)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_11' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_09()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_09()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_09 + // } // End of testcase TC_NGAP_AMF_CMP_09 } // End of group UE_Context_Suspend //8.3.12 @@ -2443,58 +2443,57 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME RESPONSE with successfully resume UE context." */ - testcase TC_NGAP_AMF_CMP_10() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_10() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_12' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_12' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_10()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_10()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_10 + // } // End of testcase TC_NGAP_AMF_CMP_10 /** * @desc "Verify that the AMF node successfully processes a UE CONTEXT RESUME REQUEST containing mandatory IEs and answers with UE CONTEXT RESUME FAILURE with failing to resume UE context." */ - testcase TC_NGAP_AMF_CMP_11() runs on aMFNGAPComponent system TestAdapter { + // testcase TC_NGAP_AMF_CMP_11() runs on aMFNGAPComponent system TestAdapter { - // Local variables - var aMFNGAPComponent v_ngap_gnb; + // // Local variables + // var aMFNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_12' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_2_12)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_2_12' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_aMF_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_aMF_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_11()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CMP_11()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CMP_11 - - + // } // End of testcase TC_NGAP_AMF_CMP_11 + } // End of group UE_Context_Resume } // End of group UE_Context_Management_Procedures //8.4 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 11466be..4feb0d0 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -88,7 +88,8 @@ module NG_NAS_TCFunctions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); setverdict(fail); @@ -130,7 +131,14 @@ module NG_NAS_TCFunctions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMMAND, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); setverdict(fail); } else { @@ -194,7 +202,14 @@ module NG_NAS_TCFunctions { f_NGAPPDU_Get(v_PDU) f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == true) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == true) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); f_selfOrClientSyncAndVerdict(c_tbDone, e_error); } @@ -258,7 +273,8 @@ module NG_NAS_TCFunctions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); @@ -328,7 +344,9 @@ module NG_NAS_TCFunctions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message) == false) { + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); } else { @@ -393,7 +411,8 @@ module NG_NAS_TCFunctions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_IDENTITY_REQUEST ***"); setverdict(fail); @@ -444,7 +463,8 @@ module NG_NAS_TCFunctions { mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_SECURITY_MODE_COMMAND ***"); setverdict(fail); @@ -598,12 +618,13 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message - ) == false) { + vc_recvNAS_PDU, + mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { setverdict(fail); return; } else { @@ -729,7 +750,9 @@ module NG_NAS_TCFunctions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message) == false) { + v_message, + vc_inner_message + ) == false) { setverdict(fail); } else { setverdict(pass); @@ -830,28 +853,30 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - cs_RegistrationResult('000'B,//B3_Type p_Result, - '0'B,//B1_Type p_SMS, - '0'B,//B1_Type p_EmergencyRegistered, - '0'B,//B1_Type p_NssaaPerformed, - '0'B),//B1_Type p_DisasterRoamingResult),//-, - ?, - mw_PLMN_List( - -, -, - { - *, - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - * - } - ), - ?/*TAIList*/,-,-,-,-,-,-,-,-,-,-,-,?/*GPRSTimer3512*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message) == false) { + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT( + cs_RegistrationResult('000'B,//B3_Type p_Result, + '0'B,//B1_Type p_SMS, + '0'B,//B1_Type p_EmergencyRegistered, + '0'B,//B1_Type p_NssaaPerformed, + '0'B),//B1_Type p_DisasterRoamingResult),//-, + ?, + mw_PLMN_List( + -, -, + { + *, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + * + } + ), + ?/*TAIList*/,-,-,-,-,-,-,-,-,-,-,-,?/*GPRSTimer3512*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + ? + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -955,28 +980,30 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - cs_RegistrationResult('000'B,//B3_Type p_Result, - '0'B,//B1_Type p_SMS, - '0'B,//B1_Type p_EmergencyRegistered, - '0'B,//B1_Type p_NssaaPerformed, - '0'B),//B1_Type p_DisasterRoamingResult),//-, - ?, - mw_PLMN_List( - -, -, - { - *, - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - * - } - ), - ?/*TAIList*/,-,-,-,-,-,-,-,-,-,-,-,?/*GPRSTimer3512*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message) == false) { + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT( + cs_RegistrationResult('000'B,//B3_Type p_Result, + '0'B,//B1_Type p_SMS, + '0'B,//B1_Type p_EmergencyRegistered, + '0'B,//B1_Type p_NssaaPerformed, + '0'B),//B1_Type p_DisasterRoamingResult),//-, + ?, + mw_PLMN_List( + -, -, + { + *, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + * + } + ), + ?/*TAIList*/,-,-,-,-,-,-,-,-,-,-,-,?/*GPRSTimer3512*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + ? + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -1080,24 +1107,26 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - -, - ?, - mw_PLMN_List( - -, -, - { - *, - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - * - } - ), - -,?/*AllowedNSSAI*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message) == false) { + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT( + -, + ?, + mw_PLMN_List( + -, -, + { + *, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + * + } + ), + -,?/*AllowedNSSAI*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + ? + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -1201,24 +1230,26 @@ module NG_NAS_TCFunctions { f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNAS_PDU, - mw_NG_REGISTRATION_ACCEPT( - -, - ?, - mw_PLMN_List( - -, -, - { - *, - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - * - } - ), - -,-,?/*RejectedNSSAI*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, - ? - ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message) == false) { + vc_recvNAS_PDU, + mw_NG_REGISTRATION_ACCEPT( + -, + ?, + mw_PLMN_List( + -, -, + { + *, + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + * + } + ), + -,-,?/*RejectedNSSAI*/,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-, + ? + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch. ***"); setverdict(fail); } else { @@ -1342,7 +1373,9 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_REGISTRATION_REJECT( cr_GMM_GSM_Cause(*,'00010110'B),//tsc_NR5GCCause_Congestion //template (present) GMM_GSM_Cause p_Cause := ?, ?//template GPRS_Timer2 p_T3346 := * @@ -1358,7 +1391,9 @@ module NG_NAS_TCFunctions { template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := **/ ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); @@ -1513,7 +1548,9 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_REGISTRATION_REJECT( cr_GMM_GSM_Cause(*,'00111110'B)//tsc_Cause_NoNetworkSlices_Available //template (present) GMM_GSM_Cause p_Cause := ?, /*template GPRS_Timer2 p_T3346 := * @@ -1529,7 +1566,9 @@ module NG_NAS_TCFunctions { template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := **/ ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_REJECT mismatch. ***"); @@ -1605,10 +1644,14 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_DEREGISTRATION_ACCEPT_MO, vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); @@ -1680,10 +1723,14 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_DEREGISTRATION_ACCEPT_MO, vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_ACCEPT mismatch. ***"); @@ -1731,7 +1778,8 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_DEREGISTRATION_REQUEST_MT( crs_DeregisterType ('0'B,//B1_Type p_SwitchOff, '0'B,//B1_Type p_ReReg, @@ -1749,7 +1797,8 @@ module NG_NAS_TCFunctions { //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); @@ -1792,7 +1841,9 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_DEREGISTRATION_REQUEST_MT( //template (present) DeregisterType p_Type := ?, //template GMM_GSM_Cause p_Cause := *, @@ -1807,7 +1858,9 @@ module NG_NAS_TCFunctions { //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); @@ -1827,7 +1880,9 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_DEREGISTRATION_REQUEST_MT( crs_DeregisterType ('0'B,//B1_Type p_SwitchOff, '0'B,//B1_Type p_ReReg, @@ -1845,7 +1900,9 @@ module NG_NAS_TCFunctions { //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); @@ -1887,7 +1944,9 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, mw_NG_DEREGISTRATION_REQUEST_MT( crs_DeregisterType ('0'B,//B1_Type p_SwitchOff, '1'B,//B1_Type p_ReReg, @@ -1905,7 +1964,9 @@ module NG_NAS_TCFunctions { //template NG_TrackingAreaIdList p_ForbidTAIList_RegProvService := * ), vc_ng_nas_security_params_type, - vc_previous_nas_count_dl + vc_previous_nas_count_dl, + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_DEREGISTRATION_REQUEST_MT mismatch. ***"); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index d7d9d96..0551e77 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -3124,6 +3124,30 @@ module NG_NAS_TestCases { } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 - } // End of group fiveG_AKA_Crypto_Functions + /** + * @desc Verify that the KgNB derivation function is working correctly + * @see ETSI TS 133 501 V16.18.0 (2024-04) Annex A.9 KgNB, KWAGF, KTNGF, KTWIF and KN3IWF derivation function + */ + testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_27_01() runs on gNB_NGNAS_NGAPComponent system TestAdapter { + + var B256_Type v_k_amf := oct2bit('8a835993961d28c776296cd1ac821279e2f578586342139d5935d789166342ea'O); // K_AMF: Key for AMF ); + + var B256_Type v_k_gnb := oct2bit('3f558497ee61732039afb69ba104454e863f5740b0d3a79faf0278468c14a535'O); // KgNB + var B256_Type v_k_gnb_computed := f_NG_Authentication_A9(int2oct(0, 4), + v_k_amf, + Access_3GPP, + tsc_KDF_HMAC_SHA_256); + if (not(match(v_k_gnb_computed, v_k_gnb))) { + log("*** " & __SCOPE__ & ": ERROR: 'v_k_gnb_computed' did not return the expected value. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": 'v_k_gnb_computed' returned the expected value ***"); + } + + setverdict(pass) + + } // End of testcase TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_27_01 + + } // End of group fiveG_AKA_Crypto_Functions }// End of module NG_NAS_TestCases diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 30788aa..db48666 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -349,29 +349,29 @@ module LibNGAP_Pixits { * @desc Each position in the bitmap represents an encryption algorithm * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.86 UE Security Capabilities */ - modulepar NRencryptionAlgorithms PX_NR_ENCRYPTION_ALGORITHMS; + modulepar NRencryptionAlgorithms PX_NR_ENCRYPTION_ALGORITHMS := oct2bit('e000'O); /** * @desc Each position in the bitmap represents an encryption algorithm * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.86 UE Security Capabilities */ - modulepar NRintegrityProtectionAlgorithms PX_NR_INTEGRITY_PROTECTION_ALGORITHMS; + modulepar NRintegrityProtectionAlgorithms PX_NR_INTEGRITY_PROTECTION_ALGORITHMS := oct2bit('e000'O); /** * @desc Each position in the bitmap represents an encryption algorithm * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.86 UE Security Capabilities */ - modulepar EUTRAencryptionAlgorithms PX_EUTRA_ENCRYPTION_ALGORITHMS; + modulepar EUTRAencryptionAlgorithms PX_EUTRA_ENCRYPTION_ALGORITHMS := oct2bit('e000'O); /** * @desc Each position in the bitmap represents an encryption algorithm * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.86 UE Security Capabilities */ - modulepar EUTRAintegrityProtectionAlgorithms PX_EUTRA_INTEGRITY_PROTECTION_ALGORITHMS; + modulepar EUTRAintegrityProtectionAlgorithms PX_EUTRA_INTEGRITY_PROTECTION_ALGORITHMS := oct2bit('e000'O); - modulepar NextHopChainingCount PX_NEXT_HOP_CHAINING_COUNT; + modulepar NextHopChainingCount PX_NEXT_HOP_CHAINING_COUNT := 0; - modulepar SecurityKey PX_NEXT_HOP_NH; + modulepar SecurityKey PX_NEXT_HOP_NH := int2bit(0, 256); /** * @desc Contains the DRB ID @@ -453,7 +453,7 @@ module LibNGAP_Pixits { * @desc To indicate IMEISV value with a mask, to identify a terminal model without identifying an individual Mobile Equipment. * @see 138 413 V16.12.0 (2023-05) Clause 9.3.1.54 Masked IMEISV */ - modulepar bitstring PX_MaskedIMEISV; + modulepar bitstring PX_MaskedIMEISV := oct2bit('4370816125ffff51'O); /** * @desc To indicate local configuration for RRM strategies such as camp priorities in Idle mode and control of inter-RAT/inter-frequency handover in Active mode diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 844fb5c..b26a241 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -17,6 +17,7 @@ module LibNGAP_Templates { // Lib3GPP/NAS import from NAS_CommonTypeDefs all; + import from NG_NAS_TypeDefs all; // Lib_NG_NAS import from Lib_NG_NAS_Security_Functions all; @@ -1038,7 +1039,7 @@ module LibNGAP_Templates { in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) GUAMI p_gUAMI, in template (value) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) UESecurityCapabilities p_uESecurityCapabilities, in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH ) := { @@ -1071,9 +1072,11 @@ module LibNGAP_Templates { in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) GUAMI p_gUAMI, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) UESecurityCapabilities p_uESecurityCapabilities, - in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH + in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, + in template (value) MaskedIMEISV p_maskedIMEISV := PX_MaskedIMEISV, + in template (value) NG_NAS_Message p_nasPdu ) := { procedureCode := id_InitialContextSetup, criticality := reject, @@ -1091,24 +1094,34 @@ module LibNGAP_Templates { value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } }, { - id := id_GUAMI, + id := id_GUAMI, criticality := reject, value_ := { GUAMI := p_gUAMI } }, { - id := id_AllowedNSSAI, + id := id_AllowedNSSAI, criticality := reject, value_ := { AllowedNSSAI := p_allowedNSSAI } }, { - id := id_UESecurityCapabilities, + id := id_UESecurityCapabilities, criticality := reject, value_ := { UESecurityCapabilities := p_uESecurityCapabilities } }, { - id := id_SecurityKey, + id := id_SecurityKey, criticality := reject, value_ := { SecurityKey := p_nextHopNH } + }, + { + id := id_MaskedIMEISV, + criticality := ignore, + value_ := { MaskedIMEISV := p_maskedIMEISV } + }, + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { NAS_PDU := p_nasPdu } } } } @@ -1123,7 +1136,7 @@ module LibNGAP_Templates { in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) GUAMI p_gUAMI, in template (value) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) UESecurityCapabilities p_uESecurityCapabilities, in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, in template (value) TraceActivation p_traceActivation @@ -1186,7 +1199,7 @@ module LibNGAP_Templates { in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) GUAMI p_gUAMI, in template (value) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) UESecurityCapabilities p_uESecurityCapabilities, in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, in template (value) MobilityRestrictionList p_mobilityRestrictionList @@ -1249,7 +1262,7 @@ module LibNGAP_Templates { in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, in template (value) GUAMI p_gUAMI, in template (value) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) UESecurityCapabilities p_uESecurityCapabilities, in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, in template (value) UERadioCapability p_uERadioCapability, @@ -1427,7 +1440,7 @@ module LibNGAP_Templates { template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, template (present) GUAMI p_gUAMI := ?, template (present) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq := ?, - template (present) AllowedNSSAI p_allowedNSSAI := ?, + template (present) NGAP_IEs.AllowedNSSAI p_allowedNSSAI := ?, template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, template (present) SecurityKey p_nextHopNH := ?, template (present) MaskedIMEISV p_maskedIMEISV := ?, @@ -1491,7 +1504,7 @@ module LibNGAP_Templates { template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, template (present) GUAMI p_gUAMI := ?, template (present) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq := ?, - template (present) AllowedNSSAI p_allowedNSSAI := ?, + template (present) NGAP_IEs.AllowedNSSAI p_allowedNSSAI := ?, template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, template (present) SecurityKey p_nextHopNH := ?, template (present) MaskedIMEISV p_maskedIMEISV := ?, @@ -3678,7 +3691,7 @@ module LibNGAP_Templates { in template (value) UESecurityCapabilities p_uESecurityCapabilities, in template (value) SecurityContext p_securityContext, in template (value) PDUSessionResourceSetupListHOReq p_pDUSessionResourceSetupListHOReq, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) SourceToTarget_TransparentContainer p_SourceToTarget_TransparentContainer, in template (value) GUAMI p_gUAMI ) := { @@ -3753,7 +3766,7 @@ module LibNGAP_Templates { in template (value) UESecurityCapabilities p_uESecurityCapabilities, in template (value) SecurityContext p_securityContext, in template (value) PDUSessionResourceSetupListHOReq p_pDUSessionResourceSetupListHOReq, - in template (value) AllowedNSSAI p_allowedNSSAI, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, in template (value) SourceToTarget_TransparentContainer p_SourceToTarget_TransparentContainer, in template (value) GUAMI p_gUAMI, in template (value) CoreNetworkAssistanceInformationForInactive p_coreNetworkAssistanceInformationForInactive, @@ -3954,7 +3967,7 @@ module LibNGAP_Templates { template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, template (present) SecurityContext p_securityContext := ?, template (present) PDUSessionResourceSetupListHOReq p_pDUSessionResourceSetupListHOReq := ?, - template (present) AllowedNSSAI p_allowedNSSAI := ?, + template (present) NGAP_IEs.AllowedNSSAI p_allowedNSSAI := ?, template (present) SourceToTarget_TransparentContainer p_SourceToTarget_TransparentContainer := ?, template (present) GUAMI p_gUAMI := ? ) := { @@ -4029,7 +4042,7 @@ module LibNGAP_Templates { template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, template (present) SecurityContext p_securityContext := ?, template (present) PDUSessionResourceSetupListHOReq p_pDUSessionResourceSetupListHOReq := ?, - template (present) AllowedNSSAI p_allowedNSSAI := ?, + template (present) NGAP_IEs.AllowedNSSAI p_allowedNSSAI := ?, template (present) SourceToTarget_TransparentContainer p_SourceToTarget_TransparentContainer := ?, template (present) GUAMI p_gUAMI := ?, template (present) CoreNetworkAssistanceInformationForInactive p_coreNetworkAssistanceInformationForInactive := ?, @@ -10335,7 +10348,7 @@ module LibNGAP_Templates { } // End of template m_cancelledCellsInEAI_EUTRA_Item template (omit) CancelledCellsInEAI_NR_Item m_cancelledCellsInEAI_NR_Item( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (value) NumberOfBroadcasts p_numberOfBroadcasts, in template (omit) CancelledCellsInEAI_NR_Item.iE_Extensions p_iE_Extensions := omit ) := { @@ -10355,7 +10368,7 @@ module LibNGAP_Templates { } // End of template m_cancelledCellsInTAI_EUTRA_Item template (omit) CancelledCellsInTAI_NR_Item m_CancelledCellsInTAI_NR_Item( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (value) NumberOfBroadcasts p_numberOfBroadcasts, in template (omit) CancelledCellsInTAI_NR_Item.iE_Extensions p_iE_Extensions := omit ) := { @@ -10391,7 +10404,7 @@ module LibNGAP_Templates { } // End of template m_candidateCell_ext template (omit) CandidateCellID m_candidateCellID( - in template (value) NR_CGI p_candidateCellID, + in template (value) NGAP_IEs.NR_CGI p_candidateCellID, in template (omit) CandidateCellID.iE_Extensions p_iE_Extensions := omit ) := { candidateCellID := p_candidateCellID, @@ -10469,7 +10482,7 @@ module LibNGAP_Templates { } // End of template m_cellIDBroadcastEUTRA_Item template (omit) CellIDBroadcastNR_Item m_cellIDBroadcastNR_Item( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (omit) CellIDBroadcastNR_Item.iE_Extensions p_iE_Extensions := omit ) := { nR_CGI := p_nR_CGI, @@ -10487,7 +10500,7 @@ module LibNGAP_Templates { } // End of template m_cellIDCancelledEUTRA_Item template (omit) CellIDCancelledNR_Item m_cellIDCancelledNR_Item( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (value) NumberOfBroadcasts p_numberOfBroadcasts, in template (omit) CellIDCancelledNR_Item.iE_Extensions p_iE_Extensions := omit ) := { @@ -10556,7 +10569,7 @@ module LibNGAP_Templates { } // End of template m_completedCellsInEAI_EUTRA_Item template (omit) CompletedCellsInEAI_NR_Item m_completedCellsInEAI_NR_Item( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (omit) CompletedCellsInEAI_NR_Item.iE_Extensions p_iE_Extensions := omit ) := { nR_CGI := p_nR_CGI, @@ -10572,7 +10585,7 @@ module LibNGAP_Templates { } // End of template m_completedCellsInTAI_EUTRA_Item template (omit) CompletedCellsInTAI_NR_Item m_completedCellsInTAI_NR_Item( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (omit) CompletedCellsInTAI_NR_Item.iE_Extensions p_iE_Extensions := omit ) := { nR_CGI := p_nR_CGI, @@ -12600,36 +12613,36 @@ module LibNGAP_Templates { } // End of template m_mRB_ProgressInformation_pDCP_SN_Length18 template (value) MRB_ProgressInformation m_mRB_ProgressInformation_choice_Extensions( - in template (value) MRB_ProgressInformation.choice_Extensions p_choice_Extensions - ) := { + in template (value) MRB_ProgressInformation.choice_Extensions p_choice_Extensions + ) := { choice_Extensions := p_choice_Extensions } // End of template m_mRB_ProgressInformation_choice_Extensions template (omit) MBS_QoSFlowsToBeSetupItem m_mBS_QoSFlowsToBeSetupItem( - in template (value)QosFlowIdentifier p_mBSqosFlowIdentifier, - in template (value)QosFlowLevelQosParameters p_mBSqosFlowLevelQosParameters, - in template (omit) MBS_QoSFlowsToBeSetupItem.iE_Extensions p_iE_Extensions := omit - ) := { + in template (value)QosFlowIdentifier p_mBSqosFlowIdentifier, + in template (value)QosFlowLevelQosParameters p_mBSqosFlowLevelQosParameters, + in template (omit) MBS_QoSFlowsToBeSetupItem.iE_Extensions p_iE_Extensions := omit + ) := { mBSqosFlowIdentifier := p_mBSqosFlowIdentifier, mBSqosFlowLevelQosParameters := p_mBSqosFlowLevelQosParameters, iE_Extensions := p_iE_Extensions } // End of template m_mBS_QoSFlowsToBeSetupItem - template (value) MBS_ServiceArea m_mBS_ServiceArea_locationindependent( - in template (value) MBS_ServiceAreaInformation p_locationindependent - ) := { + template (value) NGAP_IEs.MBS_ServiceArea m_mBS_ServiceArea_locationindependent( + in template (value) MBS_ServiceAreaInformation p_locationindependent + ) := { locationindependent := p_locationindependent } // End of template m_mBS_ServiceArea_locationindependent - template (value) MBS_ServiceArea m_mBS_ServiceArea_locationdependent( - in template (value) MBS_ServiceAreaInformationList p_locationdependent - ) := { + template (value) NGAP_IEs.MBS_ServiceArea m_mBS_ServiceArea_locationdependent( + in template (value) MBS_ServiceAreaInformationList p_locationdependent + ) := { locationdependent := p_locationdependent } // End of template m_mBS_ServiceArea_locationdependent - template (value) MBS_ServiceArea m_mBS_ServiceArea_choice_Extensions( - in template (value) MBS_ServiceArea.choice_Extensions p_choice_Extensions - ) := { + template (value) NGAP_IEs.MBS_ServiceArea m_mBS_ServiceArea_choice_Extensions( + in template (value) NGAP_IEs.MBS_ServiceArea.choice_Extensions p_choice_Extensions + ) := { choice_Extensions := p_choice_Extensions } // End of template m_mBS_ServiceArea_choice_Extensions @@ -12654,10 +12667,10 @@ module LibNGAP_Templates { } // End of template m_mBS_ServiceAreaInformation template (omit) MBS_SessionID m_mBS_SessionID( - in template (value) TMGI p_tMGI, - in template (omit) NID p_nID := omit, - in template (omit) MBS_SessionID.iE_Extensions p_iE_Extensions := omit - ) := { + in template (value) TMGI p_tMGI, + in template (omit) NGAP_IEs.NID p_nID := omit, + in template (omit) MBS_SessionID.iE_Extensions p_iE_Extensions := omit + ) := { tMGI := p_tMGI, nID := p_nID, iE_Extensions := p_iE_Extensions @@ -12679,7 +12692,7 @@ module LibNGAP_Templates { in template (value) MBS_SessionID p_mBS_SessionID, in template (value) MBS_QoSFlowsToBeSetupList p_mBS_QoSFlowsToBeSetupList, in template (omit) MBS_AreaSessionID p_mBS_AreaSessionID := omit, - in template (omit) MBS_ServiceArea p_mBS_ServiceArea := omit, + in template (omit) NGAP_IEs.MBS_ServiceArea p_mBS_ServiceArea := omit, in template (omit) MBS_MappingandDataForwardingRequestList p_mBS_MappingandDataForwardingRequestList := omit, in template (omit) MBS_ActiveSessionInformation_SourcetoTargetItem.iE_Extensions p_iE_Extensions := omit ):= { @@ -12857,7 +12870,7 @@ module LibNGAP_Templates { in template (value) MBSSessionStatus p_mBSSessionStatus, in template (omit) MBS_AreaSessionID p_mBS_AreaSessionID := omit, in template (omit) MBS_SessionTNLInfo5GCItem p_sharedNGU_MulticastTNLInformation := omit, - in template (omit) MBS_ServiceArea p_mBS_ServiceArea := omit, + in template (omit) NGAP_IEs.MBS_ServiceArea p_mBS_ServiceArea := omit, in template (omit) MBS_DistributionSetupResponseTransfer.iE_Extensions p_iE_Extensions := omit ) := { mBS_SessionID := p_mBS_SessionID, @@ -13084,7 +13097,7 @@ module LibNGAP_Templates { } // End of template m_multicastSessionUpdateRequestTransfer_id_MBS_SessionID template (value) MulticastSessionUpdateRequestTransfer.protocolIEs m_multicastSessionUpdateRequestTransfer_id_MBS_ServiceArea( - in template (value) MBS_ServiceArea p_mBS_ServiceArea + in template (value) NGAP_IEs.MBS_ServiceArea p_mBS_ServiceArea ) := { { id := id_MBS_ServiceArea, @@ -13434,7 +13447,7 @@ module LibNGAP_Templates { template (value) NotifySourceNGRANNode m_notifySourceNGRANNode(in NotifySourceNGRANNode p_value := notifySource) := p_value; template (value) NGRAN_CGI m_ngENB_ID_nR_CGI( - in template (value) NR_CGI p_nR_CGI + in template (value) NGAP_IEs.NR_CGI p_nR_CGI ) := { nR_CGI := p_nR_CGI } // End of template m_ngENB_ID_nR_CGI @@ -13541,8 +13554,8 @@ module LibNGAP_Templates { choice_Extensions := p_choice_Extensions } // End of template m_nPN_PagingAssistanceInformation_choice_Extensions - template (value) NPN_Support m_nPN_Support_sNPN( - in template (value) NID p_sNPN + template (value) NPN_Support m_nPN_Support_sNPN( + in template (value) NGAP_IEs.NID p_sNPN ) := { sNPN := p_sNPN } // End of template m_nPN_Support_sNPN @@ -13553,11 +13566,11 @@ module LibNGAP_Templates { choice_Extensions := p_choice_Extensions } // End of template m_nPN_Support_choice_Extensions - template (omit) NR_CGI m_nR_CGI( - in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - in template (value) NRCellIdentity p_nRCellIdentity := PX_NR_CELL_IDENTITY, - in template (omit) NR_CGI.iE_Extensions p_iE_Extensions := omit - ) := { + template (omit) NGAP_IEs.NR_CGI m_nR_CGI( + in template (value) PLMNIdentity p_pLMNIdentity := fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + in template (value) NRCellIdentity p_nRCellIdentity := PX_NR_CELL_IDENTITY, + in template (omit) NGAP_IEs.NR_CGI.iE_Extensions p_iE_Extensions := omit + ) := { pLMNIdentity := p_pLMNIdentity, nRCellIdentity := p_nRCellIdentity, iE_Extensions := p_iE_Extensions @@ -15582,7 +15595,7 @@ module LibNGAP_Templates { template (value) RedirectionVoiceFallback m_redirectionVoiceFallback(in RedirectionVoiceFallback p_value := possible) := p_value; template (omit) RedundantPDUSessionInformation m_redundantPDUSessionInformation( - in template (value) RSN p_rSN, + in template (value) NGAP_IEs.RSN p_rSN, in template (omit) RedundantPDUSessionInformation.iE_Extensions p_iE_Extensions := omit ) := { rSN := p_rSN, @@ -15590,8 +15603,8 @@ module LibNGAP_Templates { } // End of template m_redundantPDUSessionInformation template (value) RedundantPDUSessionInformation.iE_Extensions m_redundantPDUSessionInformation_id_PDUSessionPairID( - in template (value) PDUSessionPairID p_pDUSessionPairID - ) := { + in template (value) PDUSessionPairID p_pDUSessionPairID + ) := { { id := id_PDUSessionPairID, criticality := ignore, @@ -15637,7 +15650,7 @@ module LibNGAP_Templates { template (value) RRCState m_rRCState(in RRCState p_value := inactive) := p_value; - template (value) RSN m_rSN(in RSN p_value := v1) := p_value; + template (value) NGAP_IEs.RSN m_rSN(in NGAP_IEs.RSN p_value := v1) := p_value; template (omit) RIMInformationTransfer m_rIMInformationTransfer( in template (value) TargetRANNodeID_RIM p_targetRANNodeID_RIM, @@ -15849,7 +15862,7 @@ module LibNGAP_Templates { } // End of template m_sliceSupportQMC_Item template (omit) SNPN_MobilityInformation m_sNPN_MobilityInformation( - in template (value) NID p_serving_NID, + in template (value) NGAP_IEs.NID p_serving_NID, in template (omit) SNPN_MobilityInformation.iE_Extensions p_iE_Extensions := omit ) := { serving_NID := p_serving_NID, @@ -16382,7 +16395,7 @@ module LibNGAP_Templates { } // End of template m_targetRANNodeID_SON template (value) TargetRANNodeID_SON.iE_Extensions m_targetRANNodeID_SON_id_NR_CGI( - in template (value) NR_CGI p_nR_CGI + in template (value) NGAP_IEs.NR_CGI p_nR_CGI ) := { { id := id_NR_CGI, @@ -17117,7 +17130,7 @@ module LibNGAP_Templates { template (omit) UserLocationInformationNR m_userLocationInformationNR( - in template (value) NR_CGI p_nR_CGI, + in template (value) NGAP_IEs.NR_CGI p_nR_CGI, in template (value) TAI p_tAI, in template (omit) TimeStamp p_timeStamp := omit, in template (omit) UserLocationInformationNR.iE_Extensions p_iE_Extensions := omit @@ -17139,7 +17152,7 @@ module LibNGAP_Templates { } // End of template m_userLocationInformationNR_id_PSCellInformation template (value) UserLocationInformationNR.iE_Extensions m_userLocationInformationNR_id_NID( - in template (value) NID p_nID + in template (value) NGAP_IEs.NID p_nID ) := { { id := id_NID, @@ -17831,7 +17844,7 @@ module LibNGAP_Templates { } // End of template mw_cancelledCellsInEAI_EUTRA_Item template (present) CancelledCellsInEAI_NR_Item mw_cancelledCellsInEAI_NR_Item( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template (present) NumberOfBroadcasts p_numberOfBroadcasts := ?, template CancelledCellsInEAI_NR_Item.iE_Extensions p_iE_Extensions := * ) := { @@ -17851,7 +17864,7 @@ module LibNGAP_Templates { } // End of template mw_cancelledCellsInTAI_EUTRA_Item template (present) CancelledCellsInTAI_NR_Item mw_CancelledCellsInTAI_NR_Item( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template (present) NumberOfBroadcasts p_numberOfBroadcasts := ?, template CancelledCellsInTAI_NR_Item.iE_Extensions p_iE_Extensions := * ) := { @@ -17961,7 +17974,7 @@ module LibNGAP_Templates { } // End of template mw_cellIDBroadcastEUTRA_Item template (present) CellIDBroadcastNR_Item mw_cellIDBroadcastNR_Item( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template CellIDBroadcastNR_Item.iE_Extensions p_iE_Extensions := * ) := { nR_CGI := p_nR_CGI, @@ -17979,7 +17992,7 @@ module LibNGAP_Templates { } // End of template mw_cellIDCancelledEUTRA_Item template (present) CellIDCancelledNR_Item mw_cellIDCancelledNR_Item( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template (present) NumberOfBroadcasts p_numberOfBroadcasts := ?, template CellIDCancelledNR_Item.iE_Extensions p_iE_Extensions := * ) := { @@ -18049,7 +18062,7 @@ module LibNGAP_Templates { } // End of template mw_completedCellsInEAI_EUTRA_Item template (present) CompletedCellsInEAI_NR_Item mw_completedCellsInEAI_NR_Item( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template CompletedCellsInEAI_NR_Item.iE_Extensions p_iE_Extensions := * ) := { nR_CGI := p_nR_CGI, @@ -18065,7 +18078,7 @@ module LibNGAP_Templates { } // End of template mw_completedCellsInTAI_EUTRA_Item template (present) CompletedCellsInTAI_NR_Item mw_completedCellsInTAI_NR_Item( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template CompletedCellsInTAI_NR_Item.iE_Extensions p_iE_Extensions := * ) := { nR_CGI := p_nR_CGI, @@ -20077,21 +20090,21 @@ module LibNGAP_Templates { iE_Extensions := p_iE_Extensions } // End of template mw_mBS_QoSFlowsToBeSetupItem - template (present) MBS_ServiceArea mw_mBS_ServiceArea_locationindependent( - template (present) MBS_ServiceAreaInformation p_locationindependent := ? - ) := { + template (present) NGAP_IEs.MBS_ServiceArea mw_mBS_ServiceArea_locationindependent( + template (present) NGAP_IEs.MBS_ServiceAreaInformation p_locationindependent := ? + ) := { locationindependent := p_locationindependent } // End of template mw_mBS_ServiceArea_locationindependent - template (present) MBS_ServiceArea mw_mBS_ServiceArea_locationdependent( - template (present) MBS_ServiceAreaInformationList p_locationdependent := ? - ) := { + template (present) NGAP_IEs.MBS_ServiceArea mw_mBS_ServiceArea_locationdependent( + template (present) NGAP_IEs.MBS_ServiceAreaInformationList p_locationdependent := ? + ) := { locationdependent := p_locationdependent } // End of template mw_mBS_ServiceArea_locationdependent - template (present) MBS_ServiceArea mw_mBS_ServiceArea_choice_Extensions( - template (present) MBS_ServiceArea.choice_Extensions p_choice_Extensions := ? - ) := { + template (present) NGAP_IEs.MBS_ServiceArea mw_mBS_ServiceArea_choice_Extensions( + template (present) NGAP_IEs.MBS_ServiceArea.choice_Extensions p_choice_Extensions := ? + ) := { choice_Extensions := p_choice_Extensions } // End of template mw_mBS_ServiceArea_choice_Extensions @@ -20117,7 +20130,7 @@ module LibNGAP_Templates { template (present) MBS_SessionID mw_mBS_SessionID( template (present) TMGI p_tMGI := ?, - template NID p_nID := *, + template NGAP_IEs.NID p_nID := *, template MBS_SessionID.iE_Extensions p_iE_Extensions := * ) := { tMGI := p_tMGI, @@ -20141,7 +20154,7 @@ module LibNGAP_Templates { template (present) MBS_SessionID p_mBS_SessionID := ?, template (present) MBS_QoSFlowsToBeSetupList p_mBS_QoSFlowsToBeSetupList := ?, template MBS_AreaSessionID p_mBS_AreaSessionID := *, - template MBS_ServiceArea p_mBS_ServiceArea := *, + template NGAP_IEs.MBS_ServiceArea p_mBS_ServiceArea := *, template MBS_MappingandDataForwardingRequestList p_mBS_MappingandDataForwardingRequestList := *, template MBS_ActiveSessionInformation_SourcetoTargetItem.iE_Extensions p_iE_Extensions := * ):= { @@ -20320,7 +20333,7 @@ module LibNGAP_Templates { template (present) MBSSessionStatus p_mBSSessionStatus := ?, template MBS_AreaSessionID p_mBS_AreaSessionID := *, template MBS_SessionTNLInfo5GCItem p_sharedNGU_MulticastTNLInformation := *, - template MBS_ServiceArea p_mBS_ServiceArea := *, + template NGAP_IEs.MBS_ServiceArea p_mBS_ServiceArea := *, template MBS_DistributionSetupResponseTransfer.iE_Extensions p_iE_Extensions := * ) := { mBS_SessionID := p_mBS_SessionID, @@ -20547,7 +20560,7 @@ module LibNGAP_Templates { } // End of template mw_multicastSessionUpdateRequestTransfer_id_MBS_SessionID template (present) MulticastSessionUpdateRequestTransfer.protocolIEs mw_multicastSessionUpdateRequestTransfer_id_MBS_ServiceArea( - template (present) MBS_ServiceArea p_mBS_ServiceArea := ? + template (present) NGAP_IEs.MBS_ServiceArea p_mBS_ServiceArea := ? ) := { { id := id_MBS_ServiceArea, @@ -20897,7 +20910,7 @@ module LibNGAP_Templates { template (present) NotifySourceNGRANNode mw_notifySourceNGRANNode(template (present) NotifySourceNGRANNode p_value := ?) := p_value; template (present) NGRAN_CGI mw_ngENB_ID_nR_CGI( - template (present) NR_CGI p_nR_CGI + template (present) NGAP_IEs.NR_CGI p_nR_CGI ) := { nR_CGI := p_nR_CGI } // End of template mw_ngENB_ID_nR_CGI @@ -21005,7 +21018,7 @@ module LibNGAP_Templates { } // End of template mw_nPN_PagingAssistanceInformation_choice_Extensions template (present) NPN_Support mw_nPN_Support_sNPN( - template (present) NID p_sNPN := ? + template (present) NGAP_IEs.NID p_sNPN := ? ) := { sNPN := p_sNPN } // End of template mw_nPN_Support_sNPN @@ -21016,11 +21029,11 @@ module LibNGAP_Templates { choice_Extensions := p_choice_Extensions } // End of template mw_nPN_Support_choice_Extensions - template (present) NR_CGI mw_nR_CGI( - template (present) PLMNIdentity p_pLMNIdentity := ?, - template (present) NRCellIdentity p_nRCellIdentity := ?, - template NR_CGI.iE_Extensions p_iE_Extensions := * - ) := { + template (present) NGAP_IEs.NR_CGI mw_nR_CGI( + template (present) PLMNIdentity p_pLMNIdentity := ?, + template (present) NRCellIdentity p_nRCellIdentity := ?, + template NGAP_IEs.NR_CGI.iE_Extensions p_iE_Extensions := * + ) := { pLMNIdentity := p_pLMNIdentity, nRCellIdentity := p_nRCellIdentity, iE_Extensions := p_iE_Extensions @@ -23015,7 +23028,7 @@ module LibNGAP_Templates { template (present) RedirectionVoiceFallback mw_redirectionVoiceFallback(template (present) RedirectionVoiceFallback p_value := ?) := p_value; template (present) RedundantPDUSessionInformation mw_redundantPDUSessionInformation( - template (present) RSN p_rSN := ?, + template (present) NGAP_IEs.RSN p_rSN := ?, template RedundantPDUSessionInformation.iE_Extensions p_iE_Extensions := * ) := { rSN := p_rSN, @@ -23070,7 +23083,7 @@ module LibNGAP_Templates { template (present) RRCState mw_rRCState(template (present) RRCState p_value := ?) := p_value; - template (present) RSN mw_rSN(template (present) RSN p_value := ?) := p_value; + template (present) NGAP_IEs.RSN mw_rSN(template (present) NGAP_IEs.RSN p_value := ?) := p_value; template (present) RIMInformationTransfer mw_rIMInformationTransfer( template (present) TargetRANNodeID_RIM p_targetRANNodeID_RIM := ?, @@ -23282,7 +23295,7 @@ module LibNGAP_Templates { } // End of template mw_sliceSupportQMC_Item template (present) SNPN_MobilityInformation mw_sNPN_MobilityInformation( - template (present) NID p_serving_NID := ?, + template (present) NGAP_IEs.NID p_serving_NID := ?, template SNPN_MobilityInformation.iE_Extensions p_iE_Extensions := * ) := { serving_NID := p_serving_NID, @@ -23815,7 +23828,7 @@ module LibNGAP_Templates { } // End of template mw_targetRANNodeID_SON template (present) TargetRANNodeID_SON.iE_Extensions mw_targetRANNodeID_SON_id_NR_CGI( - template (present) NR_CGI p_nR_CGI := ? + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ? ) := { { id := id_NR_CGI, @@ -24531,7 +24544,7 @@ module LibNGAP_Templates { } // End of template mw_userLocationInformationW_AGF_id_GlobalCable_ID_new template (present) UserLocationInformationNR mw_userLocationInformationNR( - template (present) NR_CGI p_nR_CGI := ?, + template (present) NGAP_IEs.NR_CGI p_nR_CGI := ?, template (present) TAI p_tAI := ?, template TimeStamp p_timeStamp := *, template UserLocationInformationNR.iE_Extensions p_iE_Extensions := * @@ -24553,8 +24566,8 @@ module LibNGAP_Templates { } // End of template mw_userLocationInformationNR_id_PSCellInformation template (present) UserLocationInformationNR.iE_Extensions mw_userLocationInformationNR_id_NID( - template (present) NID p_nID := ? - ) := { + template (present) NGAP_IEs.NID p_nID := ? + ) := { { id := id_NID, criticality := reject, @@ -24563,8 +24576,8 @@ module LibNGAP_Templates { } // End of template mw_userLocationInformationNR_id_NID template (present) UserLocationInformationNR.iE_Extensions mw_userLocationInformationNR_id_NRNTNTAIInformation( - template (present) NRNTNTAIInformation p_nRNTNTAIInformation := ? - ) := { + template (present) NRNTNTAIInformation p_nRNTNTAIInformation := ? + ) := { { id := id_NRNTNTAIInformation, criticality := ignore, diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 6373a5f..92f60cd 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -333,7 +333,9 @@ module LibNGAP_Functions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message) == false) { + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); } @@ -400,9 +402,11 @@ module LibNGAP_Functions { mw_GMM_AuthRAND, mw_GSM_AUTN ), - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_dl_message) == false) { + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_dl_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); } @@ -703,7 +707,14 @@ module LibNGAP_Functions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMMAND, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch."); setverdict(fail); } else { @@ -806,7 +817,13 @@ module LibNGAP_Functions { ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message) == false) { + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_SECURITY_MODE_COMMAND, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch."); setverdict(fail); } else { @@ -892,7 +909,8 @@ module LibNGAP_Functions { mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch."); setverdict(fail); @@ -960,7 +978,8 @@ module LibNGAP_Functions { mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_REGISTRATION_ACCEPT mismatch."); setverdict(fail); @@ -985,40 +1004,110 @@ module LibNGAP_Functions { /** * @desc Function to send NAS InitialContextSetupRequest message and await for InitialContextSetupResonse message */ - function f_send_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent {/* + function f_send_initial_context_setup_request_await_initial_context_setup_resonse() runs on NGNASComponent { log(">>> f_send_initial_context_setup_request_await_initial_context_setup_resonse"); - // Prepare NAS Registration Accept message - // Secure the message if required - // Send InitialContextSetupRequest - // FIXME FSCOM To be continued - vc_initialContextSetupRequest := m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - m_gUAMI - ( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER, - * - ), - m_allowedNSSAI_Item(cs_S_NSSAI('02'O, '00'O, '01'O)) - - ); + // 1. Build the NAS message for Registration Accept + var NG_NAS_DL_Message_Type v_nas_message := valueof( + m_NG_REGISTRATION_ACCEPT( + cs_RegistrationResult( + '001'B, + '0'B, + '0'B, + '0'B, + '0'B + ), + f_NG_Imeisv2MobileIdentity_v(px_IMEISV_Def), + -, + m_NG_TrackingAreaIdList( + -, + m_NG_TrackingAreaIdList_LV( + '07'O, + { + m_NG_ListOfPartialTaiList( + -, -, + '00001'B, + valueof( + m_NG_PartialTaiType_type3( + m_NG_Type3Element( + fl_NasNN_MCC2PlmnId( + PX_NAS_MCC, + PX_NAS_MNC + ))))) + } + )), + cs_NSSAI_SST1eMBB('15'O), + -, -, + cs_NG_NetworkFeatureSupport_Def, + -, -, -, -, -, -, -, + cs_GprsTimer3( + -, + '100'B, + '10010'B + ))); + log("v_nas_message: ", v_nas_message); + var octetstring v_msg := bit2oct(encvalue(valueof(v_nas_message))); + // 2. Add security if any + var NG_SECURITY_PROTECTED_NAS_MESSAGE v_security_Protected_Nas_Message; + vc_sendNAS_PDU := f_EncodeAndCipher_NG_NasPdu_v( + tsc_SHT_IntegrityProtected_NewSecurityContext, + v_msg, + tsc_DirectionDL, + PX_BEARER_ID, + vc_previous_nas_count_dl, + vc_ng_nas_security_params_type, + v_security_Protected_Nas_Message + ); + log("vc_previous_nas_count_dl: ", vc_previous_nas_count_dl); + vt_NgNasDl_Msg.security_Protected_Nas_Message := v_security_Protected_Nas_Message; + log("vc_sendNAS_PDU: ", vc_sendNAS_PDU); + // 3. Calculate the SecretKey for gNB based on the security context established with AMF + var B256_Type v_k_gnb := f_NG_Authentication_A9(vc_previous_nas_count_dl, + vc_ng_nas_security_params_type.KAMF, + Access_3GPP, + tsc_KDF_HMAC_SHA_256 + ); + log("v_k_gnb: ", v_k_gnb); + // 4. Send InitialContextSetupRequest + var InitiatingMessage v_initialContextSetupRequest := valueof( + m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER + ), + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + v_k_gnb, + -, + vc_sendNAS_PDU + )); + + + vc_initialContextSetupRequest := v_initialContextSetupRequest.value_.InitialContextSetupRequest; log("vc_initialContextSetupRequest: ", vc_initialContextSetupRequest); f_send_NGAP_PDU( m_ngap_initMsg( - vc_initialContextSetupRequest + v_initialContextSetupRequest )); // Await InitialContextSetupResponse + // FIXME FSCOM To be continued f_recv_NGAP_PDU( mw_ngap_succMsg( - mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes - )); - log("<<< f_send_initial_context_setup_request_await_initial_context_setup_resonse");*/ + mw_n2_InitialContextSetupResponse_noPDUSessionResourceSetupListSURes( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + log("<<< f_send_initial_context_setup_request_await_initial_context_setup_resonse"); } function f_await_retrieve_ue_information_await_ue_information_transfer() runs on NGNASComponent { @@ -1324,7 +1413,15 @@ module LibNGAP_Functions { ? // SecurityModeCommand ))); f_NASPDU_Get(vc_recvNGAP_PDU); - if (f_Check_5GAKA_NAS_DL_Message(vc_recvNAS_PDU, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_ul) == false) { + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul, + v_message, + vc_inner_message + ) == false) { log("*** " & __SCOPE__ & ": FAIL: PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch."); setverdict(fail); } else { @@ -1417,7 +1514,8 @@ module LibNGAP_Functions { mw_NG_DL_NAS_TRANSPORT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch."); setverdict(fail); @@ -1649,7 +1747,8 @@ module LibNGAP_Functions { mw_NG_DL_NAS_TRANSPORT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("f_await_pdu_session_resource_release_command: Unexpected NG_PDU_SESSION_RELEASE_COMMAND"); setverdict(fail); @@ -1766,7 +1865,8 @@ module LibNGAP_Functions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("f_await_configuration_update_command: NG_CONFIGURATION_UPDATE_COMMAND mismatch."); setverdict(fail); @@ -2042,7 +2142,8 @@ module LibNGAP_Functions { mw_NG_DEREGISTRATION_ACCEPT_MO, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch."); setverdict(fail); @@ -2072,7 +2173,8 @@ module LibNGAP_Functions { mw_NG_DEREGISTRATION_ACCEPT_MO, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { log("*** " & __SCOPE__ & ": FAIL: mw_NG_DEREGISTRATION_ACCEPT_MO mismatch."); setverdict(fail); @@ -2143,6 +2245,7 @@ module LibNGAP_Functions { function f_NASPDU_Get(inout NGAP_PDU p_PDU) runs on NGNASComponent { vc_recvNGAP_PDU := p_PDU; + vc_recvNAS_PDU := ''O; if (ischosen(p_PDU.initiatingMessage)) { // Nothing to do diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn index 53e38ac..7836f0e 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Security_Functions.ttcn @@ -70,7 +70,8 @@ module Lib_NG_NAS_Security_Functions { in template NG_NAS_DL_Message_Type p_NG_NAS_DL_Message_Type, inout NG_NAS_SecurityParams_Type p_NasSecurityByRef, inout NasCount_Type p_previous_nas_count_dl, - out NG_NAS_DL_Message_Type p_message + out NG_NAS_DL_Message_Type p_message, + out octetstring p_inner_message ) return boolean { log(">>> f_Check_5GAKA_NAS_DL_Message: p_nas_pdu: ", p_nas_pdu); log(">>> f_Check_5GAKA_NAS_DL_Message: p_NasSecurityByRef: ", p_NasSecurityByRef); @@ -178,6 +179,17 @@ module Lib_NG_NAS_Security_Functions { p_message := v_message; log("f_Check_5GAKA_NAS_DL_Message: matching: p_message: ", p_message); + // Extract inner message if any + p_inner_message := ''O; + // if (ischosen(v_message.security_Mode_Complete)) { + // if (ispresent(v_message.security_Mode_Complete.nasMsg)) { + // log("f_Check_5GAKA_NAS_DL_Message: v_message.security_Mode_Complete.nasMsgContainer: ", v_message.security_Mode_Complete.nasMsg); + // p_inner_message := v_message.security_Mode_Complete.nasMsg.replayedNASMsgContainerValue; + // } + // } else { + // p_inner_message := ''O; + // } + log("<<< f_Check_5GAKA_NAS_DL_Message: p_previous_nas_count_dl: ", p_previous_nas_count_dl); return true; } // End of function f_Check_5GAKA_NAS_DL_Message @@ -698,6 +710,88 @@ module Lib_NG_NAS_Security_Functions { return substr(fx_sha256(v_S), 128, 128); }; + /* + * @desc KgNB key derivation functions (S69) + * As per annex A.9 of 33.501/ A.19 of 33.401 + * @param p_uplink_nas_count + * @param p_Key + * @param p_RegAccType + * @param p_KDF_Type + * @return B256_Type + */ + function f_NG_Authentication_A9( + in NasCount_Type p_uplink_nas_count, + in B256_Type p_Key, + in RegistrationAccessType p_RegAccType := Access_3GPP, + in KDF_Type p_KDF_Type := tsc_KDF_HMAC_SHA_256 + ) return B256_Type { + const octetstring const_S6E_FC :='6E'O; + var octetstring v_S; + // Generation of String + v_S := const_S6E_FC; + log("f_NG_Authentication_A9 (1): v_S=", v_S); + //FC = 0x6E + v_S := ( v_S & p_uplink_nas_count ); + log("f_NG_Authentication_A9 (2): v_S=", v_S); + //P0 = Uplink NAS COUNT + v_S := ( v_S & int2oct ( 4, 2 ) ); + log("f_NG_Authentication_A9 (3): v_S=", v_S); + //L0 = length of uplink NAS COUNT + if (p_RegAccType == Access_3GPP) { + v_S := ( v_S & '01'O ); + } else { + v_S := ( v_S & '02'O ); + } + log("f_NG_Authentication_A9 (4): v_S=", v_S); + //P1 = Access type distinguisher + v_S := ( v_S & '0001'O ); + log("f_NG_Authentication_A9 (5): v_S=", v_S); + //L1 = length of Access type distiguisher (i.e. 0x00 0x01) + + return fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S); + } + + /* + * @desc KnhGnb key derivation functions (S69) + * As per annex A.9 of 33.501/ A.19 of 33.401 + * @param p_sync_input + * @param p_Key + * @param p_KDF_Type + * @return B256_Type + */ + function f_NG_Authentication_A10( + in B256_Type p_sync_input, // This is the Kgnb key in 33.401 but it can be any input as per 33.501 + in B256_Type p_Key, + in KDF_Type p_KDF_Type := tsc_KDF_HMAC_SHA_256 + ) return B256_Type { + const octetstring const_S6F_FC :='6F'O; + var octetstring v_S; + // Generation of String + v_S := const_S6F_FC; + log("f_NG_Authentication_A10 (1): v_S=", v_S); + //FC = 0x6F + v_S := ( v_S & bit2oct(p_sync_input) ); + log("f_NG_Authentication_A10 (2): v_S=", v_S); + //P0 = SYNC INPUT + v_S := ( v_S & int2oct ( 4, 2 ) ); + log("f_NG_Authentication_A10 (3): v_S=", v_S); + //L0 = length of SYNC INPUT + + return fx_KeyDerivationFunction(p_KDF_Type, p_Key, v_S); + } + + + + + + + + + + + + + function f_extract_sqn_ak_from_autn(in B128_Type p_autn) return B48_Type { diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn index e0599a5..28e246d 100644 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Templates.ttcn @@ -2498,4 +2498,82 @@ module Lib_NG_NAS_Templates { hdp := p_hdp } + template (value) NG_TrackingAreaIdList m_NG_TrackingAreaIdList( + in IEI8_Type p_iei := '54'O, + in template (value) NG_TrackingAreaIdList_LV p_lvPart + ) := { + iei := p_iei, + lvPart := p_lvPart + } + + template (present) NG_TrackingAreaIdList mw_NG_TrackingAreaIdList( + template (present) IEI8_Type p_iei := '54'O, + template (present) NG_TrackingAreaIdList_LV p_lvPart := ? + ) := { + iei := p_iei, + lvPart := p_lvPart + } + + template (value) NG_TrackingAreaIdList_LV m_NG_TrackingAreaIdList_LV( + in Type4Length_Type p_iel, + in template (value) NG_TrackingAreaIdList_LV.listOfPartialTais p_listOfPartialTais + ) := { + iel := p_iel, + listOfPartialTais := p_listOfPartialTais + } + + template (present) NG_TrackingAreaIdList_LV mw_NG_TrackingAreaIdList_LV( + template (present) Type4Length_Type p_iel := ?, + template (present) NG_TrackingAreaIdList_LV.listOfPartialTais p_listOfPartialTais := ? + ) := { + iel := p_iel, + listOfPartialTais := p_listOfPartialTais + } + + template (value) NG_ListOfPartialTaiList m_NG_ListOfPartialTaiList( + in B1_Type p_allowedType := '0'B, + in B2_Type p_typeOfList := '10'B, + in B5_Type p_numberOfElements, + in NG_PartialTaiType p_partialTaiList + ) := { + allowedType := p_allowedType, + typeOfList := p_typeOfList, + numberOfElements := p_numberOfElements, + partialTaiList := p_partialTaiList + } + + template (present) NG_ListOfPartialTaiList mw_NG_ListOfPartialTaiList( + template (present) B1_Type p_allowedType := '0'B, + template (present) B2_Type p_typeOfList := '10'B, + template (present) B5_Type p_numberOfElements := ?, + template (present) NG_PartialTaiType p_partialTaiList := ? + ) := { + allowedType := p_allowedType, + typeOfList := p_typeOfList, + numberOfElements := p_numberOfElements, + partialTaiList := p_partialTaiList + } + + template (value) NG_PartialTaiType m_NG_PartialTaiType_type3( + in template (value) NG_Type3Element p_type3 + ) := { + type3 := p_type3 + } + + template (value) NG_Type3Element m_NG_Type3Element( + in template (value) NAS_PlmnId p_plmnId + ) := { + plmnId := p_plmnId + } + + template (value) NG_TrackingAreaId m_NG_TAI( + in NAS_PlmnId p_PlmnId, // O3_Type + in O3_Type p_Tac // O3_Type + ) := { + iei := omit, + plmnId := p_PlmnId, + tac := p_Tac + } + + } // End of module Lib_NG_NAS_Templates \ No newline at end of file diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index 17caa0f..f7839fd 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -117,7 +117,9 @@ module Lib_NG_NAS_Functions { // ), // vc_ng_nas_security_params_type, // vc_previous_nas_count_dl, - // v_message) == false) { + // v_message, + // vc_inner_message + // ) == false) { // setverdict(fail); // return; // } @@ -149,7 +151,8 @@ module Lib_NG_NAS_Functions { // ), // vc_ng_nas_security_params_type, // vc_previous_nas_count_dl, - // v_message + // v_message, + // vc_inner_message // ) == false) { // setverdict(fail); // return; @@ -229,7 +232,8 @@ module Lib_NG_NAS_Functions { mw_NG_SECURITY_MODE_COMMAND, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { setverdict(fail); return; @@ -263,7 +267,8 @@ module Lib_NG_NAS_Functions { // mw_NG_SECURITY_MODE_COMMAND, // vc_ng_nas_security_params_type, // vc_previous_nas_count_dl, - // v_message + // v_message, + // vc_inner_message // ) == false) { // setverdict(fail); // return; @@ -329,7 +334,8 @@ module Lib_NG_NAS_Functions { mw_NG_REGISTRATION_ACCEPT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, - v_message + v_message, + vc_inner_message ) == false) { setverdict(fail); return; -- GitLab From b32d5bd12b737fdfeb2447f5f2f7b3e69bfdf143 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Tue, 9 Jun 2026 11:55:17 +0000 Subject: [PATCH 127/151] TP Id rename TP_NGNAS_AMF_AUT_SEQ_01 -> TP_NGNAS_AMF_SEC_COM_01 due to naming conventions --- test_purposes/TP_AMF_NGNAS.tdltx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_purposes/TP_AMF_NGNAS.tdltx b/test_purposes/TP_AMF_NGNAS.tdltx index 4f6ef94..bbf50c4 100644 --- a/test_purposes/TP_AMF_NGNAS.tdltx +++ b/test_purposes/TP_AMF_NGNAS.tdltx @@ -311,7 +311,7 @@ Package TP_AMF_NGNAS { Import all from NGAP_Common Import all from NGNAS_Common - Test Purpose TP_5GNAS_AMF_AUT_SEQ_01 { + Test Purpose TP_5GNAS_AMF_SEC_COM_01 { //!Renamed TP Id from AUT_SEQ -> SEC_COM due to naming conventions Objective: "Verify that the IUT sends a SECURITY_MODE_COMMAND message to initiate the NAS security mode control procedure upon receipt of an AUTHENTICATION_RESPONSE message in a 5G AKA based primary authentication procedure." @@ -355,7 +355,7 @@ Package TP_AMF_NGNAS { to the GNB entity } } - } // end TP_5GNAS_AMF_AUT_SEQ_01 + } // end TP_5GNAS_AMF_SEC_COM_01 Test Purpose TP_5GNAS_AMF_SEC_ACC_01 { -- GitLab From bd07d24cb6f4ab7490510a00faa33e2df483b396 Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 10 Jun 2026 09:08:35 +0200 Subject: [PATCH 128/151] Validate TC_5GNAS_AMF_AUT_REQ_01/02; Review TAG for UL/DL messages --- NAS_ETSI.code-workspace | 6 - captures/TC_5GNAS_AMF_AUT_REQ_01.pcap | Bin 0 -> 6214 bytes captures/TC_5GNAS_AMF_AUT_REQ_02.pcap | Bin 0 -> 6050 bytes captures/TC_NGAP_AMF_PDU_02.pcap | Bin 3660 -> 4472 bytes etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 77 ++++--- scripts/run_ptcs.bash | 9 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 218 +++++++++--------- ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn | 91 +++++++- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 152 ++++++------ ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 4 +- ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn | 41 +--- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 80 ++++++- ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn | 12 +- 13 files changed, 417 insertions(+), 273 deletions(-) create mode 100644 captures/TC_5GNAS_AMF_AUT_REQ_01.pcap create mode 100644 captures/TC_5GNAS_AMF_AUT_REQ_02.pcap diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index 7e2f7ec..a72cd0f 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -11,12 +11,6 @@ }, { "path": "../UERANSIM" - }, - { - "path": "../../tmp/tobedeleted/nas-TTF_T048_AMF" - }, - { - "path": "../../tmp/tobedeleted/nas-TTF_T048_GNB" } ], "settings": { diff --git a/captures/TC_5GNAS_AMF_AUT_REQ_01.pcap b/captures/TC_5GNAS_AMF_AUT_REQ_01.pcap new file mode 100644 index 0000000000000000000000000000000000000000..024f8fbbd9a73a02703b3d4d14d48c66e0d2d952 GIT binary patch literal 6214 zcmca|c+)~A1{MYcU}0cnU|{$xr;)X488<@^0|OW%Z zjGMuTfdPzRdOCkzZ(3=j;`3BzC$ zVxT67)iW?K)-y1$K3Ou22d09Nfx$*-&89f88@c}fUsot1!@$bG0a6R153FDm1<_o( z42{;=x7)q#I-kay&3FGgyK16-YS&00s^aAM7!(pIW{_`~&hA#5f2Ec7*{0GsqP- z_8|X&T!I{$AU}a!!8rdENDs(Qe*YL4+87`hBnHD^(<&HPK&DxL!)6)-Geg+ALJ?VT z9Dua(J2){gurh>#$|nXj1_|*x2FFSUUdEX}*+J4EETG5q;R8b@1HZ$}pX@>=0YU~~ zNk)b!2Sy2o0tZm}0&4Ragt6J77fn3#h8stBa%do_oEVyh0X=7#x zO17W+6I>}VFxW7#IM{(w5Es~$Ft=)J)iH!IFflMF?v+@%|9o#uzARI`t>=chcNGM# z&nW6it!!ZU_9b)m1KmShkd$@Wh>@X>fdPy`*1#~>g$)d>AQxJ{1-TC7N-VMP6Ul`E z>k38Wzy&+V7(E9Y1_l-eR2Pbg)-iMsUHa0r6JPaHG+SeWY=BEYGW$Al4F--GIX zkY`{R94;3DOHeZJ|-ZOK=nCtNU?xY6C;BK zsKx}zflWjs9KKmAfYLNqbHvlRYwV80rR6oU-s82IfgNPC4L>%2uu@<%qr67ek|#{~ z{HzADnfWlt&!DyoE?m72QfV>Zu1=+kGugwe`Ae(LY2>F>* zo7v@%dRDWHa+2a{bJ}X9JFBbU%Y^md9_i2FPX~Ly*k}Rxpa<3T==aI2h3h zsLkjp3}mw^ew#HxHut>&*$fJCTsDK`&@Bb?p*Cx7|My*z>Gxr<7^r0}uaV`1*JcJz zkj*x{Ad^A1Bj-`%w2dpC@rAZ0ew(?#HuDg&nVirLz;81**k*1*HiP70A&Elc2yGsD zjjY>G+3}@qEs)JV`k;^o`3qM(gXB9dwqo-|<&8P9(tOK%{c`wLjQ2NDX zGe{1_Mi>WbGkQq^viUP!n;CdPHrs&eR(M|()}KMnRpj{jFMgZ(z&3+>z94_&if2;& zEF`ay#c_cRPkRE|KZlPYEUQHwLwJ=F`v}~Uk^BGO(J9Uxy&n#;LG=O~s4))4ut)&W z;1&z4e}goJu&fqrDyXDmU|ke^AlSwvnVi;tBVpP%(XHupUP`59z8E+j03BB#&V$NC1b;GV&T(J0~$Rm@zPbF-R#4gG+u5 z22rrhrXZ8iZDs=vGx0F67|Cm7J=7I$%_&>AX8UL#B9BfefadMJgOVBr_AGqx$#MxkUhE^K{i-@WCYisct;75YSFdl J!KOmp2mq_W_nQC! literal 0 HcmV?d00001 diff --git a/captures/TC_5GNAS_AMF_AUT_REQ_02.pcap b/captures/TC_5GNAS_AMF_AUT_REQ_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..f6e777c656d1ab424f3cfee9cafa76da0ad2fec4 GIT binary patch literal 6050 zcmca|c+)~A1{MYcU}0cnU|^`=(9B}l%)}7HzyQVwc?Jd!23IBq7X}6g28R|K^?C*d zmU;#T&bdGNWniip85mTS$d_(mU|hh!Aou@&?6%x@3_J{M46FkORzEoF*1NL%uEmsvY8PYI@Wq1TR|pH88O898Ju*b)wzIBl2RKks+_u|tm{)rD7rOhm?iLw5KiFY(QWiLEhBDyv?) zT|$n5i$Qa_G*xQFnMH}XBsGG85kOv7*q-z=kA;Ll=;GhPA`Q&>jO6BotUQ) z`S|3vd$*3}=yF@XM%IUqO-U$XGZ&URKp}ibf|bFHkpYa6)q+DaU}lhJ;AEKjlRbcefq{`Bje!>=%?J`<0F^GH z4vY>A3?R1~%Cj=qF))BJNDT~w-EJ`9D#+&5IUrj>wj;ZpnSnt7Y%}BhYam@9)1(bq z8Oj(Kz!)S3!(h`gCR_uXW{k}=24)5~a4v;tu~85O1u3Yc%uO?3 zNMPV#0C|Lo!GR&nf$={>00Rez5B3OENMd+Zu4$2-3#P5Txe2Sqoe#F)-LLusGO( zQVl?@uyDb(#oB@!_Mc|An3JR+@RxZ} jc3|c9PwNqK5 zydf#;dNnIU9|HpzgRFsJunQX)SV1ndehYFPj#$t_a$&%^{#9$i1v|(XJqH^G1{MZX z7mA72F@)<1faFndr2~3cg2GR+7GI8=a0BGJ)wUp)fn10s{MI75PFu})vo-@GI0QlA zCyp6@EX;Kb5#ZFRU&{)v??LrGvO~e);xgeT*ya#yHZw3YsHpjF)?r`-MFfKlgC>Ij zsIDtw0Ob=#27U)d2aw;4YVoFjHjoWAHXwh2Y{8QLbr=}uUj(^r8i!_<#Cb^F4{8H| z#9$cg-k1ruK&EBXgG>U|=g1+&0!mGc3>Kgo6C?-IiA+1Bo>2y+=|%Ul1b4spD~8E| zY}UnVGXp!wW*dHN{$Qoh=K4)|Q^#$P%?f-VKZDvXxcm%~gZT%UZb*apS!b{I_u2EW z!1F%H&wKFN%)kM%*#=}YytM_Zk&*pOj?McNc=4o5Xgd$y7JU?o+7@kW_k0e{5pw_k zyRZ46g5I73`R%F#FQ`xlW90AvrzBWCiPRQ-6bd#K+7_M7p_!GO!V7MP;z)~kK%tXS z3yPNmD;Py_#S2Id*?u^?1`;pmX%S>|6JDDcI6*es@RFMr8F1J#??JqNz6-Kh zfd}MgP^{zfGe{2ZPh>^|#Lwty5o9yVA-p!<1KGUV9Aq=d-?(fB$st<^XG3i^i(nCB z|D2x>69?I>iPvTZE|ASOAU~6p3mBj_WAn2Cew(?$Hgkjg1oAg>*@>M0K=LsEpwLj8 z(fz!LLo;iU3J1QleII0VMit0bQ2NCc+8{X;8)2Mjka$K<+aR0o{%I8zAwF&1O%$HZ$;pY_?$sg(k>$ zT%iqe6-p?>ICyM+{{*j}AAxMnCLzIc8DvU#;3$j_h<$K_{`9Ex9IoK28;Mo-%yKflFmGlL+=W*cx{2xL31 zcqY~6bsU;m{+&Gd{QMMTvjS-Rj=YlO7{t%$X&Yp7K3Pb`1tmu+5bWk0NEAcLWZpXEF5(*i>lG0sukz#)SX? literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_AMF_PDU_02.pcap b/captures/TC_NGAP_AMF_PDU_02.pcap index 1b1100d8209443873a71f6bc95a9caef8b7db692..47d64281c675e9c85e9e40e1b439848edf91c3fe 100644 GIT binary patch literal 4472 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 CCnHn< diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 7bedf2a..3682eb5 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -1,33 +1,47 @@ [MODULE_PARAMETERS] # This section shall contain the values of all parameters that are defined in your TTCN-3 modules. -NG_NAS_Pics.PICS_NGNAS := true +LibCommon_Time.PX_TDONE := 30.0; +LibCommon_Time.PX_TAC := 30.0; +LibCommon_Time.PX_TNOAC := 10.0; +LibCommon_Time.PX_TWAIT := 30.0; +LibCommon_Sync.PX_TSYNC_TIME_LIMIT := 10.0; +LibCommon_Sync.PX_TSHUT_DOWN_TIME_LIMIT := 10.0; NGAP_Pics.PICS_NGAP_AMF_IUT := true NGAP_Pics.PICS_NGAP_GNB_IUT := false -LibNGAP_Pics.PICS_OFFLINE_MODE := true - -# 5GRegAuthSec_deReg.pcap -LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" -LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 -LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 1 -# https://www.binaryhexconverter.com/hex-to-binary-converter -LibNGAP_Pixits.PX_NAS_MCC := '999'H -LibNGAP_Pixits.PX_NAS_MNC := '70'H -LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B -LibNGAP_Pixits.PX_AMF_SET_ID := '0000000100'B -LibNGAP_Pixits.PX_AMF_POINTER := '000000'B -LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B -LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" -LibNGAP_Pixits.PX_TACode := '000001'O -LibNGAP_Pixits.PX_SST := '01'O -LibNGAP_Pixits.PX_SD := '000009'O -LibNGAP_Pixits.PX_PAGING_DRX := v128 +NG_NAS_Pics.PICS_NGNAS := true + +LibNGAP_Pics.PICS_OFFLINE_MODE := false # true to use offline mode with pcap files, false to use online mode with real network functions +LibNGAP_Pics.PICS_USE_OPEN5GS := false # true to start open5gs, false to not start them + +LibNGAP_Pixits.PX_NAS_MCC := '999'H +LibNGAP_Pixits.PX_NAS_MNC := '70'H +LibNGAP_Pixits.PX_RAN_NODE_NAME := "gnb0012345" +LibNGAP_Pixits.PX_GNB_ID := '00000000000000000000000000000001'B +LibNGAP_Pixits.PX_RAN_NODE_NAME := "UERANSIM-gnb-999-70-1" +LibNGAP_Pixits.PX_TACode := '000001'O +LibNGAP_Pixits.PX_SST := '01'O +LibNGAP_Pixits.PX_SD := '000009'O +LibNGAP_Pixits.PX_PAGING_DRX := v128 +LibNGAP_Pixits.PX_AMF_NAME := "open5gs-amf0" +LibNGAP_Pixits.PX_AMF_REGION_ID := '00000010'B +LibNGAP_Pixits.PX_AMF_SET_ID := '0000000001'B +LibNGAP_Pixits.PX_AMF_POINTER := '000000'B +LibNGAP_Pixits.PX_RAN_UE_NGAP_ID := 1 +LibNGAP_Pixits.PX_AMF_UE_NGAP_ID := 2 + +LibNGAP_Pixits.PX_TIME_ZONE := '80'O # 0x40 for GMT+1, 0x80 for GMT+2 + +LibNGAP_Pixits.PX_PDU_SESSION_ID := 1 Lib_NG_NAS_Pixits.PX_CHECK_SECURITY := false -Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B +Lib_NG_NAS_Pixits.PX_SUPI_FORMAT := '0000'B # IMSI format +Lib_NG_NAS_Pixits.PX_TYPE_OF_ID := '001'B # SUCI type Lib_NG_NAS_Pixits.PX_SUPI_DIGITS := '00f110214300014444330302'O +Lib_NG_NAS_Pixits.PX_MSIN := '0000000010'O; +Lib_NG_NAS_Pixits.PX_NETWORK_NAME := "Open5GS" # OP Lib_NG_NAS_Pixits.PX_OPERATOR_KEY := '00000000000000000000000000000000'O @@ -38,9 +52,13 @@ Lib_NG_NAS_Pixits.PX_FORCE_USING_OPERATOR_SECRET_KEY := true Lib_NG_NAS_Pixits.PX_SUBSCRIPTION_KEY := '01000110010110110101110011101000101100011001100110110100100111111010101001011111000010100010111011100010001110001010011010111100'B Lib_NG_NAS_Pixits.PX_BEARER_ID := '00001'B -Parameters.px_IMSI_Def := '393939373030303030303030303031'H; # 999700000000001 +Parameters.px_IMSI_Def := '393939373030303030303030303031'H # 999700000000001 +Parameters.px_IMEISV_Def := '73806121856151f1'H NAS_5GC_Parameters.px_NAS_5GC_XRES_Length := 8 # In ETSI TS 135 206 V16.0.0 (2020-08) Table Table 5. f2 output, RES length is 8 octets (64 bits) +# Upper tester parameters for UERANSIM integration +LibNGAP_Pixits.PX_OPEN5GS_BINARY_FILE := "/home/yann/dev/open5gs/build/tests/app/5gc" + [LOGGING] # In this section you can specify the name of the log file and the classes of events # you want to log into the file or display on console (standard error). @@ -58,8 +76,13 @@ LogEventTypes:= Yes [TESTPORT_PARAMETERS] # In this section you can specify parameters that are passed to Test Ports. +# Open5GS AMF IP and port as listener +system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" + # Open5GS pcap files -system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/open5gs.pcap)" +# Do not forget to set LibNGAP_Pics.PICS_OFFLINE_MODE to true +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/PCAP_FILE(file=../captures/ttcn_5g_ngap.pcapng)" # Linux cooked capture v2, no Ethernet layer +#system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,mac_dst=8c554ac1eee1)/PCAP_FILE(file=../captures/TC_NGAP_AMF_PDU_01.pcap)" # regular pcap with Ethernet layer [DEFINE] # In this section you can create macro definitions, @@ -88,9 +111,9 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 -# Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI -#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 -# Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure +# Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message +NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +# Verify that the IUT stops re-sending an AUTHENTICATION_REQUEST message if no AUTHENTICATION_RESPONSE message is received on the fifth expire of timer T3560 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 # Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 @@ -118,7 +141,7 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma #NG_NAS_TestCases.TC_5GNAS_AMF_DRG_REQ_02 #NG_NAS_TestCases.TC_5GNAS_AMF_DRG_REQ_03 - +# Security function tests, out of scope of the Ats_NG_NAS test suite, but useful to verify the correctness of the test implementation and the security functions used in the test suite. These tests are based on the 5G AKA test vectors given in 3GPP TS 35.208 V16.0.0 (2020-09) Annex A, and on the security analysis of 5G authentication given in the Eurecom publication "Security Analysis of 5G Authentication" (https://eprint.iacr.org/2022/1623.pdf) #NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_01 #NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_02 #NG_NAS_TestCases.TC_5G_AKA_RIJNDAEL_FUNCTIONS_TEST_01_03 @@ -176,7 +199,7 @@ system.NGAP_AMF.params := "NGAP/SCTP_FILE/IP_OFFLINE/ETH(mac_src=8c554ac1eee0,ma #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_01_03 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_02_02 #NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_26_03_01 -NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_27_01 +#NG_NAS_TestCases.TC_5G_AKA_CRYPTO_FUNCTIONS_TEST_27_01 [GROUPS] diff --git a/scripts/run_ptcs.bash b/scripts/run_ptcs.bash index 1c097d4..1f319e6 100755 --- a/scripts/run_ptcs.bash +++ b/scripts/run_ptcs.bash @@ -26,11 +26,8 @@ then rm -f ./core fi -if [ "$ATS" == "AtsRSUsSimulator" ] -then - sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH ../bin/$ATS 127.0.0.1 12001 -else - sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH ../bin/$ATS 127.0.0.1 12000 -fi +LOCAL_ADDRESS=`cat ../etc/$ATS/$ATS.cfg | grep 'LocalAddress := ' | awk '{print $3}'` +PORT=`cat ../etc/$ATS/$ATS.cfg | grep 'TCPPort := ' | awk '{print $3}'` +sudo LD_LIBRARY_PATH=$LD_LIBRARY_PATH ../bin/$ATS $LOCAL_ADDRESS $PORT cd ${CURPWD} diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index c22172a..fe59b99 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -62,7 +62,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body var PDUSessionResourceSetupRequestTransfer v_pdu_session_resource_setup_request_transfer := valueof( m_pDUSessionResourceSetupRequestTransfer( m_pDUSessionResourceSetupRequestTransfer_mandatories( @@ -156,7 +156,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceSetupRequest( @@ -268,7 +268,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceSetupRequest( @@ -414,7 +414,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceSetupRequest( @@ -503,7 +503,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceReleaseCommand( @@ -572,7 +572,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceReleaseCommand( @@ -655,7 +655,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceModify( @@ -761,7 +761,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceModify( @@ -844,7 +844,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PDU session resource NOTIFY!"); f_recv_NGAP_PDU( @@ -890,7 +890,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PDU session resource MODIFY!"); f_recv_NGAP_PDU( @@ -947,7 +947,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest @@ -1033,7 +1033,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body /* FIXME TODO To be fixed f_send_NGAP_PDU( m_ngap_initMsg( @@ -1083,7 +1083,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest_optional_TraceActivation @@ -1175,7 +1175,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest_optional_MobilityRestriction @@ -1263,7 +1263,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest_differentOptionals @@ -1392,7 +1392,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest @@ -1485,7 +1485,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger UE context release request"); @@ -1525,7 +1525,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextReleaseCommand @@ -1567,7 +1567,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextReleaseCommand @@ -1613,7 +1613,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextModificationRequest @@ -1660,7 +1660,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextModificationRequest @@ -1701,7 +1701,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextModificationRequest_optional1 @@ -1744,7 +1744,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UEContextModificationRequest_optional2 @@ -1805,7 +1805,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a RRC inactive transition report"); f_recv_NGAP_PDU( @@ -1854,7 +1854,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a RAN CP relocation indication procedure"); f_recv_NGAP_PDU( @@ -1903,7 +1903,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a UE context suspend request"); f_recv_NGAP_PDU( @@ -1945,7 +1945,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); } - // Body + // Test Body action("Trigger a UE context resume request"); f_recv_NGAP_PDU( @@ -1984,7 +1984,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_HandoverRequired( @@ -2026,7 +2026,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequest( @@ -2109,7 +2109,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_NoLongerAvailable(); f_send_NGAP_PDU( m_ngap_initMsg( @@ -2185,7 +2185,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequest_full( @@ -2299,7 +2299,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_NoLongerAvailable(); f_send_NGAP_PDU( m_ngap_initMsg( @@ -2389,7 +2389,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_NoLongerAvailable(); f_send_NGAP_PDU( m_ngap_initMsg( @@ -2472,7 +2472,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_HandoverNotify( @@ -2507,7 +2507,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_PathSwitchRequest( @@ -2539,7 +2539,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_MMP_Cancel_Initiated_Handover(); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -2573,7 +2573,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_MMP_Cancel_Initiated_Handover(); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -2614,7 +2614,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_MMP_Initiate_UE_Uplink_RAN_Early_Status_Transfer(); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -2661,7 +2661,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_initialUeMessage( @@ -2694,7 +2694,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_RRC_UL_Message(); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -2726,7 +2726,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_gnb_UE_RRC_UL_Message_Failure(); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -2768,7 +2768,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger NG SETUP REQUEST!"); f_recv_NGAP_PDU( @@ -2827,7 +2827,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGReset( @@ -2863,7 +2863,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGReset( @@ -2918,7 +2918,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger Uplink_RAN_Configuration_Transfer!"); f_recv_NGAP_PDU( @@ -2951,7 +2951,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger Downlink_RAN_Configuration_Transfer!"); f_recv_NGAP_PDU( @@ -2989,7 +2989,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_WriteReplaceWarningRequest( @@ -3032,7 +3032,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_WriteReplaceWarningRequest( @@ -3079,7 +3079,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PWSCancelRequest( @@ -3124,7 +3124,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PWS_Restart_Indication!"); f_recv_NGAP_PDU( @@ -3166,7 +3166,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PWS_Failure_Indication!"); f_recv_NGAP_PDU( @@ -3206,7 +3206,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger NRPPA transport procedure!"); f_recv_NGAP_PDU( @@ -3243,7 +3243,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger NRPPA transport procedure!"); f_recv_NGAP_PDU( @@ -3285,7 +3285,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_TraceStart( @@ -3344,7 +3344,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_DeactivateTrace( @@ -3394,7 +3394,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger CELL TRAFFIC TRACE!"); f_recv_NGAP_PDU( @@ -3444,7 +3444,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_LocationReportingControl( @@ -3505,7 +3505,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_LocationReportingControl( @@ -3559,7 +3559,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger UE Radio Capability Management procedure!"); f_recv_NGAP_PDU( @@ -3600,7 +3600,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UERadioCapabilityCheckRequest( @@ -3648,7 +3648,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger UE_RADIO_CAPABILITY_ID_MAPPING_REQUEST !"); f_recv_NGAP_PDU( @@ -3690,7 +3690,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger SECONDARY_RAT_DATA_USAGE_REPORT !"); f_recv_NGAP_PDU( @@ -3734,7 +3734,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a uplink RIM Information Transfer procedure!"); f_recv_NGAP_PDU( @@ -3786,7 +3786,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PDU session resource SETUP!"); f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command @@ -3884,7 +3884,7 @@ module NGAP_TCFunctions { f_sleep(1.0); // Sleep for a while to ensure the previous procedure is completed before triggering the release log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PDU session resource RELEASE!"); f_NGAP_amf_UE_PDU_SessionResourceReleaseRequest(); // f_send_pdu_session_resource_release_request @@ -3963,7 +3963,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PDU session resource MODIFY!"); f_recv_NGAP_PDU( @@ -4014,7 +4014,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceModifyIndication( @@ -4100,7 +4100,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_PDUSessionResourceModifyIndication( @@ -4197,7 +4197,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a PDU initial context setup procedure!"); f_recv_NGAP_PDU( @@ -4287,7 +4287,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a UE context release command!"); f_sleep(1.0); // Sleep for a while to make sure the previous procedure is completed f_NGAP_amf_UE_ContextRealeaseRequest(); // f_send_ue_context_release_request @@ -4330,7 +4330,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger a UE context release command!"); f_sleep(1.0); // Sleep for a while to make sure the previous procedure is completed f_NGAP_amf_UE_ContextRealeaseRequest(); // f_send_ue_context_release_request @@ -4386,7 +4386,7 @@ module NGAP_TCFunctions { // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // } - // // Body + // // Test Body // action("Trigger a PDU UE context modification procedure!"); // f_recv_NGAP_PDU( @@ -4431,7 +4431,7 @@ module NGAP_TCFunctions { // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // // Body + // // Test Body // action("Trigger a PDU UE context modification procedure!"); // f_recv_NGAP_PDU( @@ -4476,7 +4476,7 @@ module NGAP_TCFunctions { // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // // Body + // // Test Body // action("Trigger a AMF CP relocation indication procedure!"); // f_recv_NGAP_PDU( @@ -4521,7 +4521,7 @@ module NGAP_TCFunctions { // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // // Body + // // Test Body // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_RetrieveUEInformation( @@ -4577,7 +4577,7 @@ module NGAP_TCFunctions { // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // // Body + // // Test Body // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_UEContextSuspendRequest( @@ -4633,7 +4633,7 @@ module NGAP_TCFunctions { // f_selfOrClientSyncAndVerdict(c_prDone, e_success); // } - // // Body + // // Test Body // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_UEContextSuspendRequest( @@ -4691,7 +4691,7 @@ module NGAP_TCFunctions { // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // // Body + // // Test Body // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_UEContextResumeRequest @@ -4736,7 +4736,7 @@ module NGAP_TCFunctions { // f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); // log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // // Body + // // Test Body // f_send_NGAP_PDU( // m_ngap_initMsg( // m_n2_UEContextResumeRequest @@ -4780,7 +4780,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverRequired( @@ -4838,7 +4838,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_NGAP_amf_UE_Not_Available(); f_send_NGAP_PDU( m_ngap_initMsg( @@ -4895,7 +4895,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -4927,7 +4927,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -4952,7 +4952,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -4981,7 +4981,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_HandoverCancel @@ -5022,7 +5022,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("the IUT entity indicate a Downlink RAN Status Transfer procedure"); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -5068,7 +5068,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("the IUT entity indicate the initiation \"of an UE handover success procedure\""); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -5105,7 +5105,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("the IUT entity indicate a Downlink RAN Early Status Transfer procedure"); f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -5155,7 +5155,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger Paging!"); f_recv_NGAP_PDU( @@ -5203,7 +5203,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( @@ -5272,7 +5272,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( @@ -5335,7 +5335,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( @@ -5397,7 +5397,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( @@ -5462,7 +5462,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGSetupRequest( @@ -5531,7 +5531,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGSetupRequest_UERetentionInf( @@ -5632,7 +5632,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGSetupRequest_ExtRanNodeName( @@ -5742,7 +5742,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_RANConfigurationUpdate_SupportedTAList( @@ -5802,7 +5802,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_RANConfigurationUpdate_SupportedTAList( @@ -5868,7 +5868,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger AMF CONFIGURATION UPDATE !"); f_recv_NGAP_PDU( @@ -5936,7 +5936,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_NGReset( @@ -5982,7 +5982,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_send_NGAP_PDU( m_ngap_initMsg( m_n2_InitialContextSetupRequest( @@ -6072,7 +6072,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger AMF STATUS INDICATION !"); f_recv_NGAP_PDU( @@ -6123,7 +6123,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger OVERLOAD START !"); f_recv_NGAP_PDU( @@ -6159,7 +6159,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger OVERLOAD STOP !"); f_recv_NGAP_PDU( @@ -6207,7 +6207,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger WRITE REPLACE WARNING REQUEST !"); f_recv_NGAP_PDU( @@ -6248,7 +6248,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger PWS CANCEL REQUEST !"); f_recv_NGAP_PDU( @@ -6294,7 +6294,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger DOWNLINK_UE_ASSOCIATED_NRPPA_TRANSPORT !"); f_recv_NGAP_PDU( @@ -6331,7 +6331,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger DOWNLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT !"); f_recv_NGAP_PDU( @@ -6387,7 +6387,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body action("Trigger Location Reporting Control procedure!"); f_recv_NGAP_PDU( diff --git a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn index 88c9ad5..3e173ae 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn @@ -36,25 +36,80 @@ module NG_NAS_Steps { import from LibHelpers_Functions all; // AtsNGAP - // import from NGAP_Pixits all; + import from NGAP_Pixits all; // import from NGAP_Steps all; + group GlobalSteps { + + /** + * @desc This is a test step that init global variables + * This procedure will be use when the Test System acts as AMF (SUT is gNB) + */ + function f_NGNAS_amf_init() + runs on aMF_NGNAS_NGAPComponent { + + // Defaults + vc_default_ngap := activate (a_defaultNGAP()); + + // Base LibNGAP init function if there will be any base initialisation + f_NGAP_Init_Component(); + + vc_ETS_address := PX_NGAP_ETS_IPADDR; + vc_ETS_port := PX_NGAP_ETS_PORT; + vc_SUT_address := PX_NGAP_SUT_IPADDR; + vc_SUT_port := PX_NGAP_SUT_PORT; + + } // End of function f_NGNAS_amf_init + + } // End of group GlobalSteps + + group Preambles{ + + /** + * @desc + */ + function f_preamble_NGNAS_AMF() runs on aMF_NGNAS_NGAPComponent { + var default v_def_ngap_; + + f_NGNAS_amf_init(); + //f_preambleNGAPClient(); + } // End of function f_preamble_NGNAS_AMF + + } // End of group Preambles + + group Postambles { + + /** + * @desc + */ + function f_postamble_NGAP_AMF( + in template (value) Cause p_Cause := m_cause_nas(authentication_failure) + ) runs on aMF_NGNAS_NGAPComponent { + + f_postambleNGAP_AMF(p_Cause); + + // Deactivate defaults + deactivate; + } // End of function f_postamble_NGAP_AMF + + } // End of group Postambles + group amf { function f_NG_NAS_amf_UE_Register() runs on aMF_NGNAS_NGAPComponent { - log(">>> f_NGAP_amf_UE_f_NG_NAS_amf_UE_RegisterRegister"); + log(">>> f_NG_NAS_amf_UE_Register"); if (PICS_OFFLINE_MODE) { - f_send_NGSetupRequest_await_NGSetupResponse(); + f_await_NGSetupRequest_await_NGSetupResponse(); } else { f_send_NGSetupRequest_await_NGSetupResponse(); } - log("f_NGAP_amf_UE_Register: f_send_registration_request done"); + log("f_NG_NAS_amf_UE_Register: f_send_registration_request done"); if (PICS_OFFLINE_MODE) { f_await_registration_request(); } else { f_send_registration_request(); } - log("<<< f_NGAP_amf_UE_Register"); + log("<<< f_NG_NAS_amf_UE_Register"); } // End of function f_NG_NAS_amf_UE_Register function f_NG_NAS_amf_UE_Authentication() runs on aMF_NGNAS_NGAPComponent { @@ -66,7 +121,16 @@ module NG_NAS_Steps { } } // End of function f_NG_NAS_amf_UE_Authentication - function f_NG_NAS_amf_UE_SecurityMode() runs on aMFNGAPComponent { + function f_NG_NAS_amf_UE_Authentication_with_invalid_response() runs on aMF_NGNAS_NGAPComponent { + log(">>> f_NG_NAS_amf_UE_Authentication_with_invalid_response"); + if (PICS_OFFLINE_MODE) { + f_await_authentication_request_await_authentication_response(); + } else { + f_await_authentication_request_send_authentication_response_with_invalid_response(); + } + } // End of function f_NG_NAS_amf_UE_Authentication + + function f_NG_NAS_amf_UE_SecurityMode() runs on aMF_NGNAS_NGAPComponent { log(">>> f_NG_NAS_amf_UE_SecurityMode"); if (PICS_OFFLINE_MODE) { f_await_security_mode_command_await_security_mode_complete(); @@ -76,7 +140,7 @@ module NG_NAS_Steps { log("<<< f_NG_NAS_amf_UE_SecurityMode"); } // End of function f_NG_NAS_amf_UE_SecurityMode - function f_NG_NAS_amf_UE_InitialContextSetup() runs on aMFNGAPComponent { + function f_NG_NAS_amf_UE_InitialContextSetup() runs on aMF_NGNAS_NGAPComponent { log(">>> f_NG_NAS_amf_UE_InitialContextSetup"); if (PICS_OFFLINE_MODE) { f_await_initial_context_setup_request_await_initial_context_setup_resonse(); @@ -85,7 +149,7 @@ module NG_NAS_Steps { } } // End of function f_NG_NAS_amf_UE_InitialContextSetup - function f_NG_NAS_amf_RegistrationComplete() runs on aMFNGAPComponent { + function f_NG_NAS_amf_RegistrationComplete() runs on aMF_NGNAS_NGAPComponent { log(">>> f_NG_NAS_amf_RegistrationComplete"); if (PICS_OFFLINE_MODE) { f_await_registration_complete(); @@ -94,6 +158,17 @@ module NG_NAS_Steps { } } // End of function f_NG_NAS_amf_RegistrationComplete + /** + * @desc + */ + function f_NG_NAS_amf_UE_ContextRealease_ContextRealeaseComplete() runs on aMFNGAPComponent { + if (PICS_OFFLINE_MODE) { + f_await_ue_context_release_command_await_ue_context_release_complete(); + } else { + f_await_ue_context_release_command_send_ue_context_release_complete(); + } + } // End of function f_await_ue_context_release_command_send_ue_context_release_complete + } // End of group amf diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 4feb0d0..7c536c3 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -64,16 +64,17 @@ module NG_NAS_TCFunctions { // Local variables // Preamble + f_NGNAS_amf_init(); f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - ?,//?,//PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + ?, + vc_RAN_UE_ID, ? // AuthorizationRequest ))); f_NASPDU_Get(vc_recvNGAP_PDU); @@ -81,10 +82,10 @@ module NG_NAS_TCFunctions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - ?, //'100'B, + ?, -, - ?, // Authentication_parameter_RAND - ? // Authentication_parameter_AUTN + mw_GMM_AuthRAND, + mw_GSM_AUTN ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, @@ -102,8 +103,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_send_NasAuthenticationFailure(); - f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); + f_send_error_indication(m_cause_nas(authentication_failure)); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_01 @@ -115,43 +116,42 @@ module NG_NAS_TCFunctions { // Local variables // Preamble - f_send_NGSetupRequest_await_NGSetupResponse(); - f_send_NasRegistrationRequest(); - f_NG_NAS_amf_UE_Authentication(); + f_NGNAS_amf_init(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body + f_NG_NAS_amf_UE_Authentication_with_invalid_response(); + f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - ?,// Set by AMF - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, - ? // SecurityModeCommand + vc_AMF_UE_ID, + vc_RAN_UE_ID, + ? // AuthorizationReject ))); f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, - mw_NG_SECURITY_MODE_COMMAND, + mw_NG_AUTHENTICATION_REJECT, vc_ng_nas_security_params_type, vc_previous_nas_count_dl, v_message, vc_inner_message ) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_SECURITY_MODE_COMMAND mismatch. ***"); + log("*** " & __SCOPE__ & ": FAIL: NG_AUTHENTICATION_REJECT mismatch. ***"); setverdict(fail); } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_SECURITY_MODE_COMMAND ***"); + log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REJECT ***"); setverdict(pass); } f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - // Terminate call with rejection - f_send_NasAuthenticationFailure(); - f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_02 @@ -162,41 +162,26 @@ module NG_NAS_TCFunctions { function f_TC_5GNAS_AMF_AUT_REQ_03() runs on aMF_NGNAS_NGAPComponent { // Local variables var NGAP_PDU v_PDU; - var integer v_start_time_ms; + var float v_start_time_ms; + var float v_max_wait_time_ms := 6.0 * (int2float(PX_TIMER_T3560) / 1000.0); // Set a maximum wait time of 7 seconds for the test body to prevent infinite waiting in case of failure // Preamble - f_send_NGSetupRequest_await_NGSetupResponse(); - f_send_NasRegistrationRequest(); + f_NGNAS_amf_init(); + f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body - tc_noac.start; - v_start_time_ms := f_getCurrentTimeUtc(); // FSCOM: TTCN-3 timer are in seconds (ETSI ES 201 873-1 V4.16.1 (2024-10) Clause 12 Declaring timers) - alt { - [] N2_gNBaMF_P.receive { - // Skip message and check that timer T3560 has not expired (in milliseconds) - if ((f_getCurrentTimeUtc() - v_start_time_ms) < PX_TIMER_T3560) { - repeat; - } else { - tc_noac.stop; - } - } - [] tc_noac.timeout { - setverdict(fail); - log("*** " & __SCOPE__ & ": FAIL: T3560 shall be expired. ***"); - } - } // End of 'alt'statement - N2_gNBaMF_P.clear; // Remove enqueued messages + // Test Body tc_noac.start; + v_start_time_ms := int2float(f_getCurrentTimeUtc()); // FSCOM: TTCN-3 timer are in seconds (ETSI ES 201 873-1 V4.16.1 (2024-10) Clause 12 Declaring timers) alt { [] N2_gNBaMF_P.receive( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - ?,//PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + ?, + vc_RAN_UE_ID, ? // AuthorizationRequest - ))) -> value v_PDU { + ))) { tc_noac.stop; f_NGAPPDU_Get(v_PDU) @@ -210,18 +195,34 @@ module NG_NAS_TCFunctions { v_message, vc_inner_message ) == true) { - log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + // Do not reply to trigger T3560 expiry at AMF and verify that no unexpected messages are received after timer expiry + if ((int2float(f_getCurrentTimeUtc()) - v_start_time_ms) < v_max_wait_time_ms) { + tc_noac.start; + repeat; + } else { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST after T3560 timer expiry ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + } } } + [] N2_gNBaMF_P.receive { + tc_noac.stop; + setverdict(inconc); + log("*** " & __SCOPE__ & ": INCONC: Unexpected message recieved. ***"); + } [] tc_noac.timeout { - f_selfOrClientSyncAndVerdict(c_tbDone, e_success); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + if ((int2float(f_getCurrentTimeUtc()) - v_start_time_ms) < v_max_wait_time_ms) { + setverdict(inconc); + log("*** " & __SCOPE__ & ": FAIL: T3560 shall be expired. ***"); + } else { + setverdict(pass); + log("*** " & __SCOPE__ & ": PASS: T3560 timer expired and no unexpected messages received. ***"); + } } } // End of 'alt'statement // Postamble - //TODO: f_postamble_NGAP_gNB(); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_03 @@ -237,7 +238,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send error message vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( m_GMM_GSM_Cause( @@ -308,7 +309,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send error message vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( m_GMM_GSM_Cause( @@ -375,7 +376,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send error message vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( m_GMM_GSM_Cause( @@ -447,7 +448,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Await SecurityModeCommand f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -498,7 +499,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Await next command (InitialContextSetupRequest) with NAS encrypted payload f_recv_NGAP_PDU( mw_ngap_initMsg( @@ -540,7 +541,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // Send SecurityModeComplete vt_NgNasUl_Msg := m_NG_SECURITY_MODE_REJECT( m_GMM_GSM_Cause( @@ -590,7 +591,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body vt_NgNasUl_Msg := m_NG_PDU_SESSION_ESTABLISHMENT_REQUEST( cs_NG_PDU_SessionId, tsc_PTI_1 @@ -660,7 +661,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, @@ -780,7 +781,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, @@ -907,7 +908,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, @@ -1034,7 +1035,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, @@ -1157,7 +1158,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( {'1'B,'001'B},//in template (value) RegistrationType p_RegistrationType, @@ -1281,7 +1282,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator @@ -1467,7 +1468,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator @@ -1603,7 +1604,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator @@ -1682,7 +1683,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & '0000'O & // Routing Indicator @@ -1767,7 +1768,7 @@ module NG_NAS_TCFunctions { //USER REGISTRATION log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( @@ -1778,6 +1779,7 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_DEREGISTRATION_REQUEST_MT( @@ -1798,6 +1800,7 @@ module NG_NAS_TCFunctions { ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, + v_message, vc_inner_message ) == false) { @@ -1830,7 +1833,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( @@ -1880,7 +1883,6 @@ module NG_NAS_TCFunctions { ); f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_DEREGISTRATION_REQUEST_MT( @@ -1933,7 +1935,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( @@ -2010,7 +2012,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // TODO f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -2032,7 +2034,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // TODO f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -2054,7 +2056,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // TODO f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -2076,7 +2078,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // TODO f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -2098,7 +2100,7 @@ module NG_NAS_TCFunctions { f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Body + // Test Body // TODO f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 0551e77..73bd940 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -90,7 +90,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_01 /** - * @desc Verify that the IUT sends an AUTHENTICATION REJECT message correctly upon receipt of an AUTHENTICATION RESPONSE message indicating a wrong ARP IEI + * @desc Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message * @see ETSI TS 124 501 [1], Clause 5.4.1.3.5 and 8.2.5 */ testcase TC_5GNAS_AMF_AUT_REQ_02() runs on aMF_NGNAS_NGAPComponent system TestAdapter { @@ -118,7 +118,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_02 /** - * @desc Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure + * @desc Verify that the IUT stops re-sending an AUTHENTICATION_REQUEST message if no AUTHENTICATION_RESPONSE message is received on the fifth expire of timer T3560 * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 b) and Table 10.3.1 */ testcase TC_5GNAS_AMF_AUT_REQ_03() runs on aMF_NGNAS_NGAPComponent system TestAdapter { diff --git a/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn b/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn index 377eff0..f5504d4 100644 --- a/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn +++ b/ttcn/Lib3GPP/NG_NAS/NG_NAS_MsgContainers.ttcn @@ -58,6 +58,10 @@ module NG_NAS_MsgContainers UE_TEST_LOOP_NR_SIDELINK_COUNTER_RESPONSE test_Loop_Sidelink_Counter_Response // @sic R5-225291 sic@ } with { // FIXME FSCOM Check messageType for deregistration_RequestMO variant "TAG( + security_Protected_Nas_Message, securityHeaderType= '0001'B; + security_Protected_Nas_Message, securityHeaderType= '0010'B; + security_Protected_Nas_Message, securityHeaderType= '0011'B; //SECURITY MODE COMAND + security_Protected_Nas_Message, securityHeaderType= '0100'B; //SECURITY MODE COMPLETE authentication_Failure, messageType = '01011001'B; authentication_Response, messageType = '01010111'B; configuration_Update_Complete, messageType = '01010101'B; @@ -86,35 +90,6 @@ module NG_NAS_MsgContainers )" } - //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0001'B}; - //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0010'B}; - //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0011'B}; - //security_Protected_Nas_Message, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0100'B}; -// authentication_Failure, messageType = '01011001'B; - // authentication_Response, messageType = '01010111'B; - // configuration_Update_Complete, messageType = '01010101'B; - // cp_Service_Request, messageType = '01001111'B; - // deregistration_Accept, messageType = '01000110'B; - // deregistration_RequestMO, messageType = '01000101'B; - // gmm_Status, messageType = '01100100'B; - // gsm_Status, messageType = '11010110'B; - // network_Slice_Specific_Authentication_Complete, messageType = '01010001'B; - // identity_Response, messageType = '01011100'B; - // notification_Response, messageType = '01100110'B; - // pdu_Session_Authentication_Complete, messageType = '11000110'B; - // pdu_Session_Establishment_Request, {protocolDiscriminator = '00101110'B, messageType = '11000001'B}; - // pdu_Session_Modification_Command_Reject, messageType = '11001101'B; - // pdu_Session_Modification_Complete, messageType = '11001100'B; - // pdu_Session_Modification_Request, messageType = '11001001'B; - // pdu_Session_Release_Complete, messageType = '11010100'B; - // pdu_Session_Release_Request, messageType = '11010001'B; - // registration_Request, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01000001'B}; - // registration_Complete, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01000011'B}; - // security_Mode_Complete, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01011110'B}; - // security_Mode_Reject, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01011111'B}; - // service_Request, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01001100'B}; - // ul_Nas_Transport, {protocolDiscriminator = '01111110'B, spareHalfOctet = '0'H, securityHeaderType = '0000'B, messageType = '01100111'B}; - // security_Protected_Nas_Message, OTHERWISE type union NG_NAS_DL_Message_Type { /* NAS message with direction 'network to UE' or 'both' */ NG_SECURITY_PROTECTED_NAS_MESSAGE security_Protected_Nas_Message, @@ -162,6 +137,10 @@ module NG_NAS_MsgContainers } with { // FIXME FSCOM Check messageType for deregistration_RequestMT variant "TAG( + security_Protected_Nas_Message, securityHeaderType= '0001'B; + security_Protected_Nas_Message, securityHeaderType= '0010'B; + security_Protected_Nas_Message, securityHeaderType= '0011'B; //SECURITY MODE COMAND + security_Protected_Nas_Message, securityHeaderType= '0100'B; //SECURITY MODE COMPLETE authentication_Reject, messageType = '01011000'B; authentication_Request, messageType = '01010110'B; authentication_Result, messageType = '01011010'B; @@ -191,10 +170,6 @@ module NG_NAS_MsgContainers security_Protected_Nas_Message, OTHERWISE )" } - //security_Protected_Nas_Message, securityHeaderType = '0001'B; - //security_Protected_Nas_Message, securityHeaderType = '0010'B; - //security_Protected_Nas_Message, securityHeaderType = '0011'B; - //security_Protected_Nas_Message, securityHeaderType = '0100'B; //**************************************************************************** // NAS SECURITY PROTECTION diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 5b9247c..f31754e 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -378,6 +378,82 @@ module LibNGAP_Functions { setverdict(pass); } + /** + * @desc Function to await NAS AuthenticationRequest message and send for AuthenticationResponse message + */ + function f_await_authentication_request_send_authentication_response_with_invalid_response() runs on NGNASComponent { + log(">>> f_await_authentication_request_send_authentication_response_with_invalid_response"); + + // Await request for DOWNLINK_NAS_TRANSPORT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + ?,//'100'B, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + } + log("v_message: ", v_message); + if (not(isbound(v_message))) { + setverdict(fail); + return; + } + + // Extract AMF_UE_NGAP_ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + + // Compute RES/XRES + if (f_5g_aka_compute_res_xres(-, v_message.authentication_Request.rand.randValue, v_message.authentication_Request.autn.aUTN, v_message.authentication_Request.abba, fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), -/*oct2hex(PX_SUPI_DIGITS)*/, px_IMSI_Def, vc_ng_nas_security_params_type) == false) { + setverdict(fail); + return; + } + + // Send invalid response for AUTHENTICATION_RESPONSE + // vc_ng_nas_security_params_type.AuthParams.XRES[0] := vc_ng_nas_security_params_type.AuthParams.XRES[0] xor4b vc_ng_nas_security_params_type.AuthParams.XRES[6]; // Invalidate the authentication response value by flipping the first bit + // vc_ng_nas_security_params_type.AuthParams.XRES[2] := vc_ng_nas_security_params_type.AuthParams.XRES[2] xor4b vc_ng_nas_security_params_type.AuthParams.XRES[6]; + // vc_ng_nas_security_params_type.AuthParams.XRES[4] := vc_ng_nas_security_params_type.AuthParams.XRES[4] xor4b vc_ng_nas_security_params_type.AuthParams.XRES[6]; + vc_ng_nas_security_params_type.AuthParams.XRES := vc_ng_nas_security_params_type.AuthParams.XRES xor4b vc_ng_nas_security_params_type.AuthParams.XRES; // Invalidate the authentication response value by flipping all bits with the value of the 7th byte of XRES + log("Invalidated XRES values: ", bit2oct(vc_ng_nas_security_params_type.AuthParams.XRES)); + vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( + { iei := '2d'O, iel := '10'O, res := vc_ng_nas_security_params_type.AuthParams.XRES } + ); + vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + vc_sendNAS_PDU, + m_uPTransportLayerInformation_userLocationInformationNR( + m_userLocationInformationNR( + m_nR_CGI, + m_tAI + ))))); + + setverdict(pass); + } + /** * @desc Function to await NAS AuthenticationRequest message and await for AuthenticationResponse message */ @@ -397,7 +473,7 @@ module LibNGAP_Functions { if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - -, //'00?'B, + -, -, mw_GMM_AuthRAND, mw_GSM_AUTN @@ -2232,7 +2308,7 @@ module LibNGAP_Functions { ) runs on NGNASComponent { log(">>> f_send_error_indication_ids"); - // Await ErrorIndication + // Send ErrorIndication f_send_NGAP_PDU( m_ngap_initMsg( m_n2_ErrorIndication_ids( diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn index 83f47fd..eeffd4b 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Steps.ttcn @@ -273,11 +273,13 @@ module LibNGAP_Steps { function f_postambleNGAP_AMF( in template (value) Cause p_Cause ) runs on aMFNGAPComponent { - if (PICS_OFFLINE_MODE) { - f_await_ue_context_release_request_await_ue_context_release_response(p_Cause); - } else { - f_send_ue_context_release_request_await_ue_context_release_response(p_Cause); - } + if (isbound(vc_initialContextSetupRequest)) { + if (PICS_OFFLINE_MODE) { + f_await_ue_context_release_request_await_ue_context_release_response(p_Cause); + } else { + f_send_ue_context_release_request_await_ue_context_release_response(p_Cause); + } + } } // End of function f_postambleNGAP_AMF } // End of group postamble_NGAP -- GitLab From c88b87a1f5899c76f27a44f816b3ebc57e1530d1 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Wed, 10 Jun 2026 10:28:10 +0000 Subject: [PATCH 129/151] TP_5GNAS_AMF_AUT_REQ_04 initial condition update due to validation finding --- test_purposes/TP_AMF_NGNAS.tdltx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/test_purposes/TP_AMF_NGNAS.tdltx b/test_purposes/TP_AMF_NGNAS.tdltx index bbf50c4..16a9782 100644 --- a/test_purposes/TP_AMF_NGNAS.tdltx +++ b/test_purposes/TP_AMF_NGNAS.tdltx @@ -1,5 +1,5 @@ /* -Copyright (c) ETSI 2025. +Copyright (c) ETSI 2026. This software is subject to copyrights owned by ETSI. Non-exclusive permission is hereby granted, free of charge, to copy, reproduce and amend this file @@ -164,13 +164,7 @@ Package TP_AMF_NGNAS { Initial conditions with { the UE entity isNotRegisteredToAMF and - the IUT entity sends an DOWNLINK_NAS_TRANSPORT containing { - NAS_PDU containing { - security_header_type set to INTEGRITY_PROTECTED, - message_type set to AUTHENTICATION_REQUEST, - authentication_parameter_AUTN containing { - AUTN set to PX_WRONG_MAC_CODE}}} - to the GNB entity + event AUTHENTICATION_REQUEST occurs } Expected behaviour -- GitLab From b8b17777e00730567e77a6d0505e7cd01dad9d5b Mon Sep 17 00:00:00 2001 From: juvancic Date: Wed, 10 Jun 2026 13:57:57 +0200 Subject: [PATCH 130/151] postamblecorretion for IMP_01_* --- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index fe59b99..8968141 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -5318,7 +5318,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_NGAP_amf_UE_ErrorIndication(); + //f_NGAP_amf_UE_ErrorIndication(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5380,7 +5380,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_NGAP_amf_UE_Authentication_Failure(); + //f_NGAP_amf_UE_Authentication_Failure(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); @@ -5442,7 +5442,7 @@ module NGAP_TCFunctions { log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_NGAP_amf_UE_Authentication_Failure(); + //f_NGAP_amf_UE_Authentication_Failure(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); -- GitLab From 2c7c09998bcffe398a0468fc68184f0e765fe01d Mon Sep 17 00:00:00 2001 From: garciay Date: Wed, 10 Jun 2026 14:49:47 +0200 Subject: [PATCH 131/151] Review TC_5GNAS_AMF_AUT_REQ_04/05 --- captures/TC_5GNAS_AMF_AUT_REQ_03.pcap | Bin 0 -> 6770 bytes captures/TC_5GNAS_AMF_AUT_REQ_04.pcap | Bin 0 -> 2442 bytes etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ | 12 +- ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 143 ++++++++++++++---- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 12 +- ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn | 2 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 72 ++++++++- .../LibNGAP/lib_system/LibNGAP_Interface.ttcn | 2 + .../lib_system/Lib_NG_NAS_Functions.ttcn | 62 ++++---- 10 files changed, 230 insertions(+), 77 deletions(-) create mode 100644 captures/TC_5GNAS_AMF_AUT_REQ_03.pcap create mode 100644 captures/TC_5GNAS_AMF_AUT_REQ_04.pcap diff --git a/captures/TC_5GNAS_AMF_AUT_REQ_03.pcap b/captures/TC_5GNAS_AMF_AUT_REQ_03.pcap new file mode 100644 index 0000000000000000000000000000000000000000..08a8a4dbd0afa370de13417509da48073e7bd9b6 GIT binary patch literal 6770 zcmca|c+)~A1{MYcU}0cnU|?W2(#-nA$j1=GzyQVwc?Jd!23IBq7X}6g28R|K^?C*d zmU;#T&Y4d9GB8z)3=AsnoJM&Jj0+eTjZIZaFOts%N_lG7%Xssm|e=e0HH4OzfcEMq}mm z+a=@}xEMCOKAy+Kux=K}KA1c*%`*)YvkVLkObja5>f#&pFRE`c|I70H`;4QxOGEAL z88bfyh6dcR4-qT*hpZ1Do03q(W-cssfI?V)8!LkuBLf&Cs|AO!1_L7~{aJg0d~@1$q9B_W>40nn*^caXW(EcUu+5C~uYq)dOq+I` zm7$D*0gORnFbp;=W0n}mw1uCsna04(;0Dg65G^(eqM#rJm6Uv}4fzGBd8X;bx{0}I z1`G)d91I|jFflkVggG$&X9!^60P(>d1N&*kaeRJaUy!q(N9fkLkk)hDrv0hnYXwg-im348W3%3{eh@5)1_npz;Oe zs_VB{8746>fH6oP41-FHViBd zcAyl*1$HIOt=d|33}FmR3=E1#r}~&bHQP3KwMmqZLfhmD1%Z_0@Jn9*8W=A5ENDI8 z>}3Q=Swa6fz^Mw9x5)Ry!hap z^aBe``(Sb)oB6Bp+04KWve|~8ke^AlS({9dBh|1gB)Gq+^haIRD{I#~dIR*;s*G19BCXbi5Uoj)jagvrNUg@WrV# z$h3GnkVywtFp47kkC=4KPy&fl^mGieISQ}M44fdFZFsTygP3%T%Vtp{&8+3|%=r8) z1F~7{EXdEG6obppAURMjVD0D+{uD z;SZ3XLAK-aGe{1@zYGiv2U;M0E<5*EbIUHRi7+)FoAvPLU2c%gHrybSLAE2OSLApG z$-_)Vrg7OUZlsx|%)kcDx1justOuHR zN+6pT-UitUG9B5^(7d~yfsuik0o3B5Li-Wqq6@Zo^R58MMK(qt*MMAw92U^LyB(Hy z<&8A6Y;WUh(acf?nHCQ!3CPR4D*BP&ED)0$?R0?DR zhYlyGYYN5~Ho$uONF!<;JHVzwN7R&!G_zJn7&$VHOYc=MVt$VE2#AlHCgg(a`;0EZd_1B058X4dMHjQG->8pyPGV~|OpRE_LE zIO^J$Bv6zz7F~?b0nCloK z7(jl!V9bW6B%7rLvS|@B4x3cwJ$Bv2zz7<|XRu+=WDo$2i5D?|#?u%X_#GG>KsMYn zX2aJy29F`xXoLI#vIRL5p*8F-2FCdpL7@OLP1ui(!Hj_cj6q^B3=SC$2Ji?C_WGI) zR6O%Aus9iMW~uja;PEwdwgEmPaxVq7{61zeM+saK$^HLdW5s8IUVejYaP8v&m)&?r zYmv(DdnsU3q2+gyk!Du3KMM(NJh2JYjrl>BUclUFVZW*!-Hjj{D*ahVa^s0jU{j%P F1OOv-Tsr^& literal 0 HcmV?d00001 diff --git a/captures/TC_5GNAS_AMF_AUT_REQ_04.pcap b/captures/TC_5GNAS_AMF_AUT_REQ_04.pcap new file mode 100644 index 0000000000000000000000000000000000000000..2e669a1f91b7fc822c2ea3f00cbd142dd38e624b GIT binary patch literal 2442 zcmca|c+)~A1{MYcU}0cnU|`tfqnXu`!^#lEzyQVwc?Jd!23IBq7X}6g28R|K^?C*d zmU;#T&WEA=GB8z)3=Ar2{}t;Q7#A=w$o>DnkFNg-)paQkQ9b`Jl7JiwBp$u_K8ufuU7w? z_C;#_<&c`$SL>_eKtYPE6(^gLP{d{^EOmfFc;kOo1~WzmFh*7j4q*)jMo{{*_5}GB z6w08u1&1mF0|OVsXlQ~$3>1oo{u7bM{6HZH3Q6R2$_>q9(yVOY{Dqzn)3=E76X$-s|DMpY81E_Qn zbzpR0U;w#YgO!cJj)4J;L26(aY_kE!6p+ov>p-@GY)5uGGXsMF*k;E0*Fd^Jrd336zH`~-Fd$Dup}cxlmnv#LxBURd;z)Y zlL{NdBnAdB2I+%gu&Y`)rh!~#90Bql$YogKO$uB#g0wL+1RcD+F$Y{JF)-LLusGO( zQVZ*R5DGm>3ut_#K#-8yFzr;BL&uV8*}z#vsSTFgP4E7}!8I+qi&i1=)@q z4s4*T%EQ2N(MK~&e>$X<0BSA3OaRefQ=oMrqNOlp32IB>?TxdpVE4=Y|1WavrvQ3w z3$np&I;52VYAt|FhGDP`SXv5GmVix#wiG`2XlBi|;0L#4h;!royQpqdIs2Fm=Eiu2 f?U&Hq2(n?D1wW`*0ArZ@Kr}8l&c6#b73xL+7Ob+2 literal 0 HcmV?d00001 diff --git a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ index 3682eb5..4f45419 100644 --- a/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ +++ b/etc/Ats_NG_NAS/AtsNGAP_AMF.cfg_ @@ -112,17 +112,17 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify that the IUT sends an AUTHENTICATION REQUEST message correctly upon receipt of a NAS Registration without an active security context #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_01 # Verify that the IUT sends an AUTHENTICATION_REJECT message upon receipt of an AUTHENTICATION_RESPONSE containing an invalid authentication response value, when the UE was identified with SUCI in the initial NAS message -NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 +#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_02 # Verify that the IUT stops re-sending an AUTHENTICATION_REQUEST message if no AUTHENTICATION_RESPONSE message is received on the fifth expire of timer T3560 #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_03 -# Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure +# Verify that the IUT sends an IDENTITY_REQUEST message correctly upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #20 - MAC failure #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_04 -# Verify that the IUT sends a new AUTHENTICATION REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use -#NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 -# Verify that the IUT sends a new IDENTITY REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable +# Verify that the IUT sends a new AUTHENTICATION_REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use +NG_NAS_TestCases.TC_5GNAS_AMF_AUT_REQ_05 +# Verify that the IUT sends an IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable #NG_NAS_TestCases.TC_5GNAS_AMF_AUT_ABN_01 # Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE -#NG_NAS_TestCases.TC_NGNAS_AMF_AUT_SEQ_01 +#NG_NAS_TestCases.TC_5GNAS_AMF_SEC_COM_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration #NG_NAS_TestCases.TC_5GNAS_AMF_SEC_ACC_01 # Verify that the IUT, upon receiving the NAS SECURITY MODE REJECT Message after a failed NAS Authentication and security procedure, successfully aborts the registration process by rejecting the registration diff --git a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn index 3e173ae..8266a12 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_Steps.ttcn @@ -124,7 +124,7 @@ module NG_NAS_Steps { function f_NG_NAS_amf_UE_Authentication_with_invalid_response() runs on aMF_NGNAS_NGAPComponent { log(">>> f_NG_NAS_amf_UE_Authentication_with_invalid_response"); if (PICS_OFFLINE_MODE) { - f_await_authentication_request_await_authentication_response(); + f_await_authentication_request_await_authentication_reject(); } else { f_await_authentication_request_send_authentication_response_with_invalid_response(); } diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index 7c536c3..dca739f 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -163,7 +163,7 @@ module NG_NAS_TCFunctions { // Local variables var NGAP_PDU v_PDU; var float v_start_time_ms; - var float v_max_wait_time_ms := 6.0 * (int2float(PX_TIMER_T3560) / 1000.0); // Set a maximum wait time of 7 seconds for the test body to prevent infinite waiting in case of failure + var float v_max_wait_time_ms := 6.0 * 1000.0 * int2float(PX_TIMER_T3560); // Set a maximum wait time of 6 seconds for the test body to prevent infinite waiting in case of failure // Preamble f_NGNAS_amf_init(); @@ -173,7 +173,7 @@ module NG_NAS_TCFunctions { // Test Body tc_noac.start; - v_start_time_ms := int2float(f_getCurrentTimeUtc()); // FSCOM: TTCN-3 timer are in seconds (ETSI ES 201 873-1 V4.16.1 (2024-10) Clause 12 Declaring timers) + v_start_time_ms := int2float(f_getCurrentTimeUtc()); alt { [] N2_gNBaMF_P.receive( mw_ngap_initMsg( @@ -181,7 +181,7 @@ module NG_NAS_TCFunctions { ?, vc_RAN_UE_ID, ? // AuthorizationRequest - ))) { + ))) -> value v_PDU { tc_noac.stop; f_NGAPPDU_Get(v_PDU) @@ -205,6 +205,36 @@ module NG_NAS_TCFunctions { } } } + [] N2_gNBaMF_P.receive( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))) -> value v_PDU { + tc_noac.stop; + + f_NGAPPDU_Get(v_PDU) + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REJECT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == true) { + // Do not reply to trigger T3560 expiry at AMF and verify that no unexpected messages are received after timer expiry + if ((int2float(f_getCurrentTimeUtc()) - v_start_time_ms) < v_max_wait_time_ms) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REJECT before T3560 timer expiration ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, e_error); + } else { + setverdict(pass); + log("*** " & __SCOPE__ & ": PASS: T3560 timer expired and no unexpected messages received. ***"); + } + } + } [] N2_gNBaMF_P.receive { tc_noac.stop; setverdict(inconc); @@ -215,8 +245,6 @@ module NG_NAS_TCFunctions { setverdict(inconc); log("*** " & __SCOPE__ & ": FAIL: T3560 shall be expired. ***"); } else { - setverdict(pass); - log("*** " & __SCOPE__ & ": PASS: T3560 timer expired and no unexpected messages received. ***"); } } } // End of 'alt'statement @@ -234,11 +262,42 @@ module NG_NAS_TCFunctions { // Local variables // Preamble + f_NGNAS_amf_init(); f_NG_NAS_amf_UE_Register(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Test Body + // Await AuthenticationRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + ?, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + setverdict(fail); + return; + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REQUEST ***"); + setverdict(pass); + } // Send error message vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( m_GMM_GSM_Cause( @@ -249,24 +308,23 @@ module NG_NAS_TCFunctions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + -, + -, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( m_nR_CGI, m_tAI ))))); - // Await response + // Await new AuthenticationRequest due to authentication failure f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - ?,//PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + ?, + vc_RAN_UE_ID, ? // IdentityRequest ))); f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( @@ -288,8 +346,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_send_NasAuthenticationFailure(); - f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); + f_send_error_indication(m_cause_nas(authentication_failure)); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_04 @@ -299,17 +357,45 @@ module NG_NAS_TCFunctions { */ function f_TC_5GNAS_AMF_AUT_REQ_05() runs on aMF_NGNAS_NGAPComponent { // Local variables - var NG_NAS_DL_Message_Type v_NG_NAS_DL_Message_Type; - var NAS_KsiValue ngKSI; // Preamble + f_NGNAS_amf_init(); f_NG_NAS_amf_UE_Register(); - f_decode_5G_NAS_DL_Message(vc_recvNAS_PDU, v_NG_NAS_DL_Message_Type); - ngKSI := v_NG_NAS_DL_Message_Type.authentication_Request.ngNasKeySetId.nasKeySetId; + action("Send invalid response to trigger NAS authentication failure and verify that AMF initiates a new authentication procedure with new KSI value"); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); // Test Body + // Await AuthenticationRequest + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + ?, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST ***"); + setverdict(fail); + return; + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_AUTHENTICATION_REQUEST ***"); + setverdict(pass); + } // Send error message vt_NgNasUl_Msg := m_NG_AUTHENTICATION_FAILURE( m_GMM_GSM_Cause( @@ -320,28 +406,27 @@ module NG_NAS_TCFunctions { f_send_NGAP_PDU( m_ngap_initMsg( m_n2_UplinkNASTransport( - PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + -, + -, vc_sendNAS_PDU, m_uPTransportLayerInformation_userLocationInformationNR( m_userLocationInformationNR( m_nR_CGI, m_tAI ))))); - // Await response + // Await new AuthenticationRequest due to authentication failure f_recv_NGAP_PDU( mw_ngap_initMsg( mw_n2_DownlinkNASTransport( - ?,//PX_AMF_UE_NGAP_ID, - PX_RAN_UE_NGAP_ID, + ?, + vc_RAN_UE_ID, ? ))); f_NASPDU_Get(vc_recvNGAP_PDU); - var NG_NAS_DL_Message_Type v_message; if (f_Check_5GAKA_NAS_DL_Message( vc_recvNAS_PDU, mw_NG_AUTHENTICATION_REQUEST( - complement(ngKSI) + complement(vc_ngKSI) ), vc_ng_nas_security_params_type, vc_previous_nas_count_dl, @@ -359,8 +444,8 @@ module NG_NAS_TCFunctions { // Postamble // Terminate call with rejection - f_send_NasAuthenticationFailure(); - f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); + f_send_error_indication(m_cause_nas(authentication_failure)); + f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_5GNAS_AMF_AUT_REQ_05 @@ -437,9 +522,9 @@ module NG_NAS_TCFunctions { group /*5_4_2_*/Security_mode_control_procedure { /** - * @desc Testcase function for TC_NGNAS_AMF_AUT_SEQ_01 + * @desc Testcase function for TC_5GNAS_AMF_SEC_COM_01 */ - function f_TC_NGNAS_AMF_AUT_SEQ_01() runs on aMF_NGNAS_NGAPComponent { + function f_TC_5GNAS_AMF_SEC_COM_01() runs on aMF_NGNAS_NGAPComponent { // Local variables // Preamble @@ -482,7 +567,7 @@ module NG_NAS_TCFunctions { f_send_ue_context_release_request_await_ue_context_release_response(m_cause_nas(authentication_failure)); f_selfOrClientSyncAndVerdict(c_poDone, e_success); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGNAS_AMF_AUT_SEQ_01 + } // End of function f_TC_5GNAS_AMF_SEC_COM_01 /** * @desc Testcase function for TC_5GNAS_AMF_SEC_ACC_01 diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index 73bd940..a14dd95 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -146,7 +146,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_03 /** - * @desc Verify that the IUT sends an IDENTITY REQUEST message correctly upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #20 - MAC failure + * @desc Verify that the IUT sends an IDENTITY_REQUEST message correctly upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #20 - MAC failure * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 c) and 8.2.4 */ testcase TC_5GNAS_AMF_AUT_REQ_04() runs on aMF_NGNAS_NGAPComponent system TestAdapter { @@ -174,7 +174,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_04 /** - * @desc Verify that the IUT sends a new AUTHENTICATION REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use + * @desc Verify that the IUT sends a new AUTHENTICATION_REQUEST message with new ngKSI value to re-initiate the 5G AKA based primary authentication upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #71 - ngKSI already in use * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 e) and 8.2.4 */ testcase TC_5GNAS_AMF_AUT_REQ_05() runs on aMF_NGNAS_NGAPComponent system TestAdapter { @@ -202,7 +202,7 @@ module NG_NAS_TestCases { } // End of testcase TC_5GNAS_AMF_AUT_REQ_05 /** - * @desc Verify that the IUT sends a new IDENTITY REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable + * @desc Verify that the IUT sends an IDENTITY_REQUEST message to obtain the SUCI from the UE upon receipt of an AUTHENTICATION_FAILURE message indicating a 5GMM cause value #26 - non-5G authentication unacceptable * @see ETSI TS 124 501 [1], Clauses 5.4.1.3.7 and 8.2.4 */ testcase TC_5GNAS_AMF_AUT_ABN_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { @@ -237,7 +237,7 @@ module NG_NAS_TestCases { * @desc Verify that the IUT sends a SECURITY MODE COMMAND message correctly to indicate NAS security mode procedure upon receipt of a NAS AUTHENTICATION RESPONSE * @see ETSI TS 124 501 [1], Clause 5.4.1.2 */ - testcase TC_NGNAS_AMF_AUT_SEQ_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { + testcase TC_5GNAS_AMF_SEC_COM_01() runs on aMF_NGNAS_NGAPComponent system TestAdapter { // Local variables var aMF_NGNAS_NGAPComponent v_ngnas_ngap_gnb; @@ -252,14 +252,14 @@ module NG_NAS_TestCases { f_cf_NGNAS_aMF_Up(v_ngnas_ngap_gnb); // Start - v_ngnas_ngap_gnb.start(f_TC_NGNAS_AMF_AUT_SEQ_01()); + v_ngnas_ngap_gnb.start(f_TC_5GNAS_AMF_SEC_COM_01()); // synchronize PTC on 1 sychronization points f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); //f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGNAS_AMF_AUT_SEQ_01 + } // End of testcase TC_5GNAS_AMF_SEC_COM_01 /** * @desc Verify that the IUT, upon receiving the NAS SECURITY MODE COMPLETE message after completing the NAS Authentication and Security procedure, successfully completes the registration process by accepting the registration diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn index a67cdc4..e9b7c88 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn @@ -27,7 +27,7 @@ module NG_NAS_TestControl { execute(TC_5GNAS_AMF_AUT_ABN_01()); - execute(TC_NGNAS_AMF_AUT_SEQ_01()); + execute(TC_5GNAS_AMF_SEC_COM_01()); execute(TC_5GNAS_AMF_SEC_ACC_01()); execute(TC_5GNAS_AMF_SEC_REJ_01()); diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index f31754e..0efb4bf 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -344,6 +344,8 @@ module LibNGAP_Functions { setverdict(fail); return; } + vc_ngKSI := v_message.authentication_Request.ngNasKeySetId.nasKeySetId; + log("vc_ngKSI: ", vc_ngKSI); // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; @@ -415,6 +417,8 @@ module LibNGAP_Functions { setverdict(fail); return; } + vc_ngKSI := v_message.authentication_Request.ngNasKeySetId.nasKeySetId; + log("vc_ngKSI: ", vc_ngKSI); // Extract AMF_UE_NGAP_ID vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; @@ -430,9 +434,6 @@ module LibNGAP_Functions { } // Send invalid response for AUTHENTICATION_RESPONSE - // vc_ng_nas_security_params_type.AuthParams.XRES[0] := vc_ng_nas_security_params_type.AuthParams.XRES[0] xor4b vc_ng_nas_security_params_type.AuthParams.XRES[6]; // Invalidate the authentication response value by flipping the first bit - // vc_ng_nas_security_params_type.AuthParams.XRES[2] := vc_ng_nas_security_params_type.AuthParams.XRES[2] xor4b vc_ng_nas_security_params_type.AuthParams.XRES[6]; - // vc_ng_nas_security_params_type.AuthParams.XRES[4] := vc_ng_nas_security_params_type.AuthParams.XRES[4] xor4b vc_ng_nas_security_params_type.AuthParams.XRES[6]; vc_ng_nas_security_params_type.AuthParams.XRES := vc_ng_nas_security_params_type.AuthParams.XRES xor4b vc_ng_nas_security_params_type.AuthParams.XRES; // Invalidate the authentication response value by flipping all bits with the value of the 7th byte of XRES log("Invalidated XRES values: ", bit2oct(vc_ng_nas_security_params_type.AuthParams.XRES)); vt_NgNasUl_Msg := m_NG_AUTHENTICATION_RESPONSE( @@ -454,6 +455,71 @@ module LibNGAP_Functions { setverdict(pass); } + function f_await_authentication_request_await_authentication_reject() runs on NGNASComponent { + log(">>> f_await_authentication_request_await_authentication_reject"); + + // Await request for DOWNLINK_NAS_TRANSPORT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_DownlinkNASTransport( + ?, + vc_RAN_UE_ID, + ? // AuthorizationRequest + ))); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REQUEST( + ?,//'100'B, + -, + mw_GMM_AuthRAND, + mw_GSM_AUTN + ), + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REQUEST"); + } + log("v_message: ", v_message); + if (not(isbound(v_message))) { + setverdict(fail); + return; + } + vc_ngKSI := v_message.authentication_Request.ngNasKeySetId.nasKeySetId; + log("vc_ngKSI: ", vc_ngKSI); + + // Extract AMF_UE_NGAP_ID + vc_AMF_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[0].value_.aMF_UE_NGAP_ID; + log("vc_AMF_UE_ID: ", vc_AMF_UE_ID); + // Extract RAN_UE_NGAP_ID + vc_RAN_UE_ID := vc_recvNGAP_PDU.initiatingMessage.value_.downlinkNASTransport.protocolIEs[1].value_.rAN_UE_NGAP_ID; + log("vc_RAN_UE_ID: ", vc_RAN_UE_ID); + + // Await response for AUTHENTICATION_REJECT + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UplinkNASTransport( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + if (f_Check_5GAKA_NAS_UL_Message( + vc_recvNAS_PDU, + mw_NG_AUTHENTICATION_REJECT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_ul, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REJECT"); + setverdict(fail, "*** " & __SCOPE__ & ": FAIL: Unexpected NG_AUTHENTICATION_REJECT"); + } + + setverdict(pass); + } + /** * @desc Function to await NAS AuthenticationRequest message and await for AuthenticationResponse message */ diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn index bddb57d..525d84a 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Interface.ttcn @@ -18,6 +18,7 @@ module LibNGAP_Interface { //Lib3GPP import from CommonDefs all; import from NG_NAS_TypeDefs all; + import from NAS_CommonTypeDefs all; import from NG_NAS_MsgContainers all; import from NG_NAS_SecurityFunctions all; @@ -71,6 +72,7 @@ module LibNGAP_Interface { var NasCount_Type vc_previous_nas_count_ul; var NasCount_Type vc_previous_nas_count_dl; var NG_REGISTRATION_REQUEST vc_registration_request; + var NAS_KsiValue vc_ngKSI; var InitialContextSetupRequest vc_initialContextSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupRequest vc_pDUSessionResourceSetupRequest; // TODO Could be useless at the end of the day var PDUSessionResourceSetupResponse vc_pDUSessionResourceSetupResponse; // TODO Could be useless at the end of the day diff --git a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn index f7839fd..d7461c4 100644 --- a/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn +++ b/ttcn/Lib_NG_NAS/lib_system/Lib_NG_NAS_Functions.ttcn @@ -30,37 +30,37 @@ module Lib_NG_NAS_Functions { import from LibNGAP_Steps all; import from LibNGAP_Functions all; - /** - * @desc Function to send NAS RegistrationRequest message - * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg - */ - function f_send_NasRegistrationRequest() runs on NGNASComponent { - var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & - '0000'O & // Routing Indicator - '00'O & // Protection scheme - '00'O & // Home network public key identifier - PX_MSIN; - vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( - cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), - tsc_NasKsi_NoKey, - '0'B, // TSC - m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID), - -, -, - m_ng_ue_security_capability - ); - vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_initialUeMessage( - vc_RAN_UE_ID, - vc_sendNAS_PDU, - m_uPTransportLayerInformation_userLocationInformationNR( - m_userLocationInformationNR( - m_nR_CGI, - m_tAI - ))))); - } + // /** + // * @desc Function to send NAS RegistrationRequest message + // * @see NG_NASTemplateFunctions.f_Check_NG_RegistrationReqMsg + // */ + // function f_send_NasRegistrationRequest() runs on NGNASComponent { + // var octetstring v_other_digits := // ETSI TS 124 501 Figure 9.11.3.4.3: 5GS mobile identity information element for type of identity "SUCI" and SUPI format "IMSI" + // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) & + // '0000'O & // Routing Indicator + // '00'O & // Protection scheme + // '00'O & // Home network public key identifier + // PX_MSIN; + // vt_NgNasUl_Msg := m_NG_REGISTRATION_REQUEST( + // cs_RegistrationType(tsc_NG_RegistrationInitial, '1'B), + // tsc_NasKsi_NoKey, + // '0'B, // TSC + // m_NG_MobileIdentitySUCI(PX_SUPI_FORMAT, v_other_digits, PX_TYPE_OF_ID), + // -, -, + // m_ng_ue_security_capability + // ); + // vc_sendNAS_PDU := bit2oct(encvalue(valueof(vt_NgNasUl_Msg))); + // f_send_NGAP_PDU( + // m_ngap_initMsg( + // m_n2_initialUeMessage( + // vc_RAN_UE_ID, + // vc_sendNAS_PDU, + // m_uPTransportLayerInformation_userLocationInformationNR( + // m_userLocationInformationNR( + // m_nR_CGI, + // m_tAI + // ))))); + // } // /** // * @desc Function to await NAS RegistrationRequest message -- GitLab From b87e6fb9ab74a20130d8f82ea0fb6e55b12478a1 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 11 Jun 2026 08:20:49 +0200 Subject: [PATCH 132/151] Adding functions to replace template (see https://forge.etsi.org/rep/int/5g-core/ngap/-/merge_requests/15) --- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 994 +++++++++++++++++- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 322 ++++-- 2 files changed, 1204 insertions(+), 112 deletions(-) diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 027726d..65b7f52 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -355,10 +355,10 @@ module LibNGAP_Templates { } // End of group Send group Receive { + /** * @see ETSI TS 138 413 V16.12.0 (2023-05) 9.2.1.3 PDU SESSION RESOURCE RELEASE COMMAND */ - template (present) InitiatingMessage mw_n2_PDUSessionResourceReleaseCommand_base_nas := { procedureCode := id_PDUSessionResourceRelease, @@ -2144,7 +2144,7 @@ module LibNGAP_Templates { } } } - } // End of template mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes + } // End of template mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes } // End of group Receive @@ -6357,7 +6357,7 @@ module LibNGAP_Templates { } } // End of template mw_n2_NGSetupFailure - } // End of group Receive + } // End of group Receive } // End of group NG_SETUP_FAILURE @@ -24750,6 +24750,994 @@ module LibNGAP_Templates { } // End of group g_NGAP group Functions_For_Templates{ + + function f_m_n2_InitialContextSetupRequest( + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + in template (omit) AMFName p_amfName := omit, + in template (omit) UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate := omit, + in template (omit) CoreNetworkAssistanceInformationForInactive p_coreNetworkAssistanceInformationForInactive := omit, + in template (value) GUAMI p_gUAMI, + in template (omit) PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq := omit, + in template (value) NGAP_IEs.AllowedNSSAI p_allowedNSSAI, + in template (value) UESecurityCapabilities p_uESecurityCapabilities, + in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, + in template (omit) TraceActivation p_traceActivation := omit, + in template (omit) MobilityRestrictionList p_mobilityRestrictionList := omit, + in template (omit) UERadioCapability p_uERadioCapability := omit, + in template (omit) IndexToRFSP p_indexToRFSP := PX_Index_to_RAT_Frequency_Selection_Priority, + in template (omit) MaskedIMEISV p_maskedIMEISV := PX_MaskedIMEISV, + in template (omit) NAS_PDU p_nAS_PDU := omit, + in template (omit) EmergencyFallbackIndicator p_emergencyFallbackIndicator := omit, + in template (omit) RRCInactiveTransitionReportRequest p_rRCInactiveTransitionReportRequest := omit, + in template (omit) RedirectionVoiceFallback p_redirectionVoiceFallback := omit, + in template (omit) LocationReportingRequestType p_locationReportingRequestType := omit, + in template (omit) SRVCCOperationPossible p_sRVCCOperationPossible := omit, + in template (omit) IAB_Authorized p_iAB_Authorized := omit, + in template (omit) Enhanced_CoverageRestriction p_enhanced_CoverageRestriction := omit, + in template (omit) Extended_ConnectedTime p_extended_ConnectedTime := PX_EXTENDED_CONNECTED_TIME, + in template (omit) UE_DifferentiationInfo p_uE_DifferentiationInfo := omit, + in template (omit) NRUESidelinkAggregateMaximumBitrate p_nRUESidelinkAggregateMaximumBitrate := omit, + in template (omit) LTEUESidelinkAggregateMaximumBitrate p_lTEUESidelinkAggregateMaximumBitrate := omit, + in template (omit) UERadioCapabilityID p_uERadioCapabilityID := omit + ) return template (value) InitiatingMessage { + var template (value) InitiatingMessage pdu := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + InitialContextSetupRequest := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + }; + var integer idx := lengthof(pdu.value_.InitialContextSetupRequest.protocolIEs); + + /* Old AMF */ + if (isvalue(p_amfName)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_AMFName, + criticality := reject, + value_ := { AMFName := p_amfName } + }; + idx := idx + 1; + } + + /* UE Aggregate Maximum Bit Rate */ + if (isvalue(p_uEAggregateMaximumBitRate)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UEAggregateMaximumBitRate, + criticality := reject, + value_ := { UEAggregateMaximumBitRate := p_uEAggregateMaximumBitRate } + }; + idx := idx + 1; + } + + /* Core Network Assistance Information for RRC INACTIVE */ + if (isvalue(p_coreNetworkAssistanceInformationForInactive)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_CoreNetworkAssistanceInformationForInactive, + criticality := ignore, + value_ := { CoreNetworkAssistanceInformationForInactive := p_coreNetworkAssistanceInformationForInactive } + }; + idx := idx + 1; + } + + /* GUAMI */ + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_GUAMI, + criticality := reject, + value_ := { GUAMI := p_gUAMI } + }; + idx := idx + 1; + + /* PDU Session Resource Setup Request List */ + if (isvalue(p_pDUSessionResourceSetupListCxtReq)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_PDUSessionResourceSetupListCxtReq, + criticality := reject, + value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } + }; + idx := idx + 1; + } + + /* Allowed NSSAI */ + if (isvalue(p_allowedNSSAI)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_AllowedNSSAI, + criticality := reject, + value_ := { AllowedNSSAI := p_allowedNSSAI } + }; + idx := idx + 1; + } + + /* UE Security Capabilities */ + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UESecurityCapabilities, + criticality := reject, + value_ := { UESecurityCapabilities := p_uESecurityCapabilities } + }; + idx := idx + 1; + + /* Security Key */ + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_SecurityKey, + criticality := reject, + value_ := { SecurityKey := p_nextHopNH } + }; + idx := idx + 1; + + /* Trace Activation */ + if (isvalue(p_traceActivation)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_TraceActivation, + criticality := ignore, + value_ := { TraceActivation := p_traceActivation } + }; + idx := idx + 1; + } + + /* Mobility Restriction List */ + if (isvalue(p_mobilityRestrictionList)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_MobilityRestrictionList, + criticality := ignore, + value_ := { MobilityRestrictionList := p_mobilityRestrictionList } + }; + idx := idx + 1; + } + + /* UE Radio Capability */ + if (isvalue(p_uERadioCapability)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UERadioCapability, + criticality := ignore, + value_ := { UERadioCapability := p_uERadioCapability } + }; + idx := idx + 1; + } + + /* Index to RAT/Frequency Selection Priority */ + if (isvalue(p_indexToRFSP)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_IndexToRFSP, + criticality := ignore, + value_ := { IndexToRFSP := p_indexToRFSP } + }; + idx := idx + 1; + } + + /* Masked IMEISV */ + if (isvalue(p_maskedIMEISV)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_MaskedIMEISV, + criticality := ignore, + value_ := { MaskedIMEISV := p_maskedIMEISV } + }; + idx := idx + 1; + } + + /* NAS-PDU */ + if (isvalue(p_nAS_PDU)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { nAS_PDU := p_nAS_PDU } + }; + idx := idx + 1; + } + + /* Emergency Fallback Indicator*/ + if (isvalue(p_emergencyFallbackIndicator)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_EmergencyFallbackIndicator, + criticality := reject, + value_ := { EmergencyFallbackIndicator := p_emergencyFallbackIndicator} + }; + idx := idx + 1; + } + + /* RRC Inactive Transition Report Request */ + if (isvalue(p_rRCInactiveTransitionReportRequest)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_RRCInactiveTransitionReportRequest, + criticality := ignore, + value_ := { RRCInactiveTransitionReportRequest := p_rRCInactiveTransitionReportRequest} + }; + idx := idx + 1; + } + + /* TODO: UE Radio Capability for Paging */ + + /* Redirection for Voice EPS Fallback */ + if (isvalue(p_redirectionVoiceFallback)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_RedirectionVoiceFallback, + criticality := ignore, + value_ := { RedirectionVoiceFallback := p_redirectionVoiceFallback } + }; + idx := idx + 1; + } + + /* Location Reporting Request Type */ + if (isvalue(p_locationReportingRequestType)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_LocationReportingRequestType, + criticality := ignore, + value_ := { LocationReportingRequestType := p_locationReportingRequestType } + }; + idx := idx + 1; + } + + /* SRVCC Operation Possible */ + if (isvalue(p_sRVCCOperationPossible)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_SRVCCOperationPossible, + criticality := ignore, + value_ := { SRVCCOperationPossible := p_sRVCCOperationPossible } + }; + idx := idx + 1; + } + + /* IAB Authorized */ + if (isvalue(p_iAB_Authorized)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_IAB_Authorized, + criticality := ignore, + value_ := { IAB_Authorized := p_iAB_Authorized } + }; + idx := idx + 1; + } + + + /* Enhanced Coverage Restriction */ + if (isvalue(p_enhanced_CoverageRestriction)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_Enhanced_CoverageRestriction, + criticality := ignore, + value_ := { Enhanced_CoverageRestriction := p_enhanced_CoverageRestriction } + }; + idx := idx + 1; + } + + /* Extended Connected Time */ + if (isvalue(p_extended_ConnectedTime)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_Extended_ConnectedTime, + criticality := ignore, + value_ := { Extended_ConnectedTime := p_extended_ConnectedTime } + }; + idx := idx + 1; + } + + /* UE Differentiation Information */ + if (isvalue(p_uE_DifferentiationInfo)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UE_DifferentiationInfo, + criticality := ignore, + value_ := { UE_DifferentiationInfo := p_uE_DifferentiationInfo } + }; + idx := idx + 1; + } + + /* TODO: NR V2X Services Authorized */ + /* TODO: LTE V2X Services Authorized */ + + /* NR UE Sidelink Aggregate Maximum Bit Rate */ + if (isvalue(p_nRUESidelinkAggregateMaximumBitrate)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_NRUESidelinkAggregateMaximumBitrate, + criticality := ignore, + value_ := { NRUESidelinkAggregateMaximumBitrate := p_nRUESidelinkAggregateMaximumBitrate } + }; + idx := idx + 1; + } + + /* LTE UE Sidelink Aggregate Maximum Bit Rate */ + if (isvalue(p_lTEUESidelinkAggregateMaximumBitrate)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_LTEUESidelinkAggregateMaximumBitrate, + criticality := ignore, + value_ := { LTEUESidelinkAggregateMaximumBitrate := p_lTEUESidelinkAggregateMaximumBitrate } + }; + idx := idx + 1; + } + + /* ... TODO: lots other optional IEs ... */ + + /* UE Radio Capability ID */ + if (isvalue(p_uERadioCapabilityID)) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UERadioCapabilityID, + criticality := reject, + value_ := { UERadioCapabilityID := p_uERadioCapabilityID } + }; + idx := idx + 1; + } + + /* ... TODO: lots other optional IEs ... */ + + return pdu; + } // End of function f_m_n2_InitialContextSetupRequest + + function f_mw_n2_InitialContextSetupRequest( + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template AMFName p_amfName := omit, + template UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate := omit, + template CoreNetworkAssistanceInformationForInactive p_coreNetworkAssistanceInformationForInactive := omit, + template (present) GUAMI p_gUAMI := ?, + template PDUSessionResourceSetupListCxtReq p_pDUSessionResourceSetupListCxtReq := omit, + template (present) NGAP_IEs.AllowedNSSAI p_allowedNSSAI := ?, + template (present) UESecurityCapabilities p_uESecurityCapabilities := ?, + template (present) SecurityKey p_nextHopNH := ?, + template TraceActivation p_traceActivation := omit, + template MobilityRestrictionList p_mobilityRestrictionList := omit, + template UERadioCapability p_uERadioCapability := omit, + template IndexToRFSP p_indexToRFSP := omit, + template MaskedIMEISV p_maskedIMEISV := omit, + template NAS_PDU p_nAS_PDU := omit, + template EmergencyFallbackIndicator p_emergencyFallbackIndicator := omit, + template RRCInactiveTransitionReportRequest p_rRCInactiveTransitionReportRequest := omit, + template RedirectionVoiceFallback p_redirectionVoiceFallback := omit, + template LocationReportingRequestType p_locationReportingRequestType := omit, + template SRVCCOperationPossible p_sRVCCOperationPossible := omit, + template IAB_Authorized p_iAB_Authorized := omit, + template Enhanced_CoverageRestriction p_enhanced_CoverageRestriction := omit, + template Extended_ConnectedTime p_extended_ConnectedTime := omit, + template UE_DifferentiationInfo p_uE_DifferentiationInfo := omit, + template NRUESidelinkAggregateMaximumBitrate p_nRUESidelinkAggregateMaximumBitrate := omit, + template LTEUESidelinkAggregateMaximumBitrate p_lTEUESidelinkAggregateMaximumBitrate := omit, + template UERadioCapabilityID p_uERadioCapabilityID := omit + ) return template (present) InitiatingMessage { + var template (present) InitiatingMessage pdu := { + procedureCode := id_InitialContextSetup, + criticality := reject, + value_ := { + InitialContextSetupRequest := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + }; + var integer idx := lengthof(pdu.value_.InitialContextSetupRequest.protocolIEs); + + /* Old AMF */ + if (not istemplatekind(p_amfName, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_AMFName, + criticality := reject, + value_ := { AMFName := p_amfName } + }; + idx := idx + 1; + } + + /* UE Aggregate Maximum Bit Rate */ + if (not istemplatekind(p_uEAggregateMaximumBitRate, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UEAggregateMaximumBitRate, + criticality := reject, + value_ := { UEAggregateMaximumBitRate := p_uEAggregateMaximumBitRate } + }; + idx := idx + 1; + } + + /* Core Network Assistance Information for RRC INACTIVE */ + if (not istemplatekind(p_coreNetworkAssistanceInformationForInactive, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_CoreNetworkAssistanceInformationForInactive, + criticality := ignore, + value_ := { CoreNetworkAssistanceInformationForInactive := p_coreNetworkAssistanceInformationForInactive } + }; + idx := idx + 1; + } + + /* GUAMI */ + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_GUAMI, + criticality := reject, + value_ := { GUAMI := p_gUAMI } + }; + idx := idx + 1; + + /* PDU Session Resource Setup Request List */ + if (not istemplatekind(p_pDUSessionResourceSetupListCxtReq, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_PDUSessionResourceSetupListCxtReq, + criticality := reject, + value_ := { PDUSessionResourceSetupListCxtReq := p_pDUSessionResourceSetupListCxtReq } + }; + idx := idx + 1; + } + + /* Allowed NSSAI */ + if (not istemplatekind(p_allowedNSSAI, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_AllowedNSSAI, + criticality := reject, + value_ := { AllowedNSSAI := p_allowedNSSAI } + }; + idx := idx + 1; + } + + /* UE Security Capabilities */ + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UESecurityCapabilities, + criticality := reject, + value_ := { UESecurityCapabilities := p_uESecurityCapabilities } + }; + idx := idx + 1; + + /* Security Key */ + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_SecurityKey, + criticality := reject, + value_ := { SecurityKey := p_nextHopNH } + }; + idx := idx + 1; + + /* Trace Activation */ + if (not istemplatekind(p_traceActivation, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_TraceActivation, + criticality := ignore, + value_ := { TraceActivation := p_traceActivation } + }; + idx := idx + 1; + } + + /* Mobility Restriction List */ + if (not istemplatekind(p_mobilityRestrictionList, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_MobilityRestrictionList, + criticality := ignore, + value_ := { MobilityRestrictionList := p_mobilityRestrictionList } + }; + idx := idx + 1; + } + + /* UE Radio Capability */ + if (not istemplatekind(p_uERadioCapability, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UERadioCapability, + criticality := ignore, + value_ := { UERadioCapability := p_uERadioCapability } + }; + idx := idx + 1; + } + + /* Index to RAT/Frequency Selection Priority */ + if (not istemplatekind(p_indexToRFSP, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_IndexToRFSP, + criticality := ignore, + value_ := { IndexToRFSP := p_indexToRFSP } + }; + idx := idx + 1; + } + + /* Masked IMEISV */ + if (not istemplatekind(p_maskedIMEISV, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_MaskedIMEISV, + criticality := ignore, + value_ := { MaskedIMEISV := p_maskedIMEISV } + }; + idx := idx + 1; + } + + /* NAS-PDU */ + if (not istemplatekind(p_nAS_PDU, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { nAS_PDU := p_nAS_PDU } + }; + idx := idx + 1; + } + + /* Emergency Fallback Indicator*/ + if (not istemplatekind(p_emergencyFallbackIndicator, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_EmergencyFallbackIndicator, + criticality := reject, + value_ := { EmergencyFallbackIndicator := p_emergencyFallbackIndicator} + }; + idx := idx + 1; + } + + /* RRC Inactive Transition Report Request */ + if (not istemplatekind(p_rRCInactiveTransitionReportRequest, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_RRCInactiveTransitionReportRequest, + criticality := ignore, + value_ := { RRCInactiveTransitionReportRequest := p_rRCInactiveTransitionReportRequest} + }; + idx := idx + 1; + } + + /* TODO: UE Radio Capability for Paging */ + + /* Redirection for Voice EPS Fallback */ + if (not istemplatekind(p_redirectionVoiceFallback, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_RedirectionVoiceFallback, + criticality := ignore, + value_ := { RedirectionVoiceFallback := p_redirectionVoiceFallback } + }; + idx := idx + 1; + } + + /* Location Reporting Request Type */ + if (not istemplatekind(p_locationReportingRequestType, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_LocationReportingRequestType, + criticality := ignore, + value_ := { LocationReportingRequestType := p_locationReportingRequestType } + }; + idx := idx + 1; + } + + /* SRVCC Operation Possible */ + if (not istemplatekind(p_sRVCCOperationPossible, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_SRVCCOperationPossible, + criticality := ignore, + value_ := { SRVCCOperationPossible := p_sRVCCOperationPossible } + }; + idx := idx + 1; + } + + /* IAB Authorized */ + if (not istemplatekind(p_iAB_Authorized, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_IAB_Authorized, + criticality := ignore, + value_ := { IAB_Authorized := p_iAB_Authorized } + }; + idx := idx + 1; + } + + + /* Enhanced Coverage Restriction */ + if (not istemplatekind(p_enhanced_CoverageRestriction, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_Enhanced_CoverageRestriction, + criticality := ignore, + value_ := { Enhanced_CoverageRestriction := p_enhanced_CoverageRestriction } + }; + idx := idx + 1; + } + + /* Extended Connected Time */ + if (not istemplatekind(p_extended_ConnectedTime, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_Extended_ConnectedTime, + criticality := ignore, + value_ := { Extended_ConnectedTime := p_extended_ConnectedTime } + }; + idx := idx + 1; + } + + /* UE Differentiation Information */ + if (not istemplatekind(p_uE_DifferentiationInfo, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UE_DifferentiationInfo, + criticality := ignore, + value_ := { UE_DifferentiationInfo := p_uE_DifferentiationInfo } + }; + idx := idx + 1; + } + + /* TODO: NR V2X Services Authorized */ + /* TODO: LTE V2X Services Authorized */ + + /* NR UE Sidelink Aggregate Maximum Bit Rate */ + if (not istemplatekind(p_nRUESidelinkAggregateMaximumBitrate, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_NRUESidelinkAggregateMaximumBitrate, + criticality := ignore, + value_ := { NRUESidelinkAggregateMaximumBitrate := p_nRUESidelinkAggregateMaximumBitrate } + }; + idx := idx + 1; + } + + /* LTE UE Sidelink Aggregate Maximum Bit Rate */ + if (not istemplatekind(p_lTEUESidelinkAggregateMaximumBitrate, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_LTEUESidelinkAggregateMaximumBitrate, + criticality := ignore, + value_ := { LTEUESidelinkAggregateMaximumBitrate := p_lTEUESidelinkAggregateMaximumBitrate } + }; + idx := idx + 1; + } + + /* ... TODO: lots other optional IEs ... */ + + /* UE Radio Capability ID */ + if (not istemplatekind(p_uERadioCapabilityID, "omit")) { + pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := + { + id := id_UERadioCapabilityID, + criticality := reject, + value_ := { UERadioCapabilityID := p_uERadioCapabilityID } + }; + idx := idx + 1; + } + + /* ... TODO: lots other optional IEs ... */ + + return pdu; + } // End of function f_mw_n2_InitialContextSetupRequest + + function f_mw_n2_PDUSessionResourceSetupRequest( + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, + template RANPagingPriority p_rANPagingPriority := omit, + template NAS_PDU p_nAS_PDU := omit, + template (present) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq := ?, + template UEAggregateMaximumBitRate p_uEAggregateMaximumBitRate := omit, + template UESliceMaximumBitRateList p_uESliceMaximumBitRateList := omit + ) return template (present) InitiatingMessage { + + var template (present) InitiatingMessage pdu := { + procedureCode := id_PDUSessionResourceSetup, + criticality := reject, + value_ := { + PDUSessionResourceSetupRequest := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + }; + var integer idx := lengthof(pdu.value_.PDUSessionResourceSetupRequest.protocolIEs); + + /* RAN Paging Priority */ + if (not istemplatekind(p_rANPagingPriority, "omit")) { + pdu.value_.PDUSessionResourceSetupRequest.protocolIEs[idx] := { + id := id_RANPagingPriority, + criticality := ignore, + value_ := { RANPagingPriority := p_rANPagingPriority } + }; + idx := idx + 1; + } + + /* NAS-PDU */ + if (not istemplatekind(p_nAS_PDU, "omit")) { + pdu.value_.PDUSessionResourceSetupRequest.protocolIEs[idx] := { + id := id_NAS_PDU, + criticality := reject, + value_ := { NAS_PDU := p_nAS_PDU } + }; + idx := idx + 1; + } + + /* PDU Session Resource Setup Request List */ + pdu.value_.PDUSessionResourceSetupRequest.protocolIEs[idx] := { + id := id_PDUSessionResourceSetupListSUReq, + criticality := reject, + value_ := { PDUSessionResourceSetupListSUReq := p_pDUSessionResourceSetupListSUReq } + }; + idx := idx + 1; + + /* UE Aggregate Maximum Bit Rate */ + if (not istemplatekind(p_uEAggregateMaximumBitRate, "omit")) { + pdu.value_.PDUSessionResourceSetupRequest.protocolIEs[idx] := { + id := id_UEAggregateMaximumBitRate, + criticality := ignore, + value_ := { UEAggregateMaximumBitRate := p_uEAggregateMaximumBitRate } + }; + idx := idx + 1; + } + + /* UE Slice Maximum Bit Rate List */ + if (not istemplatekind(p_uESliceMaximumBitRateList, "omit")) { + pdu.value_.PDUSessionResourceSetupRequest.protocolIEs[idx] := { + id := id_UESliceMaximumBitRateList, + criticality := ignore, + value_ := { UESliceMaximumBitRateList := p_uESliceMaximumBitRateList } + }; + idx := idx + 1; + } + return pdu; + } // End of function f_mw_n2_PDUSessionResourceSetupRequest + + function f_m_n2_PDUSessionResourceReleaseCommand( + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + in template (omit) NAS_PDU p_nAS_PDU, + in template (value) PDUSessionResourceToReleaseListRelCmd p_pDUSessionResourceToReleaseListRelCmd + ) return template (value) InitiatingMessage { + var template (value) InitiatingMessage pdu := { + procedureCode := id_PDUSessionResourceRelease, + criticality := reject, + value_ := { + PDUSessionResourceReleaseCommand := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + }; + var integer idx := lengthof(pdu.value_.PDUSessionResourceReleaseCommand.protocolIEs); + + if (isvalue(p_nAS_PDU)) { + pdu.value_.PDUSessionResourceReleaseCommand.protocolIEs[idx] := + { + id := id_NAS_PDU, + criticality := ignore, + value_ := { nAS_PDU := p_nAS_PDU } + }; + idx := idx + 1; + } + + pdu.value_.PDUSessionResourceReleaseCommand.protocolIEs[idx] := + { id := id_PDUSessionResourceToReleaseListRelCmd, + criticality := reject, + value_ := { PDUSessionResourceToReleaseListRelCmd := p_pDUSessionResourceToReleaseListRelCmd } + }; + return pdu; + } // End of function f_n2_PDUSessionResourceReleaseCommand + + function f_m_n2_UEContextReleaseComplete( + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + in template (omit) UserLocationInformation p_userLocationInformation := omit, + in template (omit) InfoOnRecommendedCellsAndRANNodesForPaging p_infoOnRecommendedCellsAndRANNodesForPaging := omit, + in template (omit) PDUSessionResourceListCxtRelCpl p_pDUSessionResourceListCxtRelCpl := omit, + in template (omit) CriticalityDiagnostics p_criticalityDiagnostics := omit, + in template (omit) PagingAssisDataforCEcapabUE p_pagingAssisDataforCEcapabUE := omit + ) return template (value) SuccessfulOutcome { + + var template (value) SuccessfulOutcome pdu := m_n2_UEContextReleaseComplete(p_amfUeNgapID, p_ranUeNgapID); + var integer idx := lengthof(pdu.value_.UEContextReleaseComplete.protocolIEs); + + if (isvalue(p_userLocationInformation)) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_UserLocationInformation, + criticality := ignore, + value_ := { UserLocationInformation := p_userLocationInformation } + }; + idx := idx + 1; + } + + if (isvalue(p_infoOnRecommendedCellsAndRANNodesForPaging)) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_InfoOnRecommendedCellsAndRANNodesForPaging, + criticality := reject, + value_ := { InfoOnRecommendedCellsAndRANNodesForPaging := p_infoOnRecommendedCellsAndRANNodesForPaging } + }; + idx := idx + 1; + } + + if (isvalue(p_pDUSessionResourceListCxtRelCpl)) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_PDUSessionResourceListCxtRelCpl, + criticality := reject, + value_ := { PDUSessionResourceListCxtRelCpl := p_pDUSessionResourceListCxtRelCpl } + }; + idx := idx + 1; + } + + if (isvalue(p_criticalityDiagnostics)) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_CriticalityDiagnostics, + criticality := ignore, + value_ := { CriticalityDiagnostics := p_criticalityDiagnostics } + }; + idx := idx + 1; + } + + if (isvalue(p_pagingAssisDataforCEcapabUE)) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_PagingAssisDataforCEcapabUE, + criticality := ignore, + value_ := { PagingAssisDataforCEcapabUE := p_pagingAssisDataforCEcapabUE } + } + idx := idx + 1; + } + return pdu; + } // End of function f_m_n2_UEContextReleaseComplete + + function f_mw_n2_UEContextReleaseComplete( + template (present) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + template (present) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID, + template UserLocationInformation p_userLocationInformation := omit, + template InfoOnRecommendedCellsAndRANNodesForPaging p_infoOnRecommendedCellsAndRANNodesForPaging := omit, + template PDUSessionResourceListCxtRelCpl p_pDUSessionResourceListCxtRelCpl := omit, + template CriticalityDiagnostics p_criticalityDiagnostics := omit, + template PagingAssisDataforCEcapabUE p_pagingAssisDataforCEcapabUE := omit + ) return template (present) SuccessfulOutcome { + + var template (present) SuccessfulOutcome pdu := m_n2_UEContextReleaseComplete(p_amfUeNgapID, p_ranUeNgapID); + var integer idx := lengthof(pdu.value_.UEContextReleaseComplete.protocolIEs); + + if (not istemplatekind(p_userLocationInformation, "omit")) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_UserLocationInformation, + criticality := ignore, + value_ := { UserLocationInformation := p_userLocationInformation } + }; + idx := idx + 1; + } + + if (not istemplatekind(p_infoOnRecommendedCellsAndRANNodesForPaging, "omit")) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_InfoOnRecommendedCellsAndRANNodesForPaging, + criticality := reject, + value_ := { InfoOnRecommendedCellsAndRANNodesForPaging := p_infoOnRecommendedCellsAndRANNodesForPaging } + }; + idx := idx + 1; + } + + if (not istemplatekind(p_pDUSessionResourceListCxtRelCpl, "omit")) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_PDUSessionResourceListCxtRelCpl, + criticality := reject, + value_ := { PDUSessionResourceListCxtRelCpl := p_pDUSessionResourceListCxtRelCpl } + }; + idx := idx + 1; + } + + if (not istemplatekind(p_criticalityDiagnostics, "omit")) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_CriticalityDiagnostics, + criticality := ignore, + value_ := { CriticalityDiagnostics := p_criticalityDiagnostics } + }; + idx := idx + 1; + } + + if (not istemplatekind(p_pagingAssisDataforCEcapabUE, "omit")) { + pdu.value_.UEContextReleaseComplete.protocolIEs[idx] := { + id := id_PagingAssisDataforCEcapabUE, + criticality := ignore, + value_ := { PagingAssisDataforCEcapabUE := p_pagingAssisDataforCEcapabUE } + } + idx := idx + 1; + } + return pdu; + } // End of function f_mw_n2_UEContextReleaseComplete + + function f_mw_n2_NGSetupFailure( + template (present) Cause p_cause := ?, + template TimeToWait p_timeToWait := omit, + template CriticalityDiagnostics p_criticalityDiagnostics := omit + ) return template (present) UnsuccessfulOutcome { + + var template (present) UnsuccessfulOutcome pdu := mw_n2_NGSetupFailure(p_cause); + var integer idx := lengthof(pdu.value_.NGSetupFailure.protocolIEs); + + /* Time to Wait */ + if (not istemplatekind(p_timeToWait, "omit")) { + pdu.value_.NGSetupFailure.protocolIEs[idx] := { + id := id_TimeToWait, + criticality := ignore, + value_ := { TimeToWait := p_timeToWait } + }; + idx := idx + 1; + } + + /* Criticality Diagnostics */ + if (not istemplatekind(p_criticalityDiagnostics, "omit")) { + pdu.value_.NGSetupFailure.protocolIEs[idx] := { + id := id_CriticalityDiagnostics, + criticality := ignore, + value_ := { CriticalityDiagnostics := p_criticalityDiagnostics } + }; + idx := idx + 1; + } + return pdu; + } // End of function f_mw_n2_NGSetupFailure + + // function f_mw_CoreNetworkAssistanceInformationForInactive_ExtIEs( + // template NGAP_IEs.CN_MT_CommunicationHandling p_cN_MT_CommunicationHandling := omit + // ) return template (present) CoreNetworkAssistanceInformationForInactive.iE_Extensions { + // var template (present) CoreNetworkAssistanceInformationForInactive.iE_Extensions ies ; + // var integer idx := 0; + + // if (not istemplatekind(p_cN_MT_CommunicationHandling, "omit")) { + // ies[idx] := { + // id := id_CN_MT_CommunicationHandling, + // criticality := ignore, + // extensionValue := { CN_MT_CommunicationHandling := p_cN_MT_CommunicationHandling } + // }; + // idx := idx + 1; + // } + + // return ies; + // } // End of function f_mw_CoreNetworkAssistanceInformationForInactive_ExtIEs + } // End of group functionsForTemplates } // End of module LibNGAP_Templates diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 0efb4bf..3470569 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1015,34 +1015,47 @@ module LibNGAP_Functions { // Await InitialContextSetupRequest f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - mw_gUAMI - ( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER, - * - )/*, - { - mw_pDUSessionResourceSetupItemCxtReq - ( - PX_PDU_SESSION_ID, - mw_s_NSSAI - ( - PX_SST - ), - ?, - *, - * - ) - }, - ?, - ?, - ? */ - ))); + f_mw_n2_InitialContextSetupRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + -, -, -, + mw_gUAMI + ( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER + )))); + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // mw_gUAMI + // ( + // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + // PX_AMF_REGION_ID, + // PX_AMF_SET_ID, + // PX_AMF_POINTER, + // * + // )/*, + // { + // mw_pDUSessionResourceSetupItemCxtReq + // ( + // PX_PDU_SESSION_ID, + // mw_s_NSSAI + // ( + // PX_SST + // ), + // ?, + // *, + // * + // ) + // }, + // ?, + // ?, + // ? */ + // ))); vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; @@ -1084,34 +1097,47 @@ module LibNGAP_Functions { // Await InitialContextSetupRequest f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - mw_gUAMI - ( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER, - * - )/*, - { - mw_pDUSessionResourceSetupItemCxtReq - ( - PX_PDU_SESSION_ID, - mw_s_NSSAI - ( - PX_SST - ), - ?, - *, - * - ) - }, - ?, - ?, - ? */ - ))); + f_mw_n2_InitialContextSetupRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + -, -, -, + mw_gUAMI + ( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER + )))); + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // mw_gUAMI + // ( + // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + // PX_AMF_REGION_ID, + // PX_AMF_SET_ID, + // PX_AMF_POINTER, + // * + // )/*, + // { + // mw_pDUSessionResourceSetupItemCxtReq + // ( + // PX_PDU_SESSION_ID, + // mw_s_NSSAI + // ( + // PX_SST + // ), + // ?, + // *, + // * + // ) + // }, + // ?, + // ?, + // ? */ + // ))); vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; @@ -1213,26 +1239,47 @@ module LibNGAP_Functions { log("v_k_gnb: ", v_k_gnb); // 4. Send InitialContextSetupRequest var InitiatingMessage v_initialContextSetupRequest := valueof( - m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - m_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER - ), - { - m_allowedNSSAI_Item( - m_s_NSSAI('00'O, '000000'O) - ) - }, - m_uESecurityCapabilities, - v_k_gnb, - -, - vc_sendNAS_PDU + f_m_n2_InitialContextSetupRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + -, -, -, + m_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER + ), + -, + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + v_k_gnb, + -, -, -, -, -, + vc_sendNAS_PDU )); - + // var InitiatingMessage v_initialContextSetupRequest := valueof( + // m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // m_gUAMI( + // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + // PX_AMF_REGION_ID, + // PX_AMF_SET_ID, + // PX_AMF_POINTER + // ), + // { + // m_allowedNSSAI_Item( + // m_s_NSSAI('00'O, '000000'O) + // ) + // }, + // m_uESecurityCapabilities, + // v_k_gnb, + // -, + // vc_sendNAS_PDU + // )); vc_initialContextSetupRequest := v_initialContextSetupRequest.value_.InitialContextSetupRequest; log("vc_initialContextSetupRequest: ", vc_initialContextSetupRequest); @@ -1622,23 +1669,44 @@ module LibNGAP_Functions { // Await PDUSessionEstablishmentRequest f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_PDUSessionResourceSetupRequest( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - { - mw_pDUSessionResourceSetupItemSUReq( - PX_PDU_SESSION_ID, - mw_s_NSSAI( - PX_SST/*, - PX_SD, - -*/ - ), - ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - ) - }//in template (value) PDUSessionResourceSetupListSUReq p_pDUSessionResourceSetupListSUReq + f_mw_n2_PDUSessionResourceSetupRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + -, + -, + { + mw_pDUSessionResourceSetupItemSUReq( + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST/*, + PX_SD, + -*/ + ), + ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + ) + } ))); + // f_recv_NGAP_PDU( + // mw_ngap_initMsg( + // mw_n2_PDUSessionResourceSetupRequest( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // { + // mw_pDUSessionResourceSetupItemSUReq( + // PX_PDU_SESSION_ID, + // mw_s_NSSAI( + // PX_SST/*, + // PX_SD, + // -*/ + // ), + // ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING + // -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, + // -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit + // ) + // } + // ))); var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, ""); @@ -2058,10 +2126,16 @@ module LibNGAP_Functions { // Await UEContextReleaseComplete f_recv_NGAP_PDU( mw_ngap_succMsg( - mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_mw_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); + // f_recv_NGAP_PDU( + // mw_ngap_succMsg( + // mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); } function f_await_ue_context_release_command_send_ue_context_release_complete() runs on NGNASComponent { @@ -2076,10 +2150,16 @@ module LibNGAP_Functions { // Send UEContextReleaseComplete f_send_NGAP_PDU( m_ngap_succMsg( - m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_m_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); + // f_send_NGAP_PDU( + // m_ngap_succMsg( + // m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); } function f_await_ue_context_release_request() runs on NGNASComponent { @@ -2114,10 +2194,16 @@ module LibNGAP_Functions { // Await UEContextReleaseComplete f_recv_NGAP_PDU( mw_ngap_succMsg( - mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_mw_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); + // f_recv_NGAP_PDU( + // mw_ngap_succMsg( + // mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); } function f_send_ue_context_release_complete() runs on NGNASComponent { @@ -2126,10 +2212,16 @@ module LibNGAP_Functions { // Send UEContextReleaseComplete f_send_NGAP_PDU( m_ngap_succMsg( - m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_m_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); + // f_send_NGAP_PDU( + // m_ngap_succMsg( + // m_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); } function f_send_ue_context_release_request_await_ue_context_release_response( @@ -2155,10 +2247,16 @@ module LibNGAP_Functions { // Send UEContextReleaseComplete f_send_NGAP_PDU( m_ngap_succMsg( - m_n2_UEContextReleaseComplete( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_m_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); + // f_send_NGAP_PDU( + // m_ngap_succMsg( + // m_n2_UEContextReleaseComplete( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); } function f_await_ue_context_release_request_await_ue_context_release_response( @@ -2184,10 +2282,16 @@ module LibNGAP_Functions { // await UEContextReleaseComplete f_recv_NGAP_PDU( mw_ngap_succMsg( - mw_n2_UEContextReleaseComplete( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_mw_n2_UEContextReleaseComplete( + vc_AMF_UE_ID, + vc_RAN_UE_ID ))); + // f_recv_NGAP_PDU( + // mw_ngap_succMsg( + // mw_n2_UEContextReleaseComplete( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID + // ))); } /** -- GitLab From 7b45d8bfcda01f23550329a27bfa54f00fd73d26 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 11 Jun 2026 09:12:19 +0200 Subject: [PATCH 133/151] Validate template functions calls --- etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 4 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 100 +----------------- 3 files changed, 6 insertions(+), 102 deletions(-) diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index e1973f6..46dc63f 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -112,7 +112,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. -NGAP_TestCases.TC_NGAP_AMF_PDU_02 +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_03 # Verify that the AMF node successfully processes a PDU_SESSION_RESOURCE_MODIFY_INDICATION contains mandatory IEs and answers with PDU_SESSION_RESOURCE_MODIFY_CONFIRM for successfully modified PDU session. @@ -123,7 +123,7 @@ NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed #NGAP_TestCases.TC_NGAP_AMF_CMP_01 # Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID -#NGAP_TestCases.TC_NGAP_AMF_CMP_02 +NGAP_TestCases.TC_NGAP_AMF_CMP_02 # Verify that the IUT sends a UE CONTEXT RELEASE COMMAND after UE_CONTEXT_RELEASE_REQUEST to release the UE-associated logic NG-connection due to NG-RAN node generated reasons #NGAP_TestCases.TC_NGAP_AMF_CMP_03 # Verify that the IUT can send a UE CONTEXT MODIFICATION REQUEST containing mandatory IEs diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 65b7f52..7ffa810 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -25111,8 +25111,8 @@ module LibNGAP_Templates { template MobilityRestrictionList p_mobilityRestrictionList := omit, template UERadioCapability p_uERadioCapability := omit, template IndexToRFSP p_indexToRFSP := omit, - template MaskedIMEISV p_maskedIMEISV := omit, - template NAS_PDU p_nAS_PDU := omit, + template MaskedIMEISV p_maskedIMEISV := ?, + template NAS_PDU p_nAS_PDU := ?, template EmergencyFallbackIndicator p_emergencyFallbackIndicator := omit, template RRCInactiveTransitionReportRequest p_rRCInactiveTransitionReportRequest := omit, template RedirectionVoiceFallback p_redirectionVoiceFallback := omit, diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 3470569..adc1a0a 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1026,36 +1026,6 @@ module LibNGAP_Functions { PX_AMF_SET_ID, PX_AMF_POINTER )))); - // f_recv_NGAP_PDU( - // mw_ngap_initMsg( - // mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID, - // mw_gUAMI - // ( - // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - // PX_AMF_REGION_ID, - // PX_AMF_SET_ID, - // PX_AMF_POINTER, - // * - // )/*, - // { - // mw_pDUSessionResourceSetupItemCxtReq - // ( - // PX_PDU_SESSION_ID, - // mw_s_NSSAI - // ( - // PX_SST - // ), - // ?, - // *, - // * - // ) - // }, - // ?, - // ?, - // ? */ - // ))); vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; @@ -1108,36 +1078,6 @@ module LibNGAP_Functions { PX_AMF_SET_ID, PX_AMF_POINTER )))); - // f_recv_NGAP_PDU( - // mw_ngap_initMsg( - // mw_n2_InitialContextSetupRequest/*_withPDUSessionList*/( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID, - // mw_gUAMI - // ( - // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - // PX_AMF_REGION_ID, - // PX_AMF_SET_ID, - // PX_AMF_POINTER, - // * - // )/*, - // { - // mw_pDUSessionResourceSetupItemCxtReq - // ( - // PX_PDU_SESSION_ID, - // mw_s_NSSAI - // ( - // PX_SST - // ), - // ?, - // *, - // * - // ) - // }, - // ?, - // ?, - // ? */ - // ))); vc_initialContextSetupRequest := vc_recvNGAP_PDU.initiatingMessage.value_.InitialContextSetupRequest; f_NASPDU_Get(vc_recvNGAP_PDU); var NG_NAS_DL_Message_Type v_message; @@ -1686,27 +1626,9 @@ module LibNGAP_Functions { -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit ) - } + }, + ? ))); - // f_recv_NGAP_PDU( - // mw_ngap_initMsg( - // mw_n2_PDUSessionResourceSetupRequest( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID, - // { - // mw_pDUSessionResourceSetupItemSUReq( - // PX_PDU_SESSION_ID, - // mw_s_NSSAI( - // PX_SST/*, - // PX_SD, - // -*/ - // ), - // ?,//decmatch(mw_pDUSessionResourceSetupRequestTransfer(?)),//OCTETSTRING - // -,//in template (omit) NAS_PDU p_pDUSessionNAS_PDU := omit, - // -//in template (omit) PDUSessionResourceSetupItemSUReq.iE_Extensions p_iE_Extensions := omit - // ) - // } - // ))); var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, ""); @@ -2130,12 +2052,6 @@ module LibNGAP_Functions { vc_AMF_UE_ID, vc_RAN_UE_ID ))); - // f_recv_NGAP_PDU( - // mw_ngap_succMsg( - // mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID - // ))); } function f_await_ue_context_release_command_send_ue_context_release_complete() runs on NGNASComponent { @@ -2198,12 +2114,6 @@ module LibNGAP_Functions { vc_AMF_UE_ID, vc_RAN_UE_ID ))); - // f_recv_NGAP_PDU( - // mw_ngap_succMsg( - // mw_n2_UEContextReleaseComplete_noPDUSessionResourceSetupListSURes( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID - // ))); } function f_send_ue_context_release_complete() runs on NGNASComponent { @@ -2286,12 +2196,6 @@ module LibNGAP_Functions { vc_AMF_UE_ID, vc_RAN_UE_ID ))); - // f_recv_NGAP_PDU( - // mw_ngap_succMsg( - // mw_n2_UEContextReleaseComplete( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID - // ))); } /** -- GitLab From a7c51445d10207d70b9b3cdadecff420196b8dec Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 11 Jun 2026 10:59:51 +0200 Subject: [PATCH 134/151] updated preamble --- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 8968141..d41d317 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -5736,6 +5736,8 @@ module NGAP_TCFunctions { // Preamble f_NGAP_amf_init(); + f_NGAP_amf_GNB_Setup(); + //f_NGAP_amf_UE_Register(); //f_NGAP_amf_UE_PDU_ResourceSetup(); @@ -5796,6 +5798,8 @@ module NGAP_TCFunctions { // Preamble f_NGAP_amf_init(); + f_NGAP_amf_GNB_Setup(); + //f_NGAP_amf_UE_Register(); //f_NGAP_amf_UE_PDU_ResourceSetup(); @@ -5930,6 +5934,8 @@ module NGAP_TCFunctions { // Preamble f_NGAP_amf_init(); + f_NGAP_amf_GNB_Setup(); + //f_NGAP_amf_UE_Register(); //f_NGAP_amf_UE_PDU_ResourceSetup(); -- GitLab From 5071f9c159a173e35fbece5a1b7b545204f4c545 Mon Sep 17 00:00:00 2001 From: juvancic Date: Thu, 11 Jun 2026 11:00:07 +0200 Subject: [PATCH 135/151] updated preamble --- ttcn/AtsNGAP/NGAP_Steps.ttcn | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 79696cf..3e18cd0 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -191,6 +191,19 @@ module NGAP_Steps { // TODO FSCOM f_xxx_UE_SecurityMode to be mmoved into NAG_NG }//end group DefaultTestStep group BehaviorFunctions{ + + /** + * @desc + */ + function f_NGAP_amf_GNB_Setup() runs on aMFNGAPComponent { + log(">>> f_NGAP_amf_GNB_Setup"); + if (PICS_OFFLINE_MODE) { + f_await_NGSetupRequest_await_NGSetupResponse(); + } else { + f_send_NGSetupRequest_await_NGSetupResponse(); + } + log("<<< f_NGAP_amf_GNB_Setup"); + } // End of function f_NGAP_amf_UE_Register /** * @desc -- GitLab From b15919154bab31e61e1caa9c798508050d1d0dfe Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 11 Jun 2026 16:04:19 +0200 Subject: [PATCH 136/151] Review GNB tests; Add TC_NGAP_AMF_IMP_08_02 --- NAS_ETSI.code-workspace | 3 + captures/TC_NGAP_AMF_IMP_02.pcap | Bin 0 -> 1502 bytes captures/TC_NGAP_AMF_PDU_03.pcap | Bin 0 -> 6244 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 12 +- etc/AtsNGAP/AtsNGAP_GNB.cfg_ | 18 +- etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ | 125 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 646 +++-- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 2281 +++++++++-------- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 80 +- .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 17 +- 10 files changed, 1777 insertions(+), 1405 deletions(-) create mode 100644 captures/TC_NGAP_AMF_IMP_02.pcap create mode 100644 captures/TC_NGAP_AMF_PDU_03.pcap diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index a72cd0f..fd88794 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -11,6 +11,9 @@ }, { "path": "../UERANSIM" + }, + { + "path": "../osmo-ttcn3-hacks" } ], "settings": { diff --git a/captures/TC_NGAP_AMF_IMP_02.pcap b/captures/TC_NGAP_AMF_IMP_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..0bbc1fc7a427a79fdb7b2e081b90e1e62dd6da69 GIT binary patch literal 1502 zcmca|c+)~A1{MYcU}0cnU|^6~p_TP@GXp~q0|X=F85lSiT$vbL7#JKF99nGD>lqkW z>KPa~@7?27#LVUHvHYp zz+l7x!7#lb8f=3K)CPBu=^$J9W$xVro65kzz{bG9BDX>->&{MAhAajKFb3&_VXz4? zP!q)J85kJr85me!UYf=OQ^ClbF29B4dYOr>2*o-xtHgT;d}STeIzu zkYnItsP%d1#l-OP639N7JTlEQ4HUBs3=K>SD)q`zJ5DWrbfPO;^1M*Le{_ET%#Upi zk^66cGCTKRs*fPDK74FSLJ^y}u+#wxVYXeY3}%cBV2rF59Ksq5jG**q?FsTND3n2Q z3l3EV1_myM(a;2i7$_9wcd-)AV}76z1cfAWI^~AuvGa%U<}oHvJlKeUbc0Mmjt2&2 z1}kvB0yzeRMH$o>7?>HP88{hc{$vkeU|?WmNMqmyNij0a{5g{WRJw>dFgh?WfZTrX z5G#Wn0|OX?)W9$(1uz)o{RG*3)&pcK$aZA6Gczy9e z#@I|_U}jJR=TeYS3=B37q98XjG4MMub}(c+Fd8sG+?#g+pL-dYK{nXfgWL+T1v#WZ t?giVxIR8D!5|DdyuCp?jF))BJNDPL-zSm%20h{KA%``SpF!C_4005&05Ci}K literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_AMF_PDU_03.pcap b/captures/TC_NGAP_AMF_PDU_03.pcap new file mode 100644 index 0000000000000000000000000000000000000000..649ef26319428b177577dcd1b8839b5915b1f3c7 GIT binary patch literal 6244 zcmca|c+)~A1{MYcU}0cnU|&^8@c}ff3PBrn}L;q1Edy2A6UUC3Zl7m z85q&s4zjsdhJzu9kpYZhW`byt&5Y2{vDO3G3NmpT&-7BTZ43+yObm=FI@4$md(MJy}f@S)oR_q6vh>VXdn57fk#gPFM;}Uyjv^H$J zgd77GLq({q0u#gZQjmQxd1RVr8YpHN7#f%uRMcy>-!W}95xtOpDQ?m`^Eu&cYrT9e zmQ9xHyH)=~+=>rbA3ioEp@_{~Sn2?U@H80?1~WzmFh*7j4q*)jMo{{*_5}GB6w08u z1&1mF0|OVsXlQ~$3>1pXWjMh33zW}5VlWH}MFvD0Grl{%`^sP1~+gng=n!+5CsJ(sHEg$ZOAW3%`;6e)=kV!Ghj$y z;9vlGgo(j{AyBc))Q0(#G%L#K6GH5DF@v7}OXf z#OoLwD;anhXZ~adNrSL}9@B>p43!N04l{qU3z-B68Gt1j8KN8*B^U}EK;;X_ReK#c z7$z|=fH6oP41-nITBQHnb94DKRkEFt9k-fl?3` z*p)E1YHQUogfTENFev&xe0iJG<1v4)w&gxXr@c-J0vYSXXRN!>z~K98af)YorVAux z9m?khrz%kD0$BsYU>6!Nu!3A@V+(Q}$dy=Pp%Ugo*=_1s3!_=UH4vyKf|&%O!KTGL zZvvTiG7V%Bs5U|NFAK;|j0_f_avLNE(uIy2Y!}IaLiW^W-g}up3_il-K{lVjYcm5I z$YvV>Z2n-Sz-IYv>RFF&@Zs}wGstGaYal;^YEoQ&2FbzvgF<^i{5*3Dhn?4nu3VTL z$mV}|ZDwEx*=)m4$j_wOthh}*%io8Cp^1S3jA1SU(cpM4dENrDIiwQgXOQj4erABA z<0=M5a7w01ItIB&z5s7J<^Z|K#tP&bkgKqy<0@D>R^FzbwRZ!gC50m$w}MPNnG7-s zlva`bM@%|q2!X^YdO8N#`~RGy{81bd!HjvGNmqC6$ zu!2z(m!Cm$pp<}t6Ci#@PsbpeL-5+nzy-3|hKG=!Nwryhn|js<9lU;S2iY9b2l6w> zc3gf2$zk}Hfq~&bGQ`hDLNj)7*c!;e)PQW()5T{q12@QK8*Y%vAls4CD{?%8YkybH3KZ!12V8F)c9+i+s@2XdT(T!kE$ za5fH`b+)NzS^s9n=jSev&4TAaeg@?d{mU69Rjcx`6j1KDf? z?n{Df$CZvrwOMzYdKUf~|9Lma=8!Ist)LLc$eK++w0`2w=p9cPV>u1pLX3}RrLO+aZ5j)Zs}jv=&=j3LDG!0*nM>fY$`N%OSY+J x{Wa$$AqC!@gzCoZ8N63vZfpwiU_f^x$OcXeUU2HeJBEmq0`E@B2AK+VBLL#c 0) { + vc_pdu_session_resource_setup_list_su_req := vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq; + for (var integer j :=0; j < numOfItems; j := j + 1) { // Loop over the PDUSessionResourceSetupListSUReq items + log("*** " & __SCOPE__ & ": DBG: pDUSessionNAS_PDU of item ", j, ": ", vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU, + mw_NG_DL_NAS_TRANSPORT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); + var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); + var NG_PDU_SESSION_ESTABLISHMENT_ACCEPT v_ng_pdu_session_establishment_accept; + if (decvalue(v_bs, v_ng_pdu_session_establishment_accept) != 0) { + log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); + setverdict(inconc); + } else { + log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_establishment_accept: ", v_ng_pdu_session_establishment_accept); + var NG_NAS_DL_Message_Type v_expected_message; + v_expected_message.pdu_Session_Establishment_Accept := v_ng_pdu_session_establishment_accept; + if (not(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI))) { + log(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI)); // Log mismatch + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); + setverdict(pass); + } + } + } + } // End of 'for' statement + } else { + log("*** " & __SCOPE__ & ": FAIL: No items in pDUSessionResourceSetupListSUReq. ***"); + setverdict(fail); + } + break; // Break the loop as the relevant IE has been processed + } + } // End of 'for' statement + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_01_02 + } // End of group PDU_Session_Resource_Setup //8.2.2 group PDU_Session_Resource_Release{ @@ -3865,7 +3994,7 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_PDU_02 */ - function f_TC_NGAP_AMF_PDU_02() runs on aMFNGAPComponent { + function f_TC_NGAP_AMF_PDU_02() runs on aMFNGAPComponent { // Local variables // Preamble @@ -3938,6 +4067,82 @@ module NGAP_TCFunctions { } // End of function f_TC_NGAP_AMF_PDU_02 + /** + * @desc Testcase function for TC_NGAP_AMF_PDU_02_02 + */ + function f_TC_NGAP_AMF_PDU_02_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_send_registration_request(); + f_NGAP_amf_UE_Authentication(); // f_await_authentication_request_send_authentication_response(); + f_NGAP_amf_UE_SecurityMode(); // f_await_security_mode_command_send_security_mode_complete(); + f_NGAP_amf_UE_InitialContextSetup(); // f_await_initial_context_setup_request_send_initial_context_setup_resonse + f_NGAP_amf_RegistrationComplete(); // f_send_registration_complete + f_NGAP_amf_UE_PDU_SessionEstablishmentRequest(); // f_send_pdu_session_establishment_request + f_NGAP_amf_ConfigurationUpdateCommand(); // f_await_configuration_update_command + f_NGAP_amf_UE_PDU_SessionResourceSetup(); // f_await_pdu_session_resource_setup_request + f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + f_sleep(1.0); // Sleep for a while to ensure the previous procedure is completed before triggering the release + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Test Body + action("Trigger PDU session resource RELEASE!"); + f_NGAP_amf_UE_PDU_SessionResourceReleaseRequest(); // f_send_pdu_session_resource_release_request + + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_PDUSessionResourceReleaseCommand( + vc_AMF_UE_ID, + vc_RAN_UE_ID + ))); + f_NASPDU_Get(vc_recvNGAP_PDU); + var NG_NAS_DL_Message_Type v_message; + if (f_Check_5GAKA_NAS_DL_Message( + vc_recvNAS_PDU, + mw_NG_DL_NAS_TRANSPORT, + vc_ng_nas_security_params_type, + vc_previous_nas_count_dl, + v_message, + vc_inner_message + ) == false) { + log("*** " & __SCOPE__ & ": FAIL: Unexpected NG_PDU_SESSION_RELEASE_COMMAND ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": DBG: vc_inner_message ", vc_inner_message); + log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); + var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); + var NG_PDU_SESSION_RELEASE_COMMAND v_ng_pdu_session_release_command; + if (decvalue(v_bs, v_ng_pdu_session_release_command) != 0) { + log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); + setverdict(inconc); + } else { + log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_release_command: ", v_ng_pdu_session_release_command); + var NG_NAS_DL_Message_Type v_expected_message; + v_expected_message.pdu_Session_Release_Command := v_ng_pdu_session_release_command; + if (not(match(v_expected_message, mw_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit))))) { + log(match(v_expected_message, mw_NG_PDU_SESSION_RELEASE_COMMAND(cs_NG_PDU_SessionId(int2oct(vc_pdu_session_resource_setup_list_su_req[0].pDUSessionID, 1), omit)))); // Log mismatch + log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_RELEASE_COMMAND mismatch. ***"); + setverdict(fail); + } else { + log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_RELEASE_COMMAND ***"); + setverdict(pass); + } + } + } + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_NGAP_amf_UE_ContextRealeaseComplete(); // f_send_ue_context_release_complete + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_PDU_02_02 + } // End of group PDU_Session_Resource_Release //8.2.3 group PDU_Session_Resource_Modify{ @@ -5452,69 +5657,60 @@ module NGAP_TCFunctions { * @desc Testcase function for TC_NGAP_AMF_IMP_02 */ function f_TC_NGAP_AMF_IMP_02() runs on aMFNGAPComponent { - // Local variables - - // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); - - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + // Local variables - // Test Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_GNB_ID,//'0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit - ) - ), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit - ) - }, - PX_PAGING_DRX - ) - ) - ); + // Preamble + f_NGAP_amf_init(); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - f_recv_NGAP_PDU( - mw_ngap_unsuccMsg( - mw_n2_NGSetupFailure( - ?//template (present) Cause p_cause := ? - ) - ) - ); + // Test Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId( + PX_NAS_MCC, + '99'H + ), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + ) + ) + } + ) + } + ) + }, + PX_PAGING_DRX + ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_recv_NGAP_PDU( + mw_ngap_unsuccMsg( + f_mw_n2_NGSetupFailure( + mw_cause_misc( + unknown_PLMN_or_SNPN + )))); - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_AMF_IMP_02 /** @@ -5525,8 +5721,6 @@ module NGAP_TCFunctions { // Preamble f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); @@ -5622,97 +5816,81 @@ module NGAP_TCFunctions { * @desc Testcase function for TC_NGAP_AMF_IMF_04 */ function f_TC_NGAP_AMF_IMP_04() runs on aMFNGAPComponent { - // Local variables + // Local variables - // Preamble - f_NGAP_amf_init(); - //f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + // Preamble + f_NGAP_amf_init(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Test Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGSetupRequest_ExtRanNodeName( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - '0000000000000000000000'B,//in template (value) bitstring p_gnbId, - -//in template (omit) GlobalGNB_ID.iE_Extensions p_iE_Extensions := omit - ) - ), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit - ) - }, - PX_PAGING_DRX, - m_nB_IoT_DefaultPagingDRX(-),//NB_IoT_Default_Paging_DRX, - m_extended_RANNodeName( - -,//in template (omit) RANNodeNameVisibleString p_rANNodeNameVisibleString := omit, - -,//in template (omit) RANNodeNameUTF8String p_rANNodeNameUTF8String := omit, - -//in template (omit) Extended_RANNodeName.iE_Extensions p_iE_Extensions := omit - )//Extended_RAN_Node_Name containing RAN_Node_Name_Visible;;; m_extended_RANNodeName... - ) - ) - ); + // Test Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGSetupRequest_ExtRanNodeName( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + )) + } + ) + } + ) + }, + PX_PAGING_DRX, + m_nB_IoT_DefaultPagingDRX, + m_extended_RANNodeName( + "RANNodeNameVisibleString"/*, + oct2unichar(char2oct("NodeName"))*/ // Dynamic test case error: Internal error: While PER-encoding type '@NGAP-PDU-Descriptions.NGAP-PDU': No BER descriptor available for type '@NGAP-IEs.Extended-RANNodeName.rANNodeNameUTF8String' + )))); f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGSetupResponse_ExtAmfName( - ?, - { - mw_servedGUAMIItem( - mw_gUAMI( - ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, - ?,//template (present) AMFRegionID p_aMFRegionID := ?, - ?,//template (present) AMFSetID p_aMFSetID := ?, - ?,//template (present) AMFPointer p_aMFPointer := ?, - *//template GUAMI.iE_Extensions p_iE_Extensions := * - ),//template (present) GUAMI p_gUAMI := ?, - *,//template AMFName p_backupAMFName := *, - *//template ServedGUAMIItem.iE_Extensions p_iE_Extensions := * - ) - },//template (present) ServedGUAMIList p_servedGUAMIList := ?, - ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, - { - mw_pLMNSupportItem( - ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, - { - mw_sliceSupportItem( - mw_s_NSSAI( - ?,//template (present) SST p_sST := ?, - *,//template SD p_sD := *, - *//template S_NSSAI.iE_Extensions p_iE_Extensions := * - ),//template (present) S_NSSAI p_s_NSSAI := ?, - ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * - ) - },//template (present) SliceSupportList p_sliceSupportList := ?, - *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * - ) - },//template (present) PLMNSupportList p_plmnSuppList := ? - ?//Extended_RAN_Node_Name containing RAN_Node_Name_Visible;;; mw_extended_RANNodeName... - ) - ) - ); + mw_ngap_succMsg( + mw_n2_NGSetupResponse_ExtAmfName( + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + } + ))); + // ?,//template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + // { + // mw_pLMNSupportItem( + // ?,//template (present) PLMNIdentity p_pLMNIdentity := ?, + // { + // mw_sliceSupportItem( + // mw_s_NSSAI( + // ?,//template (present) SST p_sST := ?, + // *,//template SD p_sD := *, + // *//template S_NSSAI.iE_Extensions p_iE_Extensions := * + // ),//template (present) S_NSSAI p_s_NSSAI := ?, + // ?//template SliceSupportItem.iE_Extensions p_iE_Extensions := * + // ) + // },//template (present) SliceSupportList p_sliceSupportList := ?, + // *//template PLMNSupportItem.iE_Extensions p_iE_Extensions := * + // ) + // },//template (present) PLMNSupportList p_plmnSuppList := ? + // ?//Extended_RAN_Node_Name containing RAN_Node_Name_Visible;;; mw_extended_RANNodeName... + // ) + // ) + // ); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -5731,64 +5909,64 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_AMF_IMF_05 */ - function f_TC_NGAP_AMF_IMP_05() runs on aMFNGAPComponent { - // Local variables + function f_TC_NGAP_AMF_IMP_05() runs on aMFNGAPComponent { + // Local variables - // Preamble - f_NGAP_amf_init(); - f_NGAP_amf_GNB_Setup(); - - //f_NGAP_amf_UE_Register(); - //f_NGAP_amf_UE_PDU_ResourceSetup(); + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_GNB_Setup(); + + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - // Test Body - f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_RANConfigurationUpdate_SupportedTAList( - //template (value) SupportedTAList - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - -,// in template (omit) SD p_sD := omit, - -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit - ), - -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit - ) - } + // Test Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_RANConfigurationUpdate_SupportedTAList( + //template (value) SupportedTAList + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC),//m_ie_pLMNIdentity('00f110'O), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + -,// in template (omit) SD p_sD := omit, + -// in template (omit) S_NSSAI.iE_Extensions p_iE_Extensions := omit + ), + -//in template (omit) SliceSupportItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) + },//in template (value) BroadcastPLMNList p_broadcastPLMNList, + -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit + ) + } + ) ) - },//in template (value) BroadcastPLMNList p_broadcastPLMNList, - -//in template (omit) SupportedTAItem.iE_Extensions p_iE_Extensions := omit - ) - } - ) - ) - ); + ); - f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_RANConfigurationUpdateAcknowledge - ) - ); + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_RANConfigurationUpdateAcknowledge + ) + ); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_AMF(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_AMF_IMP_05 + } // End of function f_TC_NGAP_AMF_IMP_05 /** * @desc Testcase function for TC_NGAP_AMF_IMF_06 @@ -5944,21 +6122,21 @@ module NGAP_TCFunctions { // Test Body f_send_NGAP_PDU( - m_ngap_initMsg( - m_n2_NGReset( - m_cause_misc(m_causeMisc(-)),//in template (value) Cause p_cause, - m_resetType_nG_Interface( - m_resetAll(reset_all) - )//in template (value) ResetType p_resetType - ) - ) - ); + m_ngap_initMsg( + m_n2_NGReset( + m_cause_misc( + m_causeMisc + ), + m_resetType_nG_Interface( + m_resetAll( + reset_all + + ))))); f_recv_NGAP_PDU( - mw_ngap_succMsg( - mw_n2_NGResetAcknowledge - ) - ); + mw_ngap_succMsg( + mw_n2_NGResetAcknowledge + )); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -5970,6 +6148,52 @@ module NGAP_TCFunctions { } // End of function f_TC_NGAP_AMF_IMP_08 + /** + * @desc Testcase function for TC_NGAP_AMF_IMF_08_02 + */ + function f_TC_NGAP_AMF_IMP_08_02() runs on aMFNGAPComponent { + // Local variables + + // Preamble + f_NGAP_amf_init(); + f_NGAP_amf_GNB_Setup(); + + //f_NGAP_amf_UE_Register(); + //f_NGAP_amf_UE_PDU_ResourceSetup(); + + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); + + // Test Body + f_send_NGAP_PDU( + m_ngap_initMsg( + m_n2_NGReset( + m_cause_misc( + m_causeMisc + ), + m_resetType_partOfNG_Interface( + { + m_uE_associatedLogicalNG_connectionItem + } + + + )))); + + f_recv_NGAP_PDU( + mw_ngap_succMsg( + mw_n2_NGResetAcknowledge + )); + + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + + // Postamble + f_postamble_NGAP_AMF(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + + } // End of function f_TC_NGAP_AMF_IMP_08_02 + } // End of group NG_Reset //8.7.5 group Error_Indication{ diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index ba7e6dd..767df79 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -73,267 +73,265 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_GNB_PDU_01 - /** - * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value." - */ - testcase TC_NGAP_GNB_PDU_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value." + // */ + // testcase TC_NGAP_GNB_PDU_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_02 + // } // End of testcase TC_NGAP_GNB_PDU_02 - /** - * @desc Test objective "Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP " - */ - testcase TC_NGAP_GNB_PDU_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP " + // */ + // testcase TC_NGAP_GNB_PDU_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_03 + // } // End of testcase TC_NGAP_GNB_PDU_03 - /** - * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a QoS Flow Setup Request List IE in the PDU Session Resource Setup Request Transfer IE including at least one Non-GBR QoS flow but the PDU Session Aggregate Maximum Bit Rate IE is not present. " - */ - testcase TC_NGAP_GNB_PDU_04() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a QoS Flow Setup Request List IE in the PDU Session Resource Setup Request Transfer IE including at least one Non-GBR QoS flow but the PDU Session Aggregate Maximum Bit Rate IE is not present. " + // */ + // testcase TC_NGAP_GNB_PDU_04() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_04()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_04()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_04 + // } // End of testcase TC_NGAP_GNB_PDU_04 } // End of group PDU_Session_Resource_Setup //8.2.2 group PDU_Session_Resource_Release{ - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND contains mandatory IEs and answers with PDU SESSION RESOURCE RELEASE RESPONSE to release PDU session." - */ - testcase TC_NGAP_GNB_PDU_05() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND contains mandatory IEs and answers with PDU SESSION RESOURCE RELEASE RESPONSE to release PDU session." + // */ + // testcase TC_NGAP_GNB_PDU_05() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_05()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_05()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_05 + // } // End of testcase TC_NGAP_GNB_PDU_05 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND containing multiple PDU Session ID IEs set to the same value and ignore the duplication." - */ - testcase TC_NGAP_GNB_PDU_06() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE RELEASE COMMAND containing multiple PDU Session ID IEs set to the same value and ignore the duplication." + // */ + // testcase TC_NGAP_GNB_PDU_06() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_06()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_06()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_06 + // } // End of testcase TC_NGAP_GNB_PDU_06 } // End of group PDU_Session_Resource_Release //8.2.3 group PDU_Session_Resource_Modify{ - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE MODIFY REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE MODIFY RESPONSE for successfully modified PDU session." - */ - testcase TC_NGAP_GNB_PDU_07() runs on gNBNGAPComponent system TestAdapter { - - // Local variables - var gNBNGAPComponent v_ngap_amf; + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a PDU SESSION RESOURCE MODIFY REQUEST contains mandatory IEs and answers with PDU SESSION RESOURCE MODIFY RESPONSE for successfully modified PDU session." + // */ + // testcase TC_NGAP_GNB_PDU_07() runs on gNBNGAPComponent system TestAdapter { - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_07()); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_07()); - f_cf_Down/*gNBoraMF*/(); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - } // End of testcase TC_NGAP_GNB_PDU_07 + // f_cf_Down/*gNBoraMF*/(); - /** - * @desc Test objective "Verify that the NG-RAN node reports the modification of the corresponding PDU session as failed if a PDU SESSION RESOURCE MODIFY REQUEST contains several PDU Session ID IEs set to the same value." - */ - testcase TC_NGAP_GNB_PDU_10() runs on gNBNGAPComponent system TestAdapter { + // } // End of testcase TC_NGAP_GNB_PDU_07 - // Local variables - var gNBNGAPComponent v_ngap_amf; + // /** + // * @desc Test objective "Verify that the NG-RAN node reports the modification of the corresponding PDU session as failed if a PDU SESSION RESOURCE MODIFY REQUEST contains several PDU Session ID IEs set to the same value." + // */ + // testcase TC_NGAP_GNB_PDU_10() runs on gNBNGAPComponent system TestAdapter { - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_10()); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_10()); - f_cf_Down/*gNBoraMF*/(); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - } // End of testcase TC_NGAP_GNB_PDU_10 + // f_cf_Down/*gNBoraMF*/(); - + // } // End of testcase TC_NGAP_GNB_PDU_10 } // End of group PDU_Session_Resource_Modify //8.2.4 group PDU_Session_Resource_Notify{ - /** - * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_NOTIFY that already established QoS flow or PDU session for given UE are release." - */ - testcase TC_NGAP_GNB_PDU_08() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_NOTIFY that already established QoS flow or PDU session for given UE are release." + // */ + // testcase TC_NGAP_GNB_PDU_08() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_08()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_08()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_08 + // } // End of testcase TC_NGAP_GNB_PDU_08 } // End of group PDU_Session_Resource_Notify //8.2.5 group PDU_Session_Resource_Modify_Indication{ - /** - * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_INDICATION to request modification of established PDU session." - */ - testcase TC_NGAP_GNB_PDU_09() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_INDICATION to request modification of established PDU session." + // */ + // testcase TC_NGAP_GNB_PDU_09() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_5)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_5' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_5)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_5' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_PDU_09()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_PDU_09()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_PDU_09 + // } // End of testcase TC_NGAP_GNB_PDU_09 } // End of group PDU_Session_Resource_Modify_Indication } // End of group PDU_Session_Management_Procedures @@ -342,173 +340,173 @@ module NGAP_TestCases { //8.3.1 group Initial_Context_Setup{ - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains optional PDU Session Resource Setup Request List field mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." - */ - testcase TC_NGAP_GNB_CMP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains optional PDU Session Resource Setup Request List field mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + // */ + // testcase TC_NGAP_GNB_CMP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_01 + // } // End of testcase TC_NGAP_GNB_CMP_01 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." - */ - testcase TC_NGAP_GNB_CMP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + // */ + // testcase TC_NGAP_GNB_CMP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_02 + // } // End of testcase TC_NGAP_GNB_CMP_02 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Trace Activation and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." - */ - testcase TC_NGAP_GNB_CMP_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Trace Activation and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + // */ + // testcase TC_NGAP_GNB_CMP_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_03 + // } // End of testcase TC_NGAP_GNB_CMP_03 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Mobility Restriction List and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." - */ - testcase TC_NGAP_GNB_CMP_04() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with optional field Mobility Restriction List and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + // */ + // testcase TC_NGAP_GNB_CMP_04() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_04()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_04()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_04 + // } // End of testcase TC_NGAP_GNB_CMP_04 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with different optional fields and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." - */ - testcase TC_NGAP_GNB_CMP_05() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST with different optional fields and answers with INITIAL CONTEXT SETUP RESPONSE with successfully established UE context." + // */ + // testcase TC_NGAP_GNB_CMP_05() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_05()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_05()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_05 - - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with failed PDU session." - */ - testcase TC_NGAP_GNB_CMP_06() runs on gNBNGAPComponent system TestAdapter { + // } // End of testcase TC_NGAP_GNB_CMP_05 + + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a INITIAL CONTEXT SETUP REQUEST contains mandatory IEs and answers with INITIAL CONTEXT SETUP RESPONSE with failed PDU session." + // */ + // testcase TC_NGAP_GNB_CMP_06() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_06()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_06()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_06 + // } // End of testcase TC_NGAP_GNB_CMP_06 } // End of group Initial_Context_Setup //8.3.2 group UE_Context_Release_Request_NG_RAN_node_initiated{ - /** + /** * @desc Test objective "Verify that the NG-RAN node successfully requests the AMF to release the UE-associated logical NG-connection." */ testcase TC_NGAP_GNB_CMP_07() runs on gNBNGAPComponent system TestAdapter { @@ -535,21 +533,17 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_GNB_CMP_07 - } // End of group UE_Context_Release_Request_NG_RAN_node_initiated - //8.3.3 - group UE_Context_Release_AMF_initiated{ - - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND that contains both the AMF UE NGAP ID IE and the RAN UE NGAP ID IE and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context."" + /** + * @desc Verify that the GNB successfully requests the AMF to release the UE-associated logical NG-connection after rejected registration procedure." */ - testcase TC_NGAP_GNB_CMP_08() runs on gNBNGAPComponent system TestAdapter { + testcase TC_NGAP_GNB_CMP_07_02() runs on gNBNGAPComponent system TestAdapter { // Local variables var gNBNGAPComponent v_ngap_amf; // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_3' shall be set to true for executing the TC. ***"); + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_2)) { + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_2' shall be set to true for executing the TC. ***"); stop; } @@ -557,188 +551,218 @@ module NGAP_TestCases { f_cf_NGAP_gNB_Up(v_ngap_amf); // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_08()); + v_ngap_amf.start(f_TC_NGAP_GNB_CMP_07_02()); // synchronize PTC on 1 sychronization points f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_08 + } // End of testcase TC_NGAP_GNB_CMP_07_02 + + } // End of group UE_Context_Release_Request_NG_RAN_node_initiated + //8.3.3 + group UE_Context_Release_AMF_initiated{ + + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND that contains both the AMF UE NGAP ID IE and the RAN UE NGAP ID IE and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context."" + // */ + // testcase TC_NGAP_GNB_CMP_08() runs on gNBNGAPComponent system TestAdapter { + + // // Local variables + // var gNBNGAPComponent v_ngap_amf; + + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_3' shall be set to true for executing the TC. ***"); + // stop; + // } + + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); + + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_08()); + + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + // f_cf_Down/*gNBoraMF*/(); + + // } // End of testcase TC_NGAP_GNB_CMP_08 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND where only the AMF UE NGAP ID IE is available and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context." - */ - testcase TC_NGAP_GNB_CMP_09() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT RELEASE COMMAND where only the AMF UE NGAP ID IE is available and answers with UE CONTEXT RELEASE COMPLETE with successfully release UE context." + // */ + // testcase TC_NGAP_GNB_CMP_09() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_09()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_09()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_09 + // } // End of testcase TC_NGAP_GNB_CMP_09 } // End of group UE_Context_Release_AMF_initiated //8.3.4 group UE_Context_Modification{ - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION FAILURE because the UE is no longer available." - */ - testcase TC_NGAP_GNB_CMP_10() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION FAILURE because the UE is no longer available." + // */ + // testcase TC_NGAP_GNB_CMP_10() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_10()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_10()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_10 + // } // End of testcase TC_NGAP_GNB_CMP_10 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." - */ - testcase TC_NGAP_GNB_CMP_11() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains mandatory IEs and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." + // */ + // testcase TC_NGAP_GNB_CMP_11() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_11()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_11()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_11 + // } // End of testcase TC_NGAP_GNB_CMP_11 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains optional fields Security Key and Security Capabilities and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." - */ - testcase TC_NGAP_GNB_CMP_12() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains optional fields Security Key and Security Capabilities and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." + // */ + // testcase TC_NGAP_GNB_CMP_12() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_12()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_12()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_12 + // } // End of testcase TC_NGAP_GNB_CMP_12 - /** - * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains different optional fields and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." - */ - testcase TC_NGAP_GNB_CMP_13() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the NG-RAN node successfully processes a UE CONTEXT MODIFICATION REQUEST contains different optional fields and answers with UE CONTEXT MODIFICATION RESPONSE with successfully modify UE context." + // */ + // testcase TC_NGAP_GNB_CMP_13() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_13()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_13()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_13 - + // } // End of testcase TC_NGAP_GNB_CMP_13 } // End of group UE_Context_Modification //8.3.5 group RRC_Inactive_Transition_Report{ - /** - * @desc Test objective "Verify that the IUT can send a RRC INACTIVE TRANSITION REPORT that contains mandatory IEs" - */ - testcase TC_NGAP_GNB_CMP_14() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a RRC INACTIVE TRANSITION REPORT that contains mandatory IEs" + // */ + // testcase TC_NGAP_GNB_CMP_14() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_5)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_5' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_5)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_5' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_14()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_14()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_14 + // } // End of testcase TC_NGAP_GNB_CMP_14 } // End of group RRC_Inactive_Transition_Report //8.3.6 @@ -750,32 +774,32 @@ module NGAP_TestCases { //8.3.8 group RAN_CP_Relocation_Indication{ - /** - * @desc Test objective "Verify that the IUT can send a RAN CP Relocation Indication that contains mandatory IEs" - */ - testcase TC_NGAP_GNB_CMP_15() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a RAN CP Relocation Indication that contains mandatory IEs" + // */ + // testcase TC_NGAP_GNB_CMP_15() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_8)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_8' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_8)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_8' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_15()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_15()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_15 + // } // End of testcase TC_NGAP_GNB_CMP_15 } // End of group RAN_CP_Relocation_Indication //8.3.9 @@ -787,62 +811,62 @@ module NGAP_TestCases { //8.3.11 group UE_Context_Suspend{ - /** - * @desc Test objective "Verify that the IUT can send a UE CONTEXT SUSPEND REQUEST contains mandatory IEs" - */ - testcase TC_NGAP_GNB_CMP_16() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a UE CONTEXT SUSPEND REQUEST contains mandatory IEs" + // */ + // testcase TC_NGAP_GNB_CMP_16() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_11)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_11' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_11)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_11' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_16()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_16()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_16 + // } // End of testcase TC_NGAP_GNB_CMP_16 } // End of group UE_Context_Suspend //8.3.12 group UE_Context_Resume{ - /** - * @desc Test objective "Verify that the IUT can send a UE CONTEXT RESUME REQUEST contains mandatory IEs" - */ - testcase TC_NGAP_GNB_CMP_17() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a UE CONTEXT RESUME REQUEST contains mandatory IEs" + // */ + // testcase TC_NGAP_GNB_CMP_17() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_12)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_12' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_2_12)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_2_12' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CMP_17()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CMP_17()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CMP_17 + // } // End of testcase TC_NGAP_GNB_CMP_17 } // End of group UE_Context_Resume } // End of group UE_Context_Management_Procedures @@ -851,295 +875,295 @@ module NGAP_TestCases { //8.4.1 group Handover_Preparation{ - /** - * @desc Verify that the IUT can send a HANDOVER REQUIRED message containing mandatory IEs. - */ - testcase TC_NGAP_GNB_MMP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the IUT can send a HANDOVER REQUIRED message containing mandatory IEs. + // */ + // testcase TC_NGAP_GNB_MMP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_1_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_1_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_01 + // } // End of testcase TC_NGAP_GNB_MMP_01 } // End of group Handover_Preparation //8.4.2 group Handover_Resource_Allocation{ - /**sychronization - * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. - */ - testcase TC_NGAP_GNB_MMP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. + // */ + // testcase TC_NGAP_GNB_MMP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_02 + // } // End of testcase TC_NGAP_GNB_MMP_02 - /** - * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST FAILURE because the UE is not longer available. - */ - testcase TC_NGAP_GNB_MMP_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains mandatory IEs and answers with HANDOVER REQUEST FAILURE because the UE is not longer available. + // */ + // testcase TC_NGAP_GNB_MMP_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_03 + // } // End of testcase TC_NGAP_GNB_MMP_03 - /** - * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. - */ - testcase TC_NGAP_GNB_MMP_04() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. + // */ + // testcase TC_NGAP_GNB_MMP_04() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_04()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_04()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_04 + // } // End of testcase TC_NGAP_GNB_MMP_04 - /** - * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs within the Handover Request Transfer IEs and answers with correct HANDOVER REQUEST ACKNOWLEDGE. - */ - testcase TC_NGAP_GNB_MMP_05() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message that contains optional IEs within the Handover Request Transfer IEs and answers with correct HANDOVER REQUEST ACKNOWLEDGE. + // */ + // testcase TC_NGAP_GNB_MMP_05() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_05()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_05()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_05 + // } // End of testcase TC_NGAP_GNB_MMP_05 - /** - * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message for an intra-system handover and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. - */ - testcase TC_NGAP_GNB_MMP_06() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the GNB node successfully processes a HANDOVER REQUEST message for an intra-system handover and answers with HANDOVER REQUEST ACKNOWLEDGE to acknowledge the handover. + // */ + // testcase TC_NGAP_GNB_MMP_06() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_06()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_06()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_06 + // } // End of testcase TC_NGAP_GNB_MMP_06 } // End of group Handover_Resource_Allocation //8.4.3 group Handover_Notification{ - /** - * @desc Verify that the AMF node successfully sends a HANDOVER NOTIFICATION message that contains mandatory IEs to the AMF. - */ - testcase TC_NGAP_GNB_MMP_07() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the AMF node successfully sends a HANDOVER NOTIFICATION message that contains mandatory IEs to the AMF. + // */ + // testcase TC_NGAP_GNB_MMP_07() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_07()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_07()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_07 + // } // End of testcase TC_NGAP_GNB_MMP_07 } // End of group Handover_Notification //8.4.4 group Path_Switch_Request{ - /** - * @desc Verify that the AMF node successfully sends a PATH SWITCH REQUEST message that contains mandatory IEs to the AMF. - */ - testcase TC_NGAP_GNB_MMP_08() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the AMF node successfully sends a PATH SWITCH REQUEST message that contains mandatory IEs to the AMF. + // */ + // testcase TC_NGAP_GNB_MMP_08() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_08()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_08()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_08 + // } // End of testcase TC_NGAP_GNB_MMP_08 } // End of group Path_Switch_Request //8.4.5 group Handover_Cancellation{ - /** - * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. - */ - testcase TC_NGAP_GNB_MMP_09() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. + // */ + // testcase TC_NGAP_GNB_MMP_09() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_5)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_5' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_5)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_5' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_09()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_09()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_09 + // } // End of testcase TC_NGAP_GNB_MMP_09 } // End of group Handover_Cancellation //8.4.6 group Uplink_RAN_Status_Transfer{ - /** - * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. - */ - testcase TC_NGAP_GNB_MMP_10() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the NG-RAN node successfully send a UPLINK RAN STATUS TRANSFER message to the AMF. + // */ + // testcase TC_NGAP_GNB_MMP_10() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_6)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_6' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_6)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_6' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_10()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_10()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_MMP_10 + // } // End of testcase TC_NGAP_GNB_MMP_10 } // End of group Uplink_RAN_Status_Transfer //8.4.7 @@ -1151,32 +1175,32 @@ module NGAP_TestCases { //8.4.9 group Uplink_RAN_Early_Status_Transfer{ - /** - * @desc Verify that the NG-RAN node successfully sends a UPLINK RAN EARLY STATUS TRANSFER message to the AMF. - */ - testcase TC_NGAP_GNB_MMP_11() runs on gNBNGAPComponent system TestAdapter { - - // Local variables - var gNBNGAPComponent v_ngap_amf; + // /** + // * @desc Verify that the NG-RAN node successfully sends a UPLINK RAN EARLY STATUS TRANSFER message to the AMF. + // */ + // testcase TC_NGAP_GNB_MMP_11() runs on gNBNGAPComponent system TestAdapter { - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_9)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_9' shall be set to true for executing the TC. ***"); - stop; - } + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_3_9)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_3_9' shall be set to true for executing the TC. ***"); + // stop; + // } - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_MMP_11()); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_MMP_11()); - f_cf_Down/*gNBoraMF*/(); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - } // End of testcase TC_NGAP_GNB_MMP_11 + // f_cf_Down/*gNBoraMF*/(); + + // } // End of testcase TC_NGAP_GNB_MMP_11 } // End of group Uplink_RAN_Early_Status_Transfer //8.4.10 @@ -1194,32 +1218,32 @@ module NGAP_TestCases { //8.6.1 group Initial_UE_Message{ - /** - * @desc Verify that the IUT can send an INITIAL UE MESSAGE to indicate the initiation of a NAS Transport procedure. - */ - testcase TC_NGAP_GNB_NAS_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the IUT can send an INITIAL UE MESSAGE to indicate the initiation of a NAS Transport procedure. + // */ + // testcase TC_NGAP_GNB_NAS_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_NAS_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_NAS_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_NAS_01 + // } // End of testcase TC_NGAP_GNB_NAS_01 } // End of group Initial_UE_Message //8.6.2 @@ -1228,63 +1252,63 @@ module NGAP_TestCases { //8.6.3 group Uplink_NAS_Transport{ - /** - * @desc Verify that the IUT can send an UPLINK NAS TRANSPORT message to the AMF. - */ - testcase TC_NGAP_GNB_NAS_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the IUT can send an UPLINK NAS TRANSPORT message to the AMF. + // */ + // testcase TC_NGAP_GNB_NAS_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_NAS_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_NAS_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_NAS_02 + // } // End of testcase TC_NGAP_GNB_NAS_02 } // End of group Uplink_NAS_Transport //8.6.4 group NAS_Non_Delivery_Indication{ - /** - * @desc Verify that the IUT can send a NAS NON DELIVERY INDICATION message to the AMF. - */ - testcase TC_NGAP_GNB_NAS_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the IUT can send a NAS NON DELIVERY INDICATION message to the AMF. + // */ + // testcase TC_NGAP_GNB_NAS_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_5_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_5_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_NAS_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_NAS_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_NAS_03 + // } // End of testcase TC_NGAP_GNB_NAS_03 } // End of group NAS_Non_Delivery_Indication //8.6.5 @@ -1299,6 +1323,33 @@ module NGAP_TestCases { //8.7.2 group RAN_Configuration_Update{ + /** + * @desc "Verify that the GNB sends an NG_SETUP_REQUEST message to the AMF after TNL establishment." + */ + testcase TC_NGAP_GNB_IMP_01() runs on gNBNGAPComponent system TestAdapter { + + // Local variables + var gNBNGAPComponent v_ngap_amf; + + // Test control + if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_6_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_6_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_gNB_Up(v_ngap_amf); + + // Start + v_ngap_amf.start(f_TC_NGAP_GNB_IMP_01()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_GNB_IMP_01 + } // End of group RAN_Configuration_Update //8.7.3 group AMF_Configuration_Update{ @@ -1379,62 +1430,63 @@ module NGAP_TestCases { //8.8.1 group Uplink_RAN_Configuration_Transfer{ - /** - * @desc Verify that the IUT can send an Uplink RAN Configuration Transfer message to transfer RAN configuration information to the AMF. - */ - testcase TC_NGAP_GNB_CTP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the IUT can send an Uplink RAN Configuration Transfer message to transfer RAN configuration information to the AMF. + // */ + // testcase TC_NGAP_GNB_CTP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_7_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_7_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_7_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_7_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_CTP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_CTP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_CTP_01 + // } // End of testcase TC_NGAP_GNB_CTP_01 } // End of group Uplink_RAN_Configuration_Transfer //8.8.2 group Downlink_RAN_Configuration_Transfer{ - /** - * @desc Verify that the IUT can send an DOWNLINK RAN CONFIGURATION TRANSFER message to transfer RAN configuration information to the NG-RAN. - */ - testcase TC_NGAP_AMF_CTP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the IUT can send an DOWNLINK RAN CONFIGURATION TRANSFER message to transfer RAN configuration information to the NG-RAN. + // */ + // testcase TC_NGAP_AMF_CTP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_gnb; + // // Local variables + // var gNBNGAPComponent v_ngap_gnb; - // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_7_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_7_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_7_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_7_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_gnb); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_gnb); - // Start - v_ngap_gnb.start(f_TC_NGAP_AMF_CTP_01()); + // // Start + // v_ngap_gnb.start(f_TC_NGAP_AMF_CTP_01()); + + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // f_cf_Down/*gNBoraMF*/(); + // } // End of testcase TC_NGAP_AMF_CTP_01 - f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_AMF_CTP_01 } // End of group Downlink_RAN_Configuration_Transfer } // End of group Configuration_Transfer_Procedures //8.9 @@ -1443,152 +1495,152 @@ module NGAP_TestCases { //8.9.1 group Write_Replace_Warning{ - /** - * @desc Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing mandatory IEs and answers with WRITE-REPLACE WARNING RESPONSE to start broadcasting of warning messages. - */ - testcase TC_NGAP_GNB_WTP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing mandatory IEs and answers with WRITE-REPLACE WARNING RESPONSE to start broadcasting of warning messages. + // */ + // testcase TC_NGAP_GNB_WTP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_WTP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_WTP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_WTP_01 + // } // End of testcase TC_NGAP_GNB_WTP_01 - /** - * @desc "Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing Message Identifier IE and/or Serial Number IE different from those in the warning message being broadcast and if Concurent Warning Message Indicator is not present then IUT node answers with WRITE-REPLACE WARNING RESPONSE and replaces the warning message being broadcast with newly received one for that area." - */ - testcase TC_NGAP_GNB_WTP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the NG-RAN node successfully processes a WRITE-REPLACE WARNING REQUEST containing Message Identifier IE and/or Serial Number IE different from those in the warning message being broadcast and if Concurent Warning Message Indicator is not present then IUT node answers with WRITE-REPLACE WARNING RESPONSE and replaces the warning message being broadcast with newly received one for that area." + // */ + // testcase TC_NGAP_GNB_WTP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_WTP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_WTP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_WTP_02 + // } // End of testcase TC_NGAP_GNB_WTP_02 } // End of group Write_Replace_Warning //8.9.2 group PWS_Cancel{ - /** - * @desc "Verify that the NG-RAN node successfully processes a PWS CANCEL REQUEST containing mandatory IEs and answers with PWS CANCEL RESPONSE to cancel an already ongoing broadcast warning messages in all of the cells in the NG-RAN." - */ - testcase TC_NGAP_GNB_WTP_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the NG-RAN node successfully processes a PWS CANCEL REQUEST containing mandatory IEs and answers with PWS CANCEL RESPONSE to cancel an already ongoing broadcast warning messages in all of the cells in the NG-RAN." + // */ + // testcase TC_NGAP_GNB_WTP_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_WTP_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_WTP_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_WTP_03 + // } // End of testcase TC_NGAP_GNB_WTP_03 } // End of group PWS_Cancel //8.9.3 group PWS_Restart_Indication{ - /** - * @desc "Verify that the IUT can send a PWS RESTART INDICATION to inform AMF that PWS information for some or all cells may be reloaded from the CBC if needed." - */ - testcase TC_NGAP_GNB_WTP_04() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the IUT can send a PWS RESTART INDICATION to inform AMF that PWS information for some or all cells may be reloaded from the CBC if needed." + // */ + // testcase TC_NGAP_GNB_WTP_04() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_WTP_04()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_WTP_04()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_WTP_04 + // } // End of testcase TC_NGAP_GNB_WTP_04 } // End of group PWS_Restart_Indication //8.9.4 group PWS_Failure_Indication{ - /** - * @desc "Verify that the IUT can send a PWS FAILURE INDICATION to inform AMF that ongoing PWS operation for one or more cells has failed." - */ - testcase TC_NGAP_GNB_WTP_05() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the IUT can send a PWS FAILURE INDICATION to inform AMF that ongoing PWS operation for one or more cells has failed." + // */ + // testcase TC_NGAP_GNB_WTP_05() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_8_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_8_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_WTP_05()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_WTP_05()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_WTP_05 + // } // End of testcase TC_NGAP_GNB_WTP_05 } // End of group PWS_Failure_Indication } // End of group Warning_Message_Transmission_Procedures @@ -1596,59 +1648,59 @@ module NGAP_TestCases { //8.10 group NRPPa_Transport_Procedures{ - /** - * @desc "Verify that the IUT can send a UPLINK_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." - */ - testcase TC_NGAP_GNB_NTP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the IUT can send a UPLINK_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." + // */ + // testcase TC_NGAP_GNB_NTP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_9_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_9_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_NTP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_NTP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_NTP_01 + // } // End of testcase TC_NGAP_GNB_NTP_01 - /** - * @desc "Verify that the IUT can send a UPLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." - */ - testcase TC_NGAP_GNB_NTP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the IUT can send a UPLINK_NON_UE_ASSOCIATED_NRPPA_TRANSPORT to carry NRPPA signaling between NG-RAN and LMF(Location Management Functionality)." + // */ + // testcase TC_NGAP_GNB_NTP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_9_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_9_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_9_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_NTP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_NTP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_NTP_02 + // } // End of testcase TC_NGAP_GNB_NTP_02 } // End of group NRPPa_Transport_Procedures //8.11 @@ -1656,32 +1708,32 @@ module NGAP_TestCases { //8.11.1 group Trace_Start{ - /** - * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that Trace Start procedure has failed due to an interaction with handover procedure." - */ - testcase TC_NGAP_GNB_TRP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that Trace Start procedure has failed due to an interaction with handover procedure." + // */ + // testcase TC_NGAP_GNB_TRP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_1) and (not PICS_A3_10_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_1 and PICS_A3_10_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_1) and (not PICS_A3_10_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_1 and PICS_A3_10_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_TRP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_TRP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_TRP_01 + // } // End of testcase TC_NGAP_GNB_TRP_01 } // End of group Trace_Start //8.11.2 @@ -1690,63 +1742,63 @@ module NGAP_TestCases { //8.11.3 group Deactivate_Trace{ - /** - * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that a Deactivate Trace procedure has failed due to an interaction with handover procedure." - */ - testcase TC_NGAP_GNB_TRP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a TRACE_FAILURE_INDICATION to inform AMF that a Deactivate Trace procedure has failed due to an interaction with handover procedure." + // */ + // testcase TC_NGAP_GNB_TRP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_2) and (not PICS_A3_10_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_2 and PICS_A3_10_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_2) and (not PICS_A3_10_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_2 and PICS_A3_10_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_TRP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_TRP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_TRP_02 + // } // End of testcase TC_NGAP_GNB_TRP_02 } // End of group Deactivate_Trace //8.11.4 group Cell_Traffic_Trace{ - /** - * @desc Test objective "Verify that the IUT can send a CELL_TRAFFIC_TRACE to send the allocated Trace Recording Session Reference and Trace Reference to AMF." - */ - testcase TC_NGAP_GNB_TRP_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a CELL_TRAFFIC_TRACE to send the allocated Trace Recording Session Reference and Trace Reference to AMF." + // */ + // testcase TC_NGAP_GNB_TRP_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_4)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_4' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_10_4)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_10_4' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_TRP_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_TRP_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_TRP_03 + // } // End of testcase TC_NGAP_GNB_TRP_03 } // End of group Cell_Traffic_Trace } // End of group Trace_Procedures @@ -1758,63 +1810,63 @@ module NGAP_TestCases { //8.12.2 group Location_Reporting_Failure_Indication{ - /** - * @desc "Verify that the IUT can send a LOCATION REPORTING FAILURE INDICATION message after that contains mandatory IEs receiving a LOCATION REPORTING CONTROL message with two identical Location Reporting Reference IDs." - */ - testcase TC_NGAP_GNB_LRP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the IUT can send a LOCATION REPORTING FAILURE INDICATION message after that contains mandatory IEs receiving a LOCATION REPORTING CONTROL message with two identical Location Reporting Reference IDs." + // */ + // testcase TC_NGAP_GNB_LRP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_11_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_11_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_LRP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_LRP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_LRP_01 + // } // End of testcase TC_NGAP_GNB_LRP_01 } // End of group Location_Reporting_Failure_Indication //8.12.3 group Location_Report{ - /** - * @desc "Verify that the IUT can send a LOCATION REPORT message that contains mandatory IEs to provide the UE's current location." - */ - testcase TC_NGAP_GNB_LRP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc "Verify that the IUT can send a LOCATION REPORT message that contains mandatory IEs to provide the UE's current location." + // */ + // testcase TC_NGAP_GNB_LRP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_11_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_11_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_11_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_LRP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_LRP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_LRP_02 + // } // End of testcase TC_NGAP_GNB_LRP_02 } // End of group Location_Report } // End of group Location_Reporting_Procedures @@ -1860,63 +1912,63 @@ module NGAP_TestCases { //8.14.2 group UE_Radio_Capability_Check{ - /** - * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY CHECK RESPONSE message that contains mandatory IEs to provide the UE radio capabilities." - */ - testcase TC_NGAP_GNB_URP_02() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY CHECK RESPONSE message that contains mandatory IEs to provide the UE radio capabilities." + // */ + // testcase TC_NGAP_GNB_URP_02() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_2)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_2' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_2)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_2' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_URP_02()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_URP_02()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_URP_02 + // } // End of testcase TC_NGAP_GNB_URP_02 } // End of group UE_Radio_Capability_Check //8.14.3 group UE_Radio_Capability_ID_Mapping{ - /** - * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING REQUEST." - */ - testcase TC_NGAP_GNB_URP_03() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a UE RADIO CAPABILITY ID MAPPING REQUEST." + // */ + // testcase TC_NGAP_GNB_URP_03() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_3)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_3' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_13_3)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_13_3' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_URP_03()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_URP_03()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_URP_03 + // } // End of testcase TC_NGAP_GNB_URP_03 } // End of group UE_Radio_Capability_ID_Mapping } // End of group UE_Radio_Capability_Management_Procedures @@ -1925,32 +1977,32 @@ module NGAP_TestCases { //8.15.1 group Secondary_RAT_Data_Usage_Report{ - /** - * @desc Test objective "Verify that the IUT can send a SECONDARY RAT DATA USAGE REPORT." - */ - testcase TC_NGAP_GNB_DRP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a SECONDARY RAT DATA USAGE REPORT." + // */ + // testcase TC_NGAP_GNB_DRP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_14_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_14_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_14_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_14_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_DRP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_DRP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_DRP_01 + // } // End of testcase TC_NGAP_GNB_DRP_01 } // End of group Secondary_RAT_Data_Usage_Report } // End of group Data_Usage_Reporting_Procedures @@ -1959,32 +2011,32 @@ module NGAP_TestCases { //8.16.1 group Uplink_RIM_Information_Transfer{ - /** - * @desc Test objective "Verify that the IUT can send a UPLINK RIM INFORMATION TRANSFER." - */ - testcase TC_NGAP_GNB_RIP_01() runs on gNBNGAPComponent system TestAdapter { + // /** + // * @desc Test objective "Verify that the IUT can send a UPLINK RIM INFORMATION TRANSFER." + // */ + // testcase TC_NGAP_GNB_RIP_01() runs on gNBNGAPComponent system TestAdapter { - // Local variables - var gNBNGAPComponent v_ngap_amf; + // // Local variables + // var gNBNGAPComponent v_ngap_amf; - // Test control - if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_15_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_15_1' shall be set to true for executing the TC. ***"); - stop; - } + // // Test control + // if ((not PICS_NGAP_GNB_IUT) and (not PICS_A3_15_1)){ + // log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_GNB_IUT and PICS_A3_15_1' shall be set to true for executing the TC. ***"); + // stop; + // } - // Test component configuration - f_cf_NGAP_gNB_Up(v_ngap_amf); + // // Test component configuration + // f_cf_NGAP_gNB_Up(v_ngap_amf); - // Start - v_ngap_amf.start(f_TC_NGAP_GNB_RIP_01()); + // // Start + // v_ngap_amf.start(f_TC_NGAP_GNB_RIP_01()); - // synchronize PTC on 1 sychronization points - f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + // // synchronize PTC on 1 sychronization points + // f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); - f_cf_Down/*gNBoraMF*/(); + // f_cf_Down/*gNBoraMF*/(); - } // End of testcase TC_NGAP_GNB_RIP_01 + // } // End of testcase TC_NGAP_GNB_RIP_01 } // End of group Uplink_RIM_Information_Transfer //8.16.2 @@ -2026,6 +2078,33 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_AMF_PDU_01 + /** + * @desc "Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_SETUP_RESPONSE message and completes the PDU Session Resource Setup procedure for a single PDU_Session_Resource." + */ + testcase TC_NGAP_AMF_PDU_01_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_1)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_1' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_01_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_01_02 + } // End of group PDU_Session_Resource_Setup //8.2.2 group PDU_Session_Resource_Release{ @@ -2156,7 +2235,7 @@ module NGAP_TestCases { //8.3.1 group Initial_Context_Setup{ - /** + /** * @desc "Verify the IUT correctly sets the UE Context after Authentication and Security procedure has been executed." */ testcase TC_NGAP_AMF_CMP_01() runs on aMFNGAPComponent system TestAdapter { @@ -2190,7 +2269,7 @@ module NGAP_TestCases { //8.3.3 group UE_Context_Release_AMF_initiated{ - /** + /** * @desc "Verify that the IUT can send a UE CONTEXT RELEASE COMMAND that contains both the AMF_UE_NGAP_ID IE and the RAN_UE_NGAP_ID IE or only AMF_UE_NGAP_ID." */ testcase TC_NGAP_AMF_CMP_02() runs on aMFNGAPComponent system TestAdapter { @@ -2243,7 +2322,6 @@ module NGAP_TestCases { f_cf_Down/*gNBoraMF*/(); } // End of testcase TC_NGAP_AMF_CMP_03 - } // End of group UE_Context_Release_AMF_initiated //8.3.4 @@ -2348,7 +2426,7 @@ module NGAP_TestCases { //8.3.9 group Retrieve_UE_Information{ - /** + /** * @desc "Verify that the IUT can successfully request UE information from the AMF." */ // testcase TC_NGAP_AMF_CMP_07() runs on aMFNGAPComponent system TestAdapter { @@ -2997,7 +3075,7 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_AMF_IMP_03 /** - * @desc "Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup." + * @desc "Verify that the AMF node successfully processes an NG_SETUP_REQUEST message including the appropriate data and answers with NG_SETUP_RESPONSE to acknowledge the setup." */ testcase TC_NGAP_AMF_IMP_04() runs on aMFNGAPComponent system TestAdapter { @@ -3028,7 +3106,7 @@ module NGAP_TestCases { group RAN_Configuration_Update{ /** - * @desc "Verify that the AMF node successfully processes a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE ACKNOWLEDGE to acknowledge the update." + * @desc "Verify that the AMF node successfully processes a RAN_CONFIGURATION_UPDATE message containing new slice with RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE to acknowledge the update with supported slice at AMF." */ testcase TC_NGAP_AMF_IMP_05() runs on aMFNGAPComponent system TestAdapter { @@ -3118,7 +3196,7 @@ module NGAP_TestCases { /** * @desc "Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset." - */ + */ testcase TC_NGAP_AMF_IMP_08() runs on aMFNGAPComponent system TestAdapter { // Local variables @@ -3143,6 +3221,33 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_AMF_IMP_08 + /** + * @desc "Verify that the AMF node successfully processes a partial NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the partial reset." + */ + testcase TC_NGAP_AMF_IMP_08_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_4)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_4' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_IMP_08_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_IMP_08_02 + } // End of group NG_Reset //8.7.5 group Error_Indication{ diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 7ffa810..16af800 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -6261,12 +6261,12 @@ module LibNGAP_Templates { } // End of template mw_n2_NGSetupResponse_UERetentionInfo template (present) SuccessfulOutcome mw_n2_NGSetupResponse_ExtAmfName( - template (present) AMFName p_amfName := ?, - template (present) ServedGUAMIList p_servedGUAMIList := ?, - template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, - template (present) PLMNSupportList p_plmnSuppList := ?, - template (present) Extended_AMFName p_extAmfName :=? - ) := { + template (present) AMFName p_amfName := ?, + template (present) ServedGUAMIList p_servedGUAMIList := ?, + template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + template (present) PLMNSupportList p_plmnSuppList := ?, + template (present) Extended_AMFName p_extAmfName :=? + ) := { procedureCode := id_NGSetup, criticality := reject, value_ := { @@ -15653,8 +15653,8 @@ module LibNGAP_Templates { } // End of template m_resetType_nG_Interface template (value) ResetType m_resetType_partOfNG_Interface( - in template (value) UE_associatedLogicalNG_connectionList p_partOfNG_Interface - ) := { + in template (value) UE_associatedLogicalNG_connectionList p_partOfNG_Interface + ) := { partOfNG_Interface := p_partOfNG_Interface } // End of template m_resetType_partOfNG_Interface @@ -16662,10 +16662,10 @@ module LibNGAP_Templates { } // End of template m_uEAppLayerMeasConfigInfo template (omit) UE_associatedLogicalNG_connectionItem m_uE_associatedLogicalNG_connectionItem( - in template (omit) AMF_UE_NGAP_ID p_aMF_UE_NGAP_ID := omit, - in template (omit) RAN_UE_NGAP_ID p_rAN_UE_NGAP_ID := omit, - in template (omit) UE_associatedLogicalNG_connectionItem.iE_Extensions p_iE_Extensions := omit - ) := { + in template (omit) AMF_UE_NGAP_ID p_aMF_UE_NGAP_ID := PX_AMF_UE_NGAP_ID, + in template (omit) RAN_UE_NGAP_ID p_rAN_UE_NGAP_ID := PX_RAN_UE_NGAP_ID, + in template (omit) UE_associatedLogicalNG_connectionItem.iE_Extensions p_iE_Extensions := omit + ) := { aMF_UE_NGAP_ID := p_aMF_UE_NGAP_ID, rAN_UE_NGAP_ID := p_rAN_UE_NGAP_ID, iE_Extensions := p_iE_Extensions @@ -18759,30 +18759,30 @@ module LibNGAP_Templates { } // End of template mw_expectedUEMovingTrajectoryItem template Extended_AMFName mw_extended_AMFName( - template AMFNameVisibleString p_aMFNameVisibleString := *, - template AMFNameUTF8String p_aMFNameUTF8String := *, - template Extended_AMFName.iE_Extensions p_iE_Extensions := * - ) := { + template AMFNameVisibleString p_aMFNameVisibleString := *, + template AMFNameUTF8String p_aMFNameUTF8String := *, + template Extended_AMFName.iE_Extensions p_iE_Extensions := * + ) := { aMFNameVisibleString := p_aMFNameVisibleString, aMFNameUTF8String := p_aMFNameUTF8String, iE_Extensions := p_iE_Extensions } // End of template mw_extended_AMFName template Extended_RANNodeName mw_extended_RANNodeName( - template RANNodeNameVisibleString p_rANNodeNameVisibleString := *, - template RANNodeNameUTF8String p_rANNodeNameUTF8String := *, - template Extended_RANNodeName.iE_Extensions p_iE_Extensions := * - ) := { + template RANNodeNameVisibleString p_rANNodeNameVisibleString := *, + template RANNodeNameUTF8String p_rANNodeNameUTF8String := *, + template Extended_RANNodeName.iE_Extensions p_iE_Extensions := * + ) := { rANNodeNameVisibleString := p_rANNodeNameVisibleString, rANNodeNameUTF8String := p_rANNodeNameUTF8String, iE_Extensions := p_iE_Extensions } // End of template mw_extended_RANNodeName template (present) ExtendedRATRestrictionInformation mw_extendedRATRestrictionInformation( - template (present) ExtendedRATRestrictionInformation.primaryRATRestriction p_primaryRATRestriction := ?, - template (present) ExtendedRATRestrictionInformation.secondaryRATRestriction p_secondaryRATRestriction := ?, - template ExtendedRATRestrictionInformation.iE_Extensions p_iE_Extensions := * - ) := { + template (present) ExtendedRATRestrictionInformation.primaryRATRestriction p_primaryRATRestriction := ?, + template (present) ExtendedRATRestrictionInformation.secondaryRATRestriction p_secondaryRATRestriction := ?, + template ExtendedRATRestrictionInformation.iE_Extensions p_iE_Extensions := * + ) := { primaryRATRestriction := p_primaryRATRestriction, secondaryRATRestriction := p_secondaryRATRestriction, iE_Extensions := p_iE_Extensions @@ -25441,6 +25441,36 @@ module LibNGAP_Templates { return pdu; } // End of function f_mw_n2_InitialContextSetupRequest + function f_m_n2_PDUSessionResourceSetupRequest( + in template (value) AMF_UE_NGAP_ID p_amfUeNgapID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_ranUeNgapID := PX_RAN_UE_NGAP_ID + ) return template (value) InitiatingMessage { + var template (value) InitiatingMessage pdu := { + procedureCode := id_PDUSessionResourceSetup, + criticality := reject, + value_ := { + PDUSessionResourceSetupRequest := { + protocolIEs := { + { + id := id_AMF_UE_NGAP_ID, + criticality := reject, + value_ := { AMF_UE_NGAP_ID := p_amfUeNgapID } + }, + { + id := id_RAN_UE_NGAP_ID, + criticality := reject, + value_ := { RAN_UE_NGAP_ID := p_ranUeNgapID } + } + } + } + } + }; + var integer idx := lengthof(pdu.value_.PDUSessionResourceSetupRequest.protocolIEs); + + // TODO FSCOM To be done + return pdu; + } // End of function f_m_n2_PDUSessionResourceSetupRequest + function f_mw_n2_PDUSessionResourceSetupRequest( template (present) AMF_UE_NGAP_ID p_amfUeNgapID := ?, template (present) RAN_UE_NGAP_ID p_ranUeNgapID := ?, @@ -25696,7 +25726,7 @@ module LibNGAP_Templates { ) return template (present) UnsuccessfulOutcome { var template (present) UnsuccessfulOutcome pdu := mw_n2_NGSetupFailure(p_cause); - var integer idx := lengthof(pdu.value_.NGSetupFailure.protocolIEs); + var integer idx := 1; /* Time to Wait */ if (not istemplatekind(p_timeToWait, "omit")) { diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index adc1a0a..9638963 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -94,15 +94,14 @@ module LibNGAP_Functions { PX_TACode, { m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST/*, - PX_SD*/ - ) - ) - } + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST/*, + PX_SD*/ + )) + } ) } ) -- GitLab From f935701f7f4d5c2a0d565a497403d6f738f6bce3 Mon Sep 17 00:00:00 2001 From: garciay Date: Thu, 11 Jun 2026 16:04:58 +0200 Subject: [PATCH 137/151] Add PCAP files --- captures/TC_NGAP_AMF_IMP_04.pcap | Bin 0 -> 5318 bytes captures/TC_NGAP_AMF_IMP_08.pcap | Bin 0 -> 1738 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 captures/TC_NGAP_AMF_IMP_04.pcap create mode 100644 captures/TC_NGAP_AMF_IMP_08.pcap diff --git a/captures/TC_NGAP_AMF_IMP_04.pcap b/captures/TC_NGAP_AMF_IMP_04.pcap new file mode 100644 index 0000000000000000000000000000000000000000..d7bb93a9bb55db5ed90e3d847565f6e2ec779224 GIT binary patch literal 5318 zcmca|c+)~A1{MYcU}0cnU|`VSu9a0A&czVKzyQVwc?Jd!23IBq7X}6g28R|K^?C*d zmU;#T&gTXEGB8z)3=Aq484Fq&7#A=w$o>Dn;TxkM0}lfm11keV0|Nug0R{#ZkPYqO zTnt7G3}6h?3!=d`s6cIS2bm7CggCk%s4 zh=H0QR?on|SkJ(~+ATbd2d09Nfx*VM&i*pkja>i#ACuWF&%nyS0a6R153FDm1<_o( z42moBB}YNQ=vF6;)Gh>VXcTa|FxzRngV7PZ~?=|0XK z5^@Y&3=Z!~Gng2OV2ne zeX-u=py&kFM+I%j`tY$S2}Nw?!cqq)gg;zkWH4i70Apme;1JeeU<9QBoBz{rrs zzzdRM1c@+!N*7TFMhAv74vY+pf(}v+JAxej{PI&${StFi!!nCAlX6mnONuh{(is>S zK>o|R%gA8IzyQV|b6^1u9p% z-juI1*s(YhCI_(bBwrgdnC3E2O^9zv8I|@O529@);{0x$V z`3Hrb0P(YAt@{gCe&rOH9LQ!Lyf!nif^4=CB;;pOZMNR7l@+xHUtQ?%5@hpl9gv?v zw&U_MNDk&76nYlK&)=8ieM_9fpazoz*<6X&W(GEp%{BrclR>s4r&r{72Fb%rMWJ!n zY`a}6>u@>~zIc8GvN``h$W~DL#pP#^9Ey!F&LW7P(bG1_X66ihHZ!n;Y_{PC`3Yn@ zE0#arqe}2ek{8+5+)2dfEord=RhA z44fdFZFoT@gKWnY&mehJE1^6bHal!&?OIuNj(FQ)pFlSM z#@e1nZhL}a1L{ju>Jh}x=xG~dvxXBsn;G~)Hrud+OvdMDkUXlDP#zAO{kCgmWi_yZ z$4o$DCs5U33f$g?jtn5iO|G9q9XDa>I(!^5GVuSuYmrMe`q%@=hNcEqQ0D@S!A3&~ zunn+29n!eT^>biTq2ne2+qJTe_TX(Reg=h3{x?v_fKocHv>FJE6d~&3kfN@FA6n9@0e2*0ZY-#?%)26o}xiE_&s6)r)IpP6i6w$FA8ibG(`gd D&3rYO literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_AMF_IMP_08.pcap b/captures/TC_NGAP_AMF_IMP_08.pcap new file mode 100644 index 0000000000000000000000000000000000000000..f39af748f3d5dd98b1a7cecfa96cdb8464e5e15d GIT binary patch literal 1738 zcmca|c+)~A1{MYcU}0cnU|?w2sg>m_#KjQAzyQVwc?Jd!23IBq7X}6g28R|K^?C*d zmU;#T&b~|hGB8z)3=Ar^Cly#37#A=w$o>DnlYiq+1|9}B237`!1_lO}0}Ko-ARByz zxEPEW7{C~&7es??P=VUu4l*5N3%^X?C9tUs3=C`x3@j}>wX#?)GBIQ^Fn}>gCk%s4 zh=H0QR?on|SkJ(~df?hL9+(P71_m4BytGeXH*)>|KcSNUIRh&L2S_c5KCpsO6hw3B zGBBdM9b~iGMJ9$IMg}m3nF*pnHZwv)$660$E6BuYJO{3UZDU|yU}9iY$y}GX9&EE5 z1K0M`CtowLGjd2;GZ#+Q;foLTt5m)!yZ8sg=a;1*6Or-y#C4gU((;U9Vv9nA_Iq&c zkdR~GVt9S>^mZnO1J^+I!Q_!?o@t<%WngGvVo>?saznx9_TROOMGr3f>2TxWsXv_) z`%`{QGuogz(S~cK9y)k2uL@`6y$hdU}mra=PQ_{q6}&b49pDD44e!zf3gQKFfcGOq%rVQ>=+op7^DV?fa>`257c4045yJ;*;Gmmr5G$WLHbFwQ>( zatO#z{vVjY Date: Fri, 12 Jun 2026 08:39:05 +0200 Subject: [PATCH 138/151] Review TC_NGAP_AMF_IMP_06/07/08/08_02 --- captures/TC_NGAP_AMF_IMP_05.pcap | Bin 0 -> 11746 bytes captures/TC_NGAP_AMF_IMP_06.pcap | Bin 0 -> 5412 bytes captures/TC_NGAP_AMF_IMP_08_02.pcap | Bin 0 -> 11448 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 6 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 108 ++++++++++-------------- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 4 +- 6 files changed, 52 insertions(+), 66 deletions(-) create mode 100644 captures/TC_NGAP_AMF_IMP_05.pcap create mode 100644 captures/TC_NGAP_AMF_IMP_06.pcap create mode 100644 captures/TC_NGAP_AMF_IMP_08_02.pcap diff --git a/captures/TC_NGAP_AMF_IMP_05.pcap b/captures/TC_NGAP_AMF_IMP_05.pcap new file mode 100644 index 0000000000000000000000000000000000000000..525353b6acf915ea637dd874d55575940dadec9f GIT binary patch literal 11746 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 X1&v~AFo=L{Hp6B!8)z_shk*qEPz#!F literal 0 HcmV?d00001 diff --git a/captures/TC_NGAP_AMF_IMP_08_02.pcap b/captures/TC_NGAP_AMF_IMP_08_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..a2e774f029f3fe001d74426f58b6c29ff5372921 GIT binary patch literal 11448 zcmca|c+)~A1{MYcU}0cnU|`^#r=6v@jhi8efdPyW@(c_d46aNJE({C~3=Sh%l^ zEcFZwoYTGdWniip85mSfy>eG)U|hh!Aou@&NcO}D3_J{M46F#^WzJTMiE3=B5RzcxPwyOHbv|Mb>6Lk3m`4v<<9eP9KnD2V3L zWne^iJILnuo$L%jj0|85GZRFEY-WUpjlj}=v^!&e5HKp?5<_*7>I{y6&G7%Zem$&6T-TaFgCdQn*d3A&R z4hcC1E{1gr-DH>;js=74gUKV)Jkvli%fQgU#GvxqUm*BWQIU%K@q1rNmPG|6sU?e- z7_t8<5|cWXaPii9WPSM9l!PKSb783i6v96{*%{0j8Ne7>EjWZV7#Kn6&)O5@TTm#2 z;uajL3=9lh45Oh53NcV9a&@tT^A{+efy7`K6p9S6Jmv=qK~P8{r&Dfd9&7K%o5z?y z@n9nY(hV{NIUX388LYth3TCM&gBk+^GlMh(C&SF2>;Vi642%qE47?y|Mvw>tsB{r^ zV02($0J(i~KRbgR0|OX?)W9&LAHWyM|L|i1A_qAX2$u~K)OJtna^ft zC}Us%V~`jOgH6lOk^q?|_z9b749pB};9LsPVxu4m3Q|x>$;aA|Uyzz-nqI7%n44z6 zkifvf0P+YEg9AgD1LJ>&00s^aAM7!(pFC#c^AiIz$Q3sBApd||f*hJ4KY?ArIR6yL zAs|0FEM#X0V_*PdkQfYu{p7*G0ya$zn`sQp3~K4Eb)aMcDHcQ+gg|8zzXM|zLj(hx z17iXcs44*2a&{p*LmUGG7{hD;(O_Ewv?M{c2yuek3$h7IJQ#t?I*=A-1_c?ng`n~U zWUGyW2m=o&5#&3tg6#v@_Io22IL1LS57Gj|VA~8BSV6Yg*n(^V*@z{C*28R*n5UgJ z--8ESJAi5lm`NZSY+8(#6v(u;^B|KzB|Wm+Sr`~>7#JBWKxHaO4x|eM=RDB`dF0%> z_>&7W1Q)~PK{ju|Z?iPW=JR$Sn?ZFAE}KDeFjG-zsLh#iUm0{C=RShTfowj7*JcJb zkj*v%*g}w%LO)-|Z!*rdD>YwIPjHHS~4J;&x2A8E68+`L%R(U&*-5I zviTu?n`J>Zx19mSGbk0|vKb@?i$fF|YBPEY1KIo>zs+(Wn+1P>YzBomE}KDeC^o`4 zP@C&Q+oD(PV042CgKXyD#24BO93Y!*_&_FuY)8(c$SLdqsEq|P7MX_Hj4iYU@Y~D@ zwwafZ&E$l(7=D|%z&7&`vKb_g>{U1$>Sy%OR-LDvb=R5`Ul}G3viZCfD5OCliYuN$ za&X&_8S}8GZII2+@!PBbvbpUf$YxN8;<6behioC74Ye6PZG&w7kJn}fZjjA3+@R0| z*-ml_gW8Oq!az2&+u#dr1|G1@T!d^U)z514w6juAGvbS9MUc&cUqSu_*^Vo;L2~dA zMrJI4#4~yd1KHez*JcJ@kj*xr8Xn${g0;1g^E0V7YtPfp3Mk;l=Vv95&F9TQeg>sq zTz&@0A$t|h-UjhAdOU+{F2QRv10Tp{8*qORWIM?z42R7+^R%K>Umz&mfy0;I~-?WOLh5kjVH{0y>L`X4?& zGw_3KwqXbP31mC2&<4rFZ9`^2ZN}zjRs1#!fNf?2nT*e7a{PSf0ULPq1T>0*>{xKy z6FNqK7(rRF3v~qLbJpL_;Fhf1|NqziA5TXgg#d->uLo?Pt_T=o*Z}L@A&sD{*abEf zI)Y+2Pdlr80WZF^s0s?5wj-dB0fhj`DdHR?EuyCgkj>5bZB_%>eBKyjGbnfCvKb_Y z>~lC9YBPGy2id$AugwgCAe(Ji$xabao3Z)%7=D|Dz&3-%)9{wFr25%to_3bH9vi-R zRtMQE_#PD6Ab;ZuZIB#1gpnB+An}Zz|3Eg|abu`_A8ct<^nx~zmQptoTcG1T{S39DPg9<;HeVs4teFaZgaF zfM{@9V`bm~<$m-M2xPN+B@=iI6f_o!9>&Rb?C57pA*gaa~S{tt-~{iAa^pi#_zvCr5X?_|H!tJ0jL$J-zaZr$HrW2XKW1yh1P?&>2G$=hWWHh&cO>4zw8fY98oJ&E< z85qbO2L-tza3VfGp^t+ihbG8RU{^rLK|!YR&td|Pfr7?DA&!HPU_W7ugCd&-8V5Ct z`eFqhiw0@JF%Al{Wz8%m@E9m)EEJ>^hQYQ3G`E67ZVtAP1GyP&3#fbmX=7$kc(kh& z6a}E+LyU1ykZrb`S@Fa=`Zy@EpFp;OO^4bRI!`+*G!S3?-`oard+BA6+d(BhavDO6 zgRXW2$$^}Yjt@pW1&@OU`WJr_j=cyU2L;(&fY)XQw9!ape<1pnvI5MST2xgF$Z z-6W8oLA4t$KZE4Z{R`$tLHvBwSm)>6`ON#lVhjunAU|)%Ycm7dI4CYZlWKF+JnbxJ zHhk^*<_?gbcl3h%j9ykC$1_L{<{uO~58~%#ey`lCzVQBm$$@Onz-u%5m>@1clWKGH zJngJ!6It=JewsT$elEQL@-ry?;)-XG9Lzr`bOFTA=xG~dGs`4=HZ!1&M&j}_sW!*V z)6RaJL6FrA z*ypdBdq95HjRpA`6r#BN43b0kE1ca0@iTfngKRd!Z*wom=2Gyy1}OdFvKb@?w+)#A zwHZBEfo%4`Ycu)?EUwTd$Irg_ZAKdh#bq<8eomjKoz<*`uXWkn2MX;S?VxxDr6OFR z4U$6+WEh)q9weU8(>BQF<#=sI9|y(dXHsp>n5Ug}r46s2`$2xzjRN@@6qmUC43dNS z6NO#`@iThb2H7moj?ZTF(MVi=CdcNhVO;p?stF)Jmx5UoJ zt3ZDKh1X^Vv~f^eekRrCoO#+=0*p)~jDudDg*t)~s;p8086)`rf8STxWb{!8kPRA) zMD*^E#z8O70-FjQLCFP;k43WJivfi zGx}&Gu6QBU=Dc~@Sqj_n`gsz_&${6tKZ8;_EydS0Iju@CuKe8nh&VCIOJ^4c33W+wCVO7^jr+G z;k!I(>p|Ci0GkTU#Y^XDXKn8!#f@h>QQdg$`>q8rH}(eJSdZ>TkPVkQNps`bPOzy^ zHy)j*oyFk5K|*P`qzl!J$}3x1U~bG$NcTo}Bgh7E2M)qxT}Y+jk}j~RP&YoAr=6AZ ng%mg5zlrL`y4*ukVQ$=^b?g?p8$mWq`9hi-@81NQ3Uwm@E> Date: Fri, 12 Jun 2026 09:00:06 +0000 Subject: [PATCH 139/151] Changed order of the events --- test_purposes/NGAP_Common.tdltx | 41 ++++++++++++++++---------------- test_purposes/NGNAS_Common.tdltx | 7 +++--- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/test_purposes/NGAP_Common.tdltx b/test_purposes/NGAP_Common.tdltx index 4a9a401..dcf0a86 100644 --- a/test_purposes/NGAP_Common.tdltx +++ b/test_purposes/NGAP_Common.tdltx @@ -37,30 +37,29 @@ Package NGAP_Common { //TP_AMF NGAP events - Event isInCM_CONNECTED //UE is in CM_CONNECTED state - Event hasActiveUeNgapContext //The AMF maintains a valid UE NGAP context identified by the AMF UE NGAP ID and RAN UE NGAP ID and associated with an active UE-associated logical NG-connection towards the NG-RAN node. + Event hasActiveUeNgapContext //The AMF maintains a valid UE NGAP context identified by the AMF UE NGAP ID and RAN UE NGAP ID and associated with an active UE-associated logical NG-connection towards the NG-RAN node. + Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. + Event hasEstablishedInitialContext //The UE context is established in the gNB after successful Initial Context Setup procedure triggered by the AMF. + Event hasEstablishedPduSessionResourceForTheConcernedPduSessionId //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. + Event hasEstablishedTNL_AssociationToAMF //A transport-layer (SCTP) association between gNB and AMF is established before any NGAP procedures. Event hasNoPduSessionResourceEstablishedForTheConcernedPduSessionId //The AMF does not maintain any established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID, and no NGAP PDU Session Resource Setup procedure is ongoing for that PDU Session ID. - Event hasSentPDU_SESSION_RESOURCE_SETUP_REQUEST //The AMF has transmitted a PDU_SESSION_RESOURCE_SETUP_REQUEST message to the NG-RAN node for the concerned UE and is awaiting the corresponding PDU_SESSION_RESOURCE_SETUP_RESPONSE. - Event hasEstablishedPduSessionResourceForTheConcernedPduSessionId //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. - Event hasSentPDU_SESSION_RESOURCE_RELEASE_COMMAND //The AMF has transmitted a PDU_SESSION_RESOURCE_RELEASE_COMMAND message to the NG-RAN node for the concerned UE and is awaiting the corresponding PDU_SESSION_RESOURCE_RELEASE_RESPONSE. - Event isNotRegisteredToAMF //The UE has no active 5G registration with the AMF. - Event hasEstablishedInitialContext //The UE context is established in the gNB after successful Initial Context Setup procedure triggered by the AMF. - Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. - Event hasNotEstablished_NG_C_AssociationToAMF //No NG-C (NGAP) association exists between the gNB and AMF. - Event hasEstablishedTNL_AssociationToAMF //A transport-layer (SCTP) association between gNB and AMF is established before any NGAP procedures. - Event isRegisteredToAMF //The UE has completed the 5G Registration procedure and received a Registration Accept from the AMF. - Event initiatesPduSessionResourceModificationToAddQoSFlow //AMF initiates PDU_SESSION_RESOURCE_MODIFY_REQUEST to add the QoS flow for already established PDU session. - Event processTheUENasDeregistration //UE performs the NAS Deregistration signalling to release its registration and associated contexts from the AMF. + Event hasNotEstablished_NG_C_AssociationToAMF //No NG-C (NGAP) association exists between the gNB and AMF. + Event hasSentPDU_SESSION_RESOURCE_RELEASE_COMMAND //The AMF has transmitted a PDU_SESSION_RESOURCE_RELEASE_COMMAND message to the NG-RAN node for the concerned UE and is awaiting the corresponding PDU_SESSION_RESOURCE_RELEASE_RESPONSE. + Event hasSentPDU_SESSION_RESOURCE_SETUP_REQUEST //The AMF has transmitted a PDU_SESSION_RESOURCE_SETUP_REQUEST message to the NG-RAN node for the concerned UE and is awaiting the corresponding PDU_SESSION_RESOURCE_SETUP_RESPONSE. + Event initiatesPduSessionResourceModificationToAddQoSFlow //AMF initiates PDU_SESSION_RESOURCE_MODIFY_REQUEST to add the QoS flow for already established PDU session. + Event isInCM_CONNECTED //UE is in CM_CONNECTED state + Event isNotRegisteredToAMF //The UE has no active 5G registration with the AMF. + Event isRegisteredToAMF //The UE has completed the 5G Registration procedure and received a Registration Accept from the AMF. + Event processTheUENasDeregistration //UE performs the NAS Deregistration signalling to release its registration and associated contexts from the AMF. + - //TP_GNB NGAP events - Event isRegisteredToAMF //The UE has completed the 5G Registration procedure and received a Registration Accept from the AMF. - Event havingSentPDUSessionEstablishment //The UE has sent a PDU Session Establishment Request and is awaiting the network response. - Event hasEstablishedPDUsession //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. - Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. - Event u_Plane_inactivity_timer_expires //The user-plane inactivity timer expires when no uplink or downlink user-plane traffic is detected for a configured duration. - Event hasSuccessfullyEstablishedTNLconnection //A transport network layer (TNL) connection is successfully established after completion of the SCTP association setup between the gNB and the AMF. - + Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. + Event hasEstablishedPDUsession //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. + Event hasSuccessfullyEstablishedTNLconnection //A transport network layer (TNL) connection is successfully established after completion of the SCTP association setup between the gNB and the AMF. + Event havingSentPDUSessionEstablishment //The UE has sent a PDU Session Establishment Request and is awaiting the network response. + Event isRegisteredToAMF //The UE has completed the 5G Registration procedure and received a Registration Accept from the AMF. + Event u_Plane_inactivity_timer_expires //The user-plane inactivity timer expires when no uplink or downlink user-plane traffic is detected for a configured duration. // NGAP messages //Table 8.1-1 diff --git a/test_purposes/NGNAS_Common.tdltx b/test_purposes/NGNAS_Common.tdltx index 9a16d21..56e832e 100644 --- a/test_purposes/NGNAS_Common.tdltx +++ b/test_purposes/NGNAS_Common.tdltx @@ -10,10 +10,9 @@ Package NGNAS_Common { connect GNB::g to IUT::g } - //TP AMF NGNAS events - Event isInOverloadedState // The AMF is in an overload condition and overload control procedures are active. - Event indicateUEdeactivation // The UE is administratively deactivated in the 5GC. - Event indicateUEderegistration // The UE is administratively de-registered in the 5GC. + Event isInOverloadedState //The AMF is in an overload condition and overload control procedures are active. + Event indicateUEdeactivation //The UE is administratively deactivated in the 5GC. + Event indicateUEderegistration //The UE is administratively de-registered in the 5GC. // This template may be used as default AUTHENTICATION REQUEST message within a DOWNLINK NAS TRANSPORT message. */ -- GitLab From 21c79ac95f0797ae9c0214c36567f951dde458ee Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 12 Jun 2026 09:00:42 +0000 Subject: [PATCH 140/151] Comment added back --- test_purposes/NGAP_Common.tdltx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_purposes/NGAP_Common.tdltx b/test_purposes/NGAP_Common.tdltx index dcf0a86..a6c97f9 100644 --- a/test_purposes/NGAP_Common.tdltx +++ b/test_purposes/NGAP_Common.tdltx @@ -53,7 +53,7 @@ Package NGAP_Common { Event processTheUENasDeregistration //UE performs the NAS Deregistration signalling to release its registration and associated contexts from the AMF. - + //TP_gNB NGAP events Event hasEstablished_NG_C_AssociationToAMF //An NG-C (NGAP) association exists between the gNB and AMF, reached after successful NG Setup procedure. Event hasEstablishedPDUsession //The AMF maintains an established PDU Session Resource in the UE NGAP context for the concerned PDU Session ID following a successful PDU Session Resource Setup procedure. Event hasSuccessfullyEstablishedTNLconnection //A transport network layer (TNL) connection is successfully established after completion of the SCTP association setup between the gNB and the AMF. -- GitLab From 2c1d97f6f07fe0641c9c67903778faa38705c3b1 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 12 Jun 2026 09:01:22 +0000 Subject: [PATCH 141/151] Comment added back --- test_purposes/NGNAS_Common.tdltx | 1 + 1 file changed, 1 insertion(+) diff --git a/test_purposes/NGNAS_Common.tdltx b/test_purposes/NGNAS_Common.tdltx index 56e832e..dd893f1 100644 --- a/test_purposes/NGNAS_Common.tdltx +++ b/test_purposes/NGNAS_Common.tdltx @@ -10,6 +10,7 @@ Package NGNAS_Common { connect GNB::g to IUT::g } + //TP AMF NGNAS events Event isInOverloadedState //The AMF is in an overload condition and overload control procedures are active. Event indicateUEdeactivation //The UE is administratively deactivated in the 5GC. Event indicateUEderegistration //The UE is administratively de-registered in the 5GC. -- GitLab From 2028ee8b3813a80c7cc199923ee6196fe5f423af Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 12 Jun 2026 11:21:09 +0200 Subject: [PATCH 142/151] Enhance TC_NGAP_AMF_PDU_01_02 --- captures/TC_NGAP_AMF_IMP_01_02.pcap | Bin 16858 -> 5086 bytes captures/TC_NGAP_AMF_PDU_01_02.pcap | Bin 0 -> 5606 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 84 +++++++++--------------- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 42 +++++++----- 5 files changed, 56 insertions(+), 74 deletions(-) create mode 100644 captures/TC_NGAP_AMF_PDU_01_02.pcap diff --git a/captures/TC_NGAP_AMF_IMP_01_02.pcap b/captures/TC_NGAP_AMF_IMP_01_02.pcap index 9180d5a2e9177fe11d1d4613bb3900b9b33bc107..d4971adee8862b2522383a1f173fcc08ff7f4b50 100644 GIT binary patch literal 5086 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 XfdynjD_#?3xPVN+-m>OnU|<0N_E?@u literal 0 HcmV?d00001 diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index e7acbb2..de66256 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -112,7 +112,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify that the IUT can send a PDU SESSION RESOURCE SETUP REQUEST with at least one PDU session resource list to established PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_01 # Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_SETUP_RESPONSE message and completes the PDU Session Resource Setup procedure for a single PDU_Session_Resource. -#NGAP_TestCases.TC_NGAP_AMF_PDU_01_02 +NGAP_TestCases.TC_NGAP_AMF_PDU_01_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. #NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_RELEASE_RESPONSE message and completes the PDU Session Resource Release procedure for a single PDU_Session_Resource. @@ -184,7 +184,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify that the AMF node successfully processes a RAN_CONFIGURATION_UPDATE message containing new slice with RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE to acknowledge the update with supported slice at AMF. #NGAP_TestCases.TC_NGAP_AMF_IMP_05 # Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request. -NGAP_TestCases.TC_NGAP_AMF_IMP_06 +#NGAP_TestCases.TC_NGAP_AMF_IMP_06 # Verify that the IUT can send a AMF CONFIGURATION UPDATE message to the AMF. #NGAP_TestCases.TC_NGAP_AMF_IMP_07 # Verify that the AMF node successfully processes a NG RESET message that contains mandatory IEs and answers with NG RESET ACKNOWLEDGE to acknowledge the reset. diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 5fd37b4..9feaf85 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -3922,65 +3922,41 @@ module NGAP_TCFunctions { f_recv_NGAP_PDU( mw_ngap_initMsg( - mw_n2_PDUSessionResourceSetupRequest( - vc_AMF_UE_ID, - vc_RAN_UE_ID + f_mw_n2_PDUSessionResourceSetupRequest( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + -, + ?, + { + mw_pDUSessionResourceSetupItemSUReq( + PX_PDU_SESSION_ID, + mw_s_NSSAI( + PX_SST/*, + PX_SD, + -*/ + ), + decmatch( + mw_pDUSessionResourceSetupRequestTransfer( + mw_pDUSessionResourceSetupRequestTransfer_mandatories( + -, + mw_pDUSessionType, + { + *, + mw_qosFlowSetupRequestItem( + 1, + mw_qosFlowLevelQosParameters( + mw_qosCharacteristics_nonDynamic5QI + )), + * + } + )))) + } ))); - var integer numOfIEs := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs) - log("*** " & __SCOPE__ & ": DBG: numOfIEs: ", numOfIEs, " ***"); - for (var integer i :=0 ; i < numOfIEs; i := i + 1) { // Loop over the protocolIEs found - if ((vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].id) == 74 /*id_NAS_PDU*/) { - var integer numOfItems := lengthof(vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq) - log("*** " & __SCOPE__ & ": DBG: Number of items in pDUSessionResourceSetupListSUReq: ", numOfItems); - if (numOfItems > 0) { - vc_pdu_session_resource_setup_list_su_req := vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq; - for (var integer j :=0; j < numOfItems; j := j + 1) { // Loop over the PDUSessionResourceSetupListSUReq items - log("*** " & __SCOPE__ & ": DBG: pDUSessionNAS_PDU of item ", j, ": ", vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU); - var NG_NAS_DL_Message_Type v_message; - if (f_Check_5GAKA_NAS_DL_Message( - vc_recvNGAP_PDU.initiatingMessage.value_.pDUSessionResourceSetupRequest.protocolIEs[i].value_.pDUSessionResourceSetupListSUReq[j].pDUSessionNAS_PDU, - mw_NG_DL_NAS_TRANSPORT, - vc_ng_nas_security_params_type, - vc_previous_nas_count_dl, - v_message, - vc_inner_message - ) == false) { - log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); - setverdict(fail); - } else { - log("*** " & __SCOPE__ & ": DBG: v_message.dl_Nas_Transport ", v_message.dl_Nas_Transport); - var bitstring v_bs := oct2bit(v_message.dl_Nas_Transport.payload.payload); - var NG_PDU_SESSION_ESTABLISHMENT_ACCEPT v_ng_pdu_session_establishment_accept; - if (decvalue(v_bs, v_ng_pdu_session_establishment_accept) != 0) { - log("*** " & __SCOPE__ & ": INCONC: Failed to decode dl_Nas_Transport payload ***"); - setverdict(inconc); - } else { - log("*** " & __SCOPE__ & ": DBG: v_ng_pdu_session_establishment_accept: ", v_ng_pdu_session_establishment_accept); - var NG_NAS_DL_Message_Type v_expected_message; - v_expected_message.pdu_Session_Establishment_Accept := v_ng_pdu_session_establishment_accept; - if (not(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI))) { - log(match(v_expected_message, mw_NG_PDU_SESSION_ESTABLISHMENT_ACCEPT_noPTI)); // Log mismatch - log("*** " & __SCOPE__ & ": FAIL: NG_PDU_SESSION_ESTABLISHMENT_ACCEPT mismatch. ***"); - setverdict(fail); - } else { - log("*** " & __SCOPE__ & ": PASS: Expected NG_PDU_SESSION_ESTABLISHMENT_ACCEPT ***"); - setverdict(pass); - } - } - } - } // End of 'for' statement - } else { - log("*** " & __SCOPE__ & ": FAIL: No items in pDUSessionResourceSetupListSUReq. ***"); - setverdict(fail); - } - break; // Break the loop as the relevant IE has been processed - } - } // End of 'for' statement + f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); // Postamble - f_NGAP_amf_UE_PDU_SessionResourceSetupResponse(); // f_send_pdu_session_resource_setup_response f_postamble_NGAP_AMF(); f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index a17301c..a445957 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -15153,8 +15153,8 @@ module LibNGAP_Templates { } // End of template m_qMCDeactivation template (value) QosCharacteristics m_qosCharacteristics_nonDynamic5QI( - in template (value) NonDynamic5QIDescriptor p_nonDynamic5QI - ) := { + in template (value) NonDynamic5QIDescriptor p_nonDynamic5QI + ) := { nonDynamic5QI := p_nonDynamic5QI } // End of template m_qosCharacteristics_nonDynamic5QI @@ -15165,8 +15165,8 @@ module LibNGAP_Templates { } // End of template m_qosCharacteristics_dynamic5QI template (value) QosCharacteristics m_qosCharacteristics_choice_Extensions( - in template (value) QosCharacteristics.choice_Extensions p_choice_Extensions - ) := { + in template (value) QosCharacteristics.choice_Extensions p_choice_Extensions + ) := { choice_Extensions := p_choice_Extensions } // End of template m_qosCharacteristics_choice_Extensions @@ -22094,8 +22094,8 @@ module LibNGAP_Templates { } // End of template mw_pDUSessionResourceSetupItemSUReq template (present) PDUSessionResourceSetupItemSUReq.iE_Extensions mw_pDUSessionResourceSetupItemSUReq_id_PduSessionExpectedUEActivityBehaviour( - template (present) ExpectedUEActivityBehaviour p_expectedUEActivityBehaviour := ? - ) := { + template (present) ExpectedUEActivityBehaviour p_expectedUEActivityBehaviour := ? + ) := { { id := id_PduSessionExpectedUEActivityBehaviour, criticality := ignore, @@ -22120,10 +22120,21 @@ module LibNGAP_Templates { } // End of template mw_pDUSessionResourceSetupRequestTransfer template (present) PDUSessionResourceSetupRequestTransfer.protocolIEs mw_pDUSessionResourceSetupRequestTransfer_mandatories( + template (present) PDUSessionAggregateMaximumBitRate p_pDUSessionAggregateMaximumBitRate := ?, template (present) PDUSessionType p_pDUSessionType := ?, template (present) QosFlowSetupRequestList p_qosFlowSetupRequestList := ?, template (present) UPTransportLayerInformation p_uPTransportLayerInformation := ? ) := { + { + id := id_PDUSessionAggregateMaximumBitRate, + criticality := reject, + value_ := { PDUSessionAggregateMaximumBitRate := p_pDUSessionAggregateMaximumBitRate } + }, + { + id := id_UL_NGU_UP_TNLInformation, + criticality := reject, + value_ := { UPTransportLayerInformation := p_uPTransportLayerInformation } + }, { id := id_PDUSessionType, criticality := reject, @@ -22133,11 +22144,6 @@ module LibNGAP_Templates { id := id_QosFlowSetupRequestList, criticality := reject, value_ := { QosFlowSetupRequestList := p_qosFlowSetupRequestList } - }, - { - id := id_UL_NGU_UP_TNLInformation, - criticality := reject, - value_ := { UPTransportLayerInformation := p_uPTransportLayerInformation } } } // End of template mw_pDUSessionResourceSetupRequestTransfer_mandatories @@ -22891,11 +22897,11 @@ module LibNGAP_Templates { } // End of template mw_qosFlowPerTNLInformationItem template (present) QosFlowSetupRequestItem mw_qosFlowSetupRequestItem( - template (present) QosFlowIdentifier p_qosFlowIdentifier := ?, - template (present) QosFlowLevelQosParameters p_qosFlowLevelQosParameters := ?, - template E_RAB_ID p_e_RAB_ID := *, - template QosFlowSetupRequestItem.iE_Extensions p_iE_Extensions := * - ) := { + template (present) QosFlowIdentifier p_qosFlowIdentifier := ?, + template (present) QosFlowLevelQosParameters p_qosFlowLevelQosParameters := ?, + template E_RAB_ID p_e_RAB_ID := *, + template QosFlowSetupRequestItem.iE_Extensions p_iE_Extensions := * + ) := { qosFlowIdentifier := p_qosFlowIdentifier, qosFlowLevelQosParameters := p_qosFlowLevelQosParameters, e_RAB_ID := p_e_RAB_ID, @@ -22903,8 +22909,8 @@ module LibNGAP_Templates { } // End of template mw_qosFlowSetupRequestItem template (present) QosFlowSetupRequestItem.iE_Extensions mw_qosFlowSetupRequestItemw_id_TSCTrafficCharacteristics( - template (present) TSCTrafficCharacteristics p_tSCTrafficCharacteristics := ? - ) := { + template (present) TSCTrafficCharacteristics p_tSCTrafficCharacteristics := ? + ) := { { id := id_TSCTrafficCharacteristics, criticality := ignore, -- GitLab From cd6072f1089247c8c5f1e69ce7ce263bd7bd8cce Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 12 Jun 2026 10:47:46 +0000 Subject: [PATCH 143/151] Missing PICS4_6_1_2 added in PICS list and to the test --- ttcn/AtsNGAP/NGAP_Pics.ttcn | 2 ++ ttcn/AtsNGAP/NGAP_TestCases.ttcn | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ttcn/AtsNGAP/NGAP_Pics.ttcn b/ttcn/AtsNGAP/NGAP_Pics.ttcn index 4706723..dd0567b 100644 --- a/ttcn/AtsNGAP/NGAP_Pics.ttcn +++ b/ttcn/AtsNGAP/NGAP_Pics.ttcn @@ -108,6 +108,8 @@ module NGAP_Pics { modulepar boolean PICS_A4_5_2 := false; //AMF - Transport of NAS Messages Procedures - DOWNLINK NAS TRANSPORT modulepar boolean PICS_A4_5_5 := false; //AMF - Transport of NAS Messages Procedures - REROUTE NAS REQUEST modulepar boolean PICS_A4_6_1 := false; //AMF - Interface Management Procedures - NG SETUP REQUEST + modulepar boolean PICS_A4_6_1_1 := false; //AMF - Rejection of an unacceptable NG SETUP REQUEST message with an NG SETUP FAILURE message + modulepar boolean PICS_A4_6_1_2 := false; //AMF - IAB modulepar boolean PICS_A4_6_2 := false; //AMF - Interface Management Procedures - RAN CONFIGURATION UPDATE modulepar boolean PICS_A4_6_3 := false; //AMF - Interface Management Procedures - AMF CONFIGURATION UPDATE modulepar boolean PICS_A4_6_4 := false; //AMF - Interface Management Procedures - NG RESET diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 767df79..72f48a3 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF033 + * @author ETSI / TTF T033/T048 * @version $URL$ * $Id$ * @desc This module provides test cases for NGAP tests. @@ -3002,8 +3002,8 @@ module NGAP_TestCases { var aMFNGAPComponent v_ngap_gnb; // Test control - if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1)){ - log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1' shall be set to true for executing the TC. ***"); + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_6_1) and (not PICS_A4_6_1_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_6_1 and PICS_A4_6_1_2' shall be set to true for executing the TC. ***"); stop; } -- GitLab From 11d8d874cd4f3bbd057530967e79d013efb682bd Mon Sep 17 00:00:00 2001 From: juvancic Date: Fri, 12 Jun 2026 13:19:35 +0200 Subject: [PATCH 144/151] IABSupport --- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 8 +++-- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 47 +++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 9feaf85..acc282a 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -5606,9 +5606,10 @@ module NGAP_TCFunctions { PX_PAGING_DRX ))); // Await NGSetupResponse + f_recv_NGAP_PDU( mw_ngap_succMsg( - mw_n2_NGSetupResponse( + mw_n2_NGSetupResponse_iab( mw_aMFName(PX_AMF_NAME), { *, @@ -5616,8 +5617,9 @@ module NGAP_TCFunctions { mw_gUAMI( fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) )), - * - } + * + + },-,-,m_iAB_Supported(-) ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index a445957..060dc3b 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -6302,6 +6302,53 @@ module LibNGAP_Templates { } } // End of template mw_n2_NGSetupResponse_ExtAmfName +/** + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.6.2 NG SETUP RESPONSE + */ + template (present) SuccessfulOutcome mw_n2_NGSetupResponse_iab( + template (present) AMFName p_amfName := ?, + template (present) ServedGUAMIList p_servedGUAMIList := ?, + template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + template (present) PLMNSupportList p_plmnSuppList := ?, + template (present) IAB_Supported p_iab_s:=? + ) := { + procedureCode := id_NGSetup, + criticality := reject, + value_ := { + NGSetupResponse := { + protocolIEs := { + *, + { + id := id_AMFName, + criticality := reject, + value_ := { AMFName := p_amfName } + }, + { + id := id_ServedGUAMIList, + criticality := reject, + value_ := { ServedGUAMIList := (p_servedGUAMIList,*) } + }, + { + id := id_RelativeAMFCapacity, + criticality := ignore, + value_ := { RelativeAMFCapacity := p_relativeAmfCap } + }, + { + id := id_PLMNSupportList, + criticality := reject, + value_ := { PLMNSupportList := p_plmnSuppList } + }, + { + id := id_IAB_Supported, + criticality := reject, + value_ := { IAB_Supported := p_iab_s } + }, + * + } + } + } + } // End of template mw_n2_NGSetupResponse_iab + } // End of group Receive } // End of group NG_SETUP_RESPONSE -- GitLab From f9222f4a10ef1cb957101437242b50648ce6a13b Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 15 Jun 2026 08:39:03 +0200 Subject: [PATCH 145/151] Adding TC_NGAP_AMF_PDU_02_02 in NGAP_TestCases.ttcn --- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 72f48a3..5acc717 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -2136,6 +2136,33 @@ module NGAP_TestCases { } // End of testcase TC_NGAP_AMF_PDU_02 + /** + * @desc "Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_RELEASE_RESPONSE message and completes the PDU Session Resource Release procedure for a single PDU_Session_Resource." + */ + testcase TC_NGAP_AMF_PDU_02_02() runs on aMFNGAPComponent system TestAdapter { + + // Local variables + var aMFNGAPComponent v_ngap_gnb; + + // Test control + if ((not PICS_NGAP_AMF_IUT) and (not PICS_A4_1_2)){ + log("*** " & __SCOPE__ & ": ERROR: 'PICS_NGAP_AMF_IUT and PICS_A4_1_2' shall be set to true for executing the TC. ***"); + stop; + } + + // Test component configuration + f_cf_NGAP_aMF_Up(v_ngap_gnb); + + // Start + v_ngap_gnb.start(f_TC_NGAP_AMF_PDU_02_02()); + + // synchronize PTC on 1 sychronization points + f_serverSyncNClientsAndStop(1, {c_prDone, c_tbDone, c_poDone}); + + f_cf_Down/*gNBoraMF*/(); + + } // End of testcase TC_NGAP_AMF_PDU_02_02 + } // End of group PDU_Session_Resource_Release //8.2.3 group PDU_Session_Resource_Modify{ -- GitLab From 7b68834f6d2d7bd1669f23cdff7296328a84a3dd Mon Sep 17 00:00:00 2001 From: garciay Date: Mon, 15 Jun 2026 11:16:08 +0200 Subject: [PATCH 146/151] Execute TC_NGAP_GNB_PDU_01 & TC_NGAP_GNB_IMP_05/05_02 --- captures/TC_NGAP_GNB_CMP_07.pcap | Bin 0 -> 1472 bytes captures/TC_NGAP_GNB_IMP_05.pcap | Bin 1796 -> 1318 bytes captures/TC_NGAP_GNB_PDU_01.pcap | Bin 2140 -> 2712 bytes etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ | 6 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 94 ++++++++---------- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 9 ++ .../LibNGAP/lib_system/LibNGAP_Functions.ttcn | 84 ++++++++-------- 7 files changed, 96 insertions(+), 97 deletions(-) create mode 100644 captures/TC_NGAP_GNB_CMP_07.pcap diff --git a/captures/TC_NGAP_GNB_CMP_07.pcap b/captures/TC_NGAP_GNB_CMP_07.pcap new file mode 100644 index 0000000000000000000000000000000000000000..fc6503cf32cb3431028d8aeed986a14a0169bdde GIT binary patch literal 1472 zcmca|c+)~A1{MYcU}0cnU|>++tDiO1l#L;XfdPyW@(c_d46aNJE({C~3=S zYz#(>3}6h?3!*_bFseXou=WF)4zgt$PtRVksSFGZObm=H$8K`ph1no;Kjc3HJHw02 z$6o@T*F0JISfs5gP$bA_m zhMv73`(X0OG|x0p=rAxeFfpj`zB-n&|BtfC-?>T3QM($#yl&s)@qO5p!8zILXr$VO zE6Dorv55&SWc|n?xYd-6L5z_BjFHuVLy&`k5fn$(nIPYQLJ<^4;80@#Ma#$tEl@f; z0!n8L3=BrdLBs$}$|~$UXre*rKPU9fvzD# z8Urs#CnHEP*vX;}j1JHos%y^1V8_4!#vny740e^lwLXxmQa6KQ9^^9Q{KL$^AOLn1 zo&#lQf@ATbyQo0fB}A8c9~Hq#iG89c!`5UNE%l))6_M@9xd)`t9o z)I8JlV%@~tGy{eN1`Y<0PnZ}S7{VMF|1$(QaD(^^3<4Ys44hDZeY3;oF9v3iOKj{x zege4$IaP!F1$GJJ{No_UXz$g}Y7Ay$=we_1V~`jOgZ)**zydPO`V%(O7?>Gi3?%kX z0vCx43^ok>4jv2)tPG)`@`piK6>J#r z-V0eDJ~lC-g{&Vr1Y>`3F^DlTfHATfa0qfRFoNR9Iuqm@P$+`p2pnn*plBHxp#@53 zIiPgLz`$UH97GJzlnhO0HdxacH#DX0|INkF#=ro^$cBKznW2J#2^`Kpu!S=NGeami z{X?|bFo-fZGBB_(NHcIU%>2n7z`(%3$PnZp&czVw8sz8~?CGnUo|mL+X=$lzZlG(( zkjB6Z(#Z%?40f`p1ET{pho1Y*#bC$40LCCiFbsB;!ATB~tBNf_F%NPXa{ggvU=RSi zigEsKkSG6!8s7BMM0Fo6y!%n20qq? z{DRax)AVB9#N0Fkh6Dx<29Qsf7#tYF92oyI1UPVm_zVmJ91IMcP=6g|;s*N(DZ$0S#jxKaScZwA zF&|_fOdgr$nFb0S28ISE29@Y&-=&tH90hCi%sdoQtAFi2EcZ|2c1$Q+-^9oBIA_g5 z)`yQxOlTqNM-D+lGgbyMMg}lORs#+}4hBY099d_Ad;C6_C z&KMXNjF5wf0h*Gb>C6UeI^%|>)Jk(!hBgKUFh({66wVA43{2o~{(&u=8JHPD!Ra5O z&4xjg!I6Q1g+ZEulVRph_5cP321bS;2XQWjP}d+wzhF;a-SoU9T}w+#U2_9nLxwa4 zUXV^kkYcctMI9I&pgFX~oRz_jfdPy`ieMP*Dg%kTAXh1;f?^)zGUWWj%)lT3b`|6N z-5_0{PG6!8s7BMM0Fo6y!%n20qq?{DRax z)AVB9#N0Fkh6Dx<29Qsf7#tYF92oyI1UPVm_zVmJ91IMcP=CF#X9fESbASGGH;8@AP%Q*8VJIqu8J(dq2K73%P zWDpL32t%We@$J;PH4IS>j1mk54vY*SmzA#IU`S$M0ArYb5Dj)&h{S!6%alR>WCghn zOZ-g%mwzBF%nV90!5#;|sR_gvVc-LmlKc)#3=9krU=M(7oOP5NU&yk8Y_zcj*@h!z z55Q~`kbj-IO_+zljDZ1+L6*WW*!>y|Y+%z|u$jirz`y}=FUXV|!aU%di9L5pJOG)Z noCk6b$Ry-Y;9y{20h#a|uL%t7AQNodLApVvAg32T1_l-YNOw3g diff --git a/captures/TC_NGAP_GNB_PDU_01.pcap b/captures/TC_NGAP_GNB_PDU_01.pcap index 88b1475d983dc9bde05e168a5879619ea555da34..c9fab3320cd7c251f76a260f79bd95fd2c452aa7 100644 GIT binary patch literal 2712 zcmca|c+)~A1{MYcU}0cnU|_hlO+V|wY#xRn1_m%j$TKi-Ft{=?xG*p{FgUc>=+!eY zFxE3Luuj=EjR&TRk%2*_nb%?#1LFb)1}+A!Z!<1@XW(IAV_;=qXkcJqIl#cc0b{A z-c@9M_}IjR7P5Zi5R{+8!yv}U0LI8_z#+)NzzB*X>r9YuK%oeVBXFoOfTCq&gcc~B zIe^j`0|SE*au6{~Y(80=(G2Sx{I4$Yd+!(hk20LCCiFbsB;fuaq_RnlyrmP2gd&l0S??CJ_CaQ2Ll5q)L*Ha@cD~@8RQZh zdyt<%u0c-KAb){f!Z`mp$T9b~>1SE);b!P!U;tx~7z~5`Rl~pnGR^uEHq#iG8DhT8 zxbOp9Br-7AFz`EgFfgz(go4T+1~mpL$vOtdN(NrWnLpWKrV8k>eE9I;14AW)Z~#OY z8g-0sZ<)q3L^&`@Fcdg2GJssBBFMuqiGcx(VfsNd*kvt>b|9BYZ2$an`XXZu430S-*xW$ zO%(*DzRGbic5Yy>dJy!&*u=z&0qjCqVSFxRU;x#YF2E!gU2aJqx!VFyQ%8``uATqI2CthDrx)p$Q7Z>DoLDbqow( z4DvV(gTt^u(H`VNsly=Gfn13t41XfI&^GrK|8sEl0y2ihK@&3!#YF3v6+cTGGSo4| zGBJST`k@&k69Xi?4(RYO>|$U5V~`Or40g>L1~!mutPg-(0&)?S@OqBqn(A*eF8pF( z1VtDFD7?}!!^_sDj-^_wEs3FyA+DT()3vxEQL!~K@M9r^GM1z%z{mheo%&3SjKPcy zID!=%^UW?i438KXz!>HW5DoUp6-5V-Po&~Nz5w|KOSt|*^2w6iSNty+K!FJ|f{&r0 zA5{1vN4*RKJE$B0l?x0Etf1gzU?^wclwsgwU}s=%U|@)2P>4I}_cWjVK=z;F9pS8r z)^lyy6DFxVbpGfbv8?-c;Y~&cB?k`Yg2qJE|NjFS)Eu<6>X^H-Gy@sy7@Qax%NaOJ zn-dfpQv*MK3}JDc`IB9giIGu}nU{efj&TwwCC!fEVMt){wFrREEQB z1JPg`4HO+gHcEqAS0G!lgz;~fjUdzZSVPKgP#F#~1%|<<1*FycG~2{R-MqOuV8sj!3``7+EE-j&Mlg-Z#S7vY*co2L?C3x7 zC^x+;)kG!AdCSq05`MWmpmxD2BhxC452tQ$!35Z!s=8$4ub1Fr;9`hhP@K%fFgK^3 zfq`*yBBRJ;14bT&U+bc6?Q3HE7+7@oZZh6oQq>>8BhmSR?NAm&t^Zf?*^?6)l_wW4 zvWj5y&g2=4Dq!!2oo1VSm{B_hk;P_Rx$^0zRDjoe`eP!76F)%ZDf}(%2ABzjvvddS& zmQCKmBA|)vDv$*rg$#`IkAp0*J;IvxP?>|Fi-Ccm3*Jb;V>gR(FvNPJ0=m92g}S3LF?2Kn6wCaZGMxl{V>^05V~7EJ!!V6f8bm0Zz0a z7cesfB^NJ9n0$fNhaF_dwtBE3lkM09RFJKPx;z0%V~B@(>dMJQY@Pxeoc4nBnoQ+j zsAFJYr~~=Lw4h@m*c}CU+_4hLINRjn1&NbI*e!TLX7NquVA#dLz_1Hs*5q7vL2Rx` zMABaEp`N;G@*?&EK~TVej5xo9gTah}fx!%9gsMizB(QU~V{;B00|N&G4+9GTvI`oC diff --git a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ index db00351..abfe52e 100644 --- a/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_GNB_ueransim.cfg_ @@ -118,7 +118,7 @@ system.NGAP_gNB_1.params := "NGAP/SCTP(local_server=127.0.0.5,server_mode=1,loca #AtsImsIot_TestControl.control # Verify that the GNB successfully processes a PDU_SESSION_RESOURCE_SETUP_REQUEST and answers with PDU_SESSION_RESOURCE_SETUP_RESPONSE for successfully established PDU session. -NGAP_TestCases.TC_NGAP_GNB_PDU_01 +#NGAP_TestCases.TC_NGAP_GNB_PDU_01 ## Verify that the NG-RAN node reports the establishment of the corresponding PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains several PDU Session ID IEs set to the same value. ##NGAP_TestCases.TC_NGAP_GNB_PDU_02 ## Verify that the NG-RAN node reports the establishment of the new PDU session as failed if a PDU SESSION RESOURCE SETUP REQUEST contains a PDU Session ID IE set to value that identifies an active PDU Session. NOTE: Run TP_NGAP_GNB_PDU_01 before this TP. @@ -172,9 +172,9 @@ NGAP_TestCases.TC_NGAP_GNB_PDU_01 ##NGAP_TestCases.TC_NGAP_GNB_NAS_03 ## Verify that the GNB sends an NG_SETUP_REQUEST message to the AMF after TNL establishment. -##NGAP_TestCases.TC_NGAP_GNB_IMP_01 +#NGAP_TestCases.TC_NGAP_GNB_IMP_01 # Verify that the GNB successfully processes a full NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the reset. -#NGAP_TestCases.TC_NGAP_GNB_IMP_05 +NGAP_TestCases.TC_NGAP_GNB_IMP_05 # Verify that the GNB successfully processes a partial NG_RESET message and answers with NG_RESET_ACKNOWLEDGE to acknowledge the partial reset. #NGAP_TestCases.TC_NGAP_GNB_IMP_05_02 diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index acc282a..61d87a3 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -1472,39 +1472,35 @@ module NGAP_TCFunctions { /** * @desc Testcase function for TC_NGAP_GNB_CMP_07 */ - function f_TC_NGAP_GNB_CMP_07() runs on gNBNGAPComponent { + function f_TC_NGAP_GNB_CMP_07() runs on gNBNGAPComponent { - // Preamble + // Preamble f_NGAP_gnb_init(); - f_NGAP_gnb_UE_Register(); - f_NGAP_gnb_UE_InitialContextSetup(); - f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - - - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - - // Test Body - action("Trigger UE context release request"); - + f_NGAP_gnb_UE_Register(); // f_await_NGSetupRequest_send_NGSetupRespone(); + // f_await_registration_request(); + f_NGAP_gnb_UE_Authentication(); // f_send_authentication_request_await_authentication_response + f_NGAP_gnb_UE_SecurityMode(); // f_send_security_mode_command_await_security_mode_complete + f_NGAP_gnb_UE_InitialContextSetup(); // f_send_initial_context_setup_request_await_initial_context_setup_response + f_NGAP_gnb_RegistrationComplete(); //f_await_registration_complete + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UEContextReleaseRequest( - -, - -, - - - ) - )); + // Test Body + action("Trigger UE context release request"); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseRequest( + -, + -, + - + ))); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_GNB_CMP_07 @@ -1518,33 +1514,27 @@ module NGAP_TCFunctions { f_NGAP_gnb_UE_Register(); f_NGAP_gnb_UE_InitialContextSetup(); f_NGAP_gnb_RegistrationComplete(); // f_send_registration_complete - f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); - - - log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - - - // Test Body - action("Trigger UE context release request"); - - - f_recv_NGAP_PDU( - mw_ngap_initMsg( - mw_n2_UEContextReleaseRequest( - -, - -, - - - ) - )); + f_selfOrClientSyncAndVerdict(c_prDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Preamble done. ***"); - f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + // Test Body + action("Trigger UE context release request"); + f_recv_NGAP_PDU( + mw_ngap_initMsg( + mw_n2_UEContextReleaseRequest( + -, + -, + - + + ))); - // Postamble - f_postamble_NGAP_gNB(); - f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); - log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); + f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); + // Postamble + f_postamble_NGAP_gNB(); + f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); + log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); } // End of function f_TC_NGAP_GNB_CMP_07_02 } // End of group UE_Context_Release_Request_NG_RAN_node_initiated diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 060dc3b..a4e1bf2 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -24856,6 +24856,8 @@ module LibNGAP_Templates { } } }; + log("f_m_n2_InitialContextSetupRequest pdu (0): ", pdu); + return pdu; var integer idx := lengthof(pdu.value_.InitialContextSetupRequest.protocolIEs); /* Old AMF */ @@ -24868,6 +24870,7 @@ module LibNGAP_Templates { }; idx := idx + 1; } + log("f_m_n2_InitialContextSetupRequest pdu (1): ", pdu); /* UE Aggregate Maximum Bit Rate */ if (isvalue(p_uEAggregateMaximumBitRate)) { @@ -24879,6 +24882,7 @@ module LibNGAP_Templates { }; idx := idx + 1; } + log("f_m_n2_InitialContextSetupRequest pdu (2): ", pdu); /* Core Network Assistance Information for RRC INACTIVE */ if (isvalue(p_coreNetworkAssistanceInformationForInactive)) { @@ -24890,6 +24894,7 @@ module LibNGAP_Templates { }; idx := idx + 1; } + log("f_m_n2_InitialContextSetupRequest pdu (3): ", pdu); /* GUAMI */ pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := @@ -24931,6 +24936,7 @@ module LibNGAP_Templates { }; idx := idx + 1; + log("f_m_n2_InitialContextSetupRequest pdu (4): ", pdu); /* Security Key */ pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := { @@ -24951,6 +24957,7 @@ module LibNGAP_Templates { idx := idx + 1; } + log("f_m_n2_InitialContextSetupRequest pdu (5): ", pdu); /* Mobility Restriction List */ if (isvalue(p_mobilityRestrictionList)) { pdu.value_.InitialContextSetupRequest.protocolIEs[idx] := @@ -25005,6 +25012,7 @@ module LibNGAP_Templates { }; idx := idx + 1; } + log("f_m_n2_InitialContextSetupRequest pdu (6): ", pdu); /* Emergency Fallback Indicator*/ if (isvalue(p_emergencyFallbackIndicator)) { @@ -25148,6 +25156,7 @@ module LibNGAP_Templates { /* ... TODO: lots other optional IEs ... */ + log("<<< f_m_n2_InitialContextSetupRequest pdu: ", pdu); return pdu; } // End of function f_m_n2_InitialContextSetupRequest diff --git a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn index 9638963..61dbd29 100644 --- a/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn +++ b/ttcn/LibNGAP/lib_system/LibNGAP_Functions.ttcn @@ -1175,51 +1175,51 @@ module LibNGAP_Functions { Access_3GPP, tsc_KDF_HMAC_SHA_256 ); - log("v_k_gnb: ", v_k_gnb); + log("v_k_gnb: ", bit2oct(v_k_gnb)); // 4. Send InitialContextSetupRequest - var InitiatingMessage v_initialContextSetupRequest := valueof( - f_m_n2_InitialContextSetupRequest( - vc_AMF_UE_ID, - vc_RAN_UE_ID, - -, -, -, - m_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_AMF_REGION_ID, - PX_AMF_SET_ID, - PX_AMF_POINTER - ), - -, - { - m_allowedNSSAI_Item( - m_s_NSSAI('00'O, '000000'O) - ) - }, - m_uESecurityCapabilities, - v_k_gnb, - -, -, -, -, -, - vc_sendNAS_PDU - )); + // FIXME Issue with function: Dynamic test case error: Creating a template from an unbound integer value // var InitiatingMessage v_initialContextSetupRequest := valueof( - // m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( - // vc_AMF_UE_ID, - // vc_RAN_UE_ID, - // m_gUAMI( - // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - // PX_AMF_REGION_ID, - // PX_AMF_SET_ID, - // PX_AMF_POINTER - // ), - // { - // m_allowedNSSAI_Item( - // m_s_NSSAI('00'O, '000000'O) - // ) - // }, - // m_uESecurityCapabilities, - // v_k_gnb, - // -, - // vc_sendNAS_PDU + // f_m_n2_InitialContextSetupRequest( + // vc_AMF_UE_ID, + // vc_RAN_UE_ID, + // -, -, -, + // m_gUAMI( + // fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + // PX_AMF_REGION_ID, + // PX_AMF_SET_ID, + // PX_AMF_POINTER + // ), + // -, + // { + // m_allowedNSSAI_Item( + // m_s_NSSAI('00'O, '000000'O) + // ) + // }, + // m_uESecurityCapabilities, + // v_k_gnb, + // -, -, -, -, -, + // vc_sendNAS_PDU // )); - + var InitiatingMessage v_initialContextSetupRequest := valueof( + m_n2_InitialContextSetupRequest_noPDUSessionResourceSetupListCxtReq( + vc_AMF_UE_ID, + vc_RAN_UE_ID, + m_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_AMF_REGION_ID, + PX_AMF_SET_ID, + PX_AMF_POINTER + ), + { + m_allowedNSSAI_Item( + m_s_NSSAI('00'O, '000000'O) + ) + }, + m_uESecurityCapabilities, + v_k_gnb, + -, + vc_sendNAS_PDU + )); vc_initialContextSetupRequest := v_initialContextSetupRequest.value_.InitialContextSetupRequest; log("vc_initialContextSetupRequest: ", vc_initialContextSetupRequest); f_send_NGAP_PDU( -- GitLab From 8084dd5a28bf4d31358444e0c1256aaae6819566 Mon Sep 17 00:00:00 2001 From: garciay Date: Tue, 16 Jun 2026 16:02:48 +0200 Subject: [PATCH 147/151] Validate TC_NGAP_AMF_PDU_02_02 --- captures/TC_NGAP_AMF_PDU_02_02.pcap | Bin 0 -> 9030 bytes etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 130 +++++++++++++++------------ 3 files changed, 74 insertions(+), 60 deletions(-) create mode 100644 captures/TC_NGAP_AMF_PDU_02_02.pcap diff --git a/captures/TC_NGAP_AMF_PDU_02_02.pcap b/captures/TC_NGAP_AMF_PDU_02_02.pcap new file mode 100644 index 0000000000000000000000000000000000000000..15ef3cab66ebeb0956d59c274f343a1bce4c601a GIT binary patch literal 9030 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 Date: Thu, 18 Jun 2026 16:29:46 +0200 Subject: [PATCH 148/151] Review PIXITs; Review TC_NGAP_AMF_IMP_01_xx --- NAS_ETSI.code-workspace | 3 - etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ | 4 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 135 ++++++++-------- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 70 ++++++++- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 174 +++++++++++++++------ ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 33 ++++ 6 files changed, 288 insertions(+), 131 deletions(-) diff --git a/NAS_ETSI.code-workspace b/NAS_ETSI.code-workspace index fd88794..a72cd0f 100644 --- a/NAS_ETSI.code-workspace +++ b/NAS_ETSI.code-workspace @@ -11,9 +11,6 @@ }, { "path": "../UERANSIM" - }, - { - "path": "../osmo-ttcn3-hacks" } ], "settings": { diff --git a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ index 1943ea3..d9470d8 100644 --- a/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ +++ b/etc/AtsNGAP/AtsNGAP_AMF_open5gs.cfg_ @@ -114,7 +114,7 @@ system.NGAP_AMF.params := "NGAP/SCTP(server=127.0.0.5,port=38412,debug=1)" # Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_SETUP_RESPONSE message and completes the PDU Session Resource Setup procedure for a single PDU_Session_Resource. #NGAP_TestCases.TC_NGAP_AMF_PDU_01_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_RELEASE_COMMAND to release PDU session. -NGAP_TestCases.TC_NGAP_AMF_PDU_02 +#NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the IUT successfully receives and processes the PDU_SESSION_RESOURCE_RELEASE_RESPONSE message and completes the PDU Session Resource Release procedure for a single PDU_Session_Resource. #NGAP_TestCases.TC_NGAP_AMF_PDU_02_02 # Verify that the IUT can send a PDU_SESSION_RESOURCE_MODIFY_REQUEST to modify PDU session. @@ -180,7 +180,7 @@ NGAP_TestCases.TC_NGAP_AMF_PDU_02 # Verify that the AMF node successfully processes a NG SETUP REQEST message with optional field UE Retention Information and answers with NG SETUP RESPONSE to acknowledge the setup. #NGAP_TestCases.TC_NGAP_AMF_IMP_03 # Verify that the AMF node successfully processes a NG SETUP REQEST message with different optional fields and answers with NG SETUP RESPONSE to acknowledge the setup. -#NGAP_TestCases.TC_NGAP_AMF_IMP_04 +NGAP_TestCases.TC_NGAP_AMF_IMP_04 # Verify that the AMF node successfully processes a RAN_CONFIGURATION_UPDATE message containing new slice with RAN_CONFIGURATION_UPDATE_ACKNOWLEDGE to acknowledge the update with supported slice at AMF. #NGAP_TestCases.TC_NGAP_AMF_IMP_05 # Verify that the AMF node successfully declines a RAN CONFIGURATION UPDATE message with RAN CONFIGURATION UPDATE FAILURE when the AMF is not able to handle the request. diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index 0604d8d..c00f1f8 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -4121,7 +4121,7 @@ module NGAP_TCFunctions { f_selfOrClientSyncAndVerdict(c_poDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Postamble done. ***"); - } // End of function f_TC_NGAP_AMF_PDU_02_02 + } // End of function f_TC_NGAP_AMF_PDU_02_02 } // End of group PDU_Session_Resource_Release //8.2.3 @@ -5476,8 +5476,8 @@ module NGAP_TCFunctions { { m_sliceSupportItem( m_s_NSSAI( - PX_SST/*, - PX_SD*/ + PX_SST, + PX_SD ) ) }) @@ -5524,41 +5524,45 @@ module NGAP_TCFunctions { // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_GNB_ID - )), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - PX_SD - )) - }) - }) - }, - PX_PAGING_DRX - ))); + m_n2_NGSetupRequest_RanNodeName_ExtRanNodeName( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + PX_RAN_NODE_NAME, + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD + )) + }) + }) + }, + PX_PAGING_DRX, + m_extended_RANNodeName( + "RANNodeNameVisibleString"/*, + oct2unichar(char2oct("NodeName"))*/ // Dynamic test case error: Internal error: While PER-encoding type '@NGAP-PDU-Descriptions.NGAP-PDU': No BER descriptor available for type '@NGAP-IEs.Extended-RANNodeName.rANNodeNameUTF8String' + )))); // Await NGSetupResponse f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_NGSetupResponse( mw_aMFName(PX_AMF_NAME), { - *, - mw_servedGUAMIItem( - mw_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) - )), - * + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * } ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); @@ -5586,44 +5590,44 @@ module NGAP_TCFunctions { // Send NGSetupRequest f_send_NGAP_PDU( m_ngap_initMsg( - m_n2_NGSetupRequest( - m_globalRANNodeID_globalGNB_ID( - m_ie_globalGnbId( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - PX_GNB_ID - )), - { - m_supportedTAItem( - PX_TACode, - { - m_ie_broadcastPLMNItem( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), - { - m_sliceSupportItem( - m_s_NSSAI( - PX_SST, - PX_SD - )) - }) - }) - }, - PX_PAGING_DRX + m_n2_NGSetupRequest_RanNodeName( + m_globalRANNodeID_globalGNB_ID( + m_ie_globalGnbId( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + PX_GNB_ID + )), + -, + { + m_supportedTAItem( + PX_TACode, + { + m_ie_broadcastPLMNItem( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC), + { + m_sliceSupportItem( + m_s_NSSAI( + PX_SST, + PX_SD + )) + }) + }) + }, + PX_PAGING_DRX ))); // Await NGSetupResponse - f_recv_NGAP_PDU( mw_ngap_succMsg( mw_n2_NGSetupResponse_iab( - mw_aMFName(PX_AMF_NAME), - { - *, - mw_servedGUAMIItem( - mw_gUAMI( - fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) - )), - * - - },-,-,m_iAB_Supported(-) + mw_aMFName(PX_AMF_NAME), + { + *, + mw_servedGUAMIItem( + mw_gUAMI( + fl_NasNN_MCC2PlmnId(PX_NAS_MCC, PX_NAS_MNC) + )), + * + }, + 1 ))); f_selfOrClientSyncAndVerdict(c_tbDone, f_getVerdict()); log("*** " & __SCOPE__ & ": INFO: Testbody done. ***"); @@ -5833,7 +5837,6 @@ module NGAP_TCFunctions { ) }, PX_PAGING_DRX, - m_nB_IoT_DefaultPagingDRX, m_extended_RANNodeName( "RANNodeNameVisibleString"/*, oct2unichar(char2oct("NodeName"))*/ // Dynamic test case error: Internal error: While PER-encoding type '@NGAP-PDU-Descriptions.NGAP-PDU': No BER descriptor available for type '@NGAP-IEs.Extended-RANNodeName.rANNodeNameUTF8String' diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index db48666..914c4b1 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -259,20 +259,12 @@ module LibNGAP_Pixits { */ modulepar CauseRadioNetwork PX_AMF_CONFIGURATION_UPDATE_FAILURE := unspecified; - - modulepar CauseTransport PX_xxx_1 := unspecified; - - modulepar CauseProtocol PX_xxx_2 := unspecified; - /** * @desc To indicate the reason for a particular event for the NGAP protocol * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.2 Cause */ modulepar CauseNas PX_CAUSE_NAS_NON_DELIVERY_INDICATION := unspecified; - modulepar CauseMisc PX_xxx_4 := unspecified; - - /** * @desc To indicate the RRC state of the UE * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.92 RRC State @@ -369,8 +361,16 @@ module LibNGAP_Pixits { */ modulepar EUTRAintegrityProtectionAlgorithms PX_EUTRA_INTEGRITY_PROTECTION_ALGORITHMS := oct2bit('e000'O); + /** + * @desc Serves as a counter that tracks how many NH key derivations have been performed from the initial root key + * @see ETSI TS 133 501 V16.12.0 (2023-05) Clause 7.2.2 E-UTRAN key identification + */ modulepar NextHopChainingCount PX_NEXT_HOP_CHAINING_COUNT := 0; + /** + * @desc Intermediate key derived by the UE and Core Network (MME/AMF) to provide forward security + * @see ETSI TS 133 501 V16.12.0 (2023-05) + */ modulepar SecurityKey PX_NEXT_HOP_NH := int2bit(0, 256); /** @@ -421,32 +421,86 @@ module LibNGAP_Pixits { */ modulepar NumberOfBroadcastsRequested PX_NUMBER_OF_BROADCASTS_REQUESTED := 4; + /** + * @desc Transparent NAS container + */ modulepar octetstring PX_SOURCE_TO_TARGET_TRANSPARENT_CONTAINER; + /** + * @desc Uniquely and globally identify a tracking area within the Evolved Packet System + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.16 EPS TAC + */ modulepar EPS_TAC PX_EPS_TAC := '0000'O; + /** + * @desc Uniquely identify a Next Generation Evolved Node-B (ng-eNB) + * @see ETSI TS 133 501 V16.12.0 (2023-05) + */ modulepar Bit20 PX_MACRO_NGENB_ID; + /** + * @desc Uniquely identify a Next Generation Evolved Node-B (ng-eNB) + * @see ETSI TS 133 501 V16.12.0 (2023-05) + */ modulepar Bit18 PX_SHORT_MACRO_NGENB_ID; + /** + * @desc Uniquely identify a Next Generation Evolved Node-B (ng-eNB) + * @see ETSI TS 133 501 V16.12.0 (2023-05) + */ modulepar Bit21 PX_LONG_MACRO_NGENB_ID; + /** + * @desc Used by the NG-RAN node to calculate the Paging Frame for a specific User Equipment + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.23 UE Identity Index Value + */ modulepar Bit10 PX_UE_IDENTITY_INDEX_VALUE; + /** + * @desc Used within the 5G NG Application Protocol (NGAP) to assist the NG-RAN node in managing mobility for User Equipment (UE) in the RRC_INACTIVE state + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.3.24 Periodic Registration Update Timer + */ modulepar PeriodicRegistrationUpdateTimer PX_PERIODIC_REGISTRATION_UPDATE_TIMER; + /** + * @desc Used to uniquely identify a trace session for a specific User Equipment + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.10.1 Trace Start + */ modulepar NGRANTraceID PX_NGRAN_TRACE_ID; + /** + * @desc Used to specify which NG-RAN node interfaces should be monitored during a trace session + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.14 Trace Activation + */ modulepar InterfacesToTrace PX_INTERFACES_TO_TRACE; + /** + * @desc Serves as a compact identifier that represents a specific set of UE radio capabilities + * @see ETSI TS 124 301 V16.09.0 (2023-05) Clause 5.3.20 + */ modulepar UERadioCapabilityID PX_U_E_RADIO_CAPABILITY_ID; + /** + * @desc Used to indicate the minimum time the RAN should keep the User Equipment (UE) in the RRC_CONNECTED state + * @see ETSI TS 138 413 V16.12.0 (2023-05) + */ modulepar Extended_ConnectedTime PX_EXTENDED_CONNECTED_TIME; + /** + * @desc Used in the 5G NG Application Protocol (NGAP) to provide the radio access network with the aggregate maximum bit rate for a User Equipment's (UE) sidelink communication (V2X) + * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.3.1.149 LTE UE Sidelink Aggregate Maximum Bit Rate + */ modulepar BitRate PX_UE_SIDELINK_AGGREGATE_MAXIMUM_BIT_RATE; + /** + * @desc Used in 5G systems to identify specific Quality of Service (QoS) characteristics to be provided for a QoS flow + * @see ETSI TS 124 501 V16.14.0 (2023-05) + */ modulepar FiveQI PX_FIVE_QI; + /** + * @desc gNodeB identifier + */ modulepar bitstring PX_GNB_ID := '10101010101010101010101010101010'B; /** diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index a4e1bf2..80919b8 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -5971,11 +5971,11 @@ module LibNGAP_Templates { } // End of template m_n2_NGSetupRequest template (value) InitiatingMessage m_n2_NGSetupRequest_UERetentionInf( - in template (value) GlobalRANNodeID p_globalRANNodeID, - in template (value) SupportedTAList p_supportedTAs, - in template (value) PagingDRX p_pagingDRX := PX_PAGING_DRX, - in template (value) UERetentionInformation p_ueRetentionInf - ) := { + in template (value) GlobalRANNodeID p_globalRANNodeID, + in template (value) SupportedTAList p_supportedTAs, + in template (value) PagingDRX p_pagingDRX := PX_PAGING_DRX, + in template (value) UERetentionInformation p_ueRetentionInf + ) := { procedureCode := id_NGSetup, criticality := reject, value_ := { @@ -6006,13 +6006,13 @@ module LibNGAP_Templates { } } // End of template m_n2_NGSetupRequest_UERetentionInf - template (value) InitiatingMessage m_n2_NGSetupRequest_ExtRanNodeName( - in template (value) GlobalRANNodeID p_globalRANNodeID, - in template (value) SupportedTAList p_supportedTAs, - in template (value) PagingDRX p_pagingDRX := PX_PAGING_DRX, - in template (value) NB_IoT_DefaultPagingDRX p_nbIotDefPagDrx, - in template (value) Extended_RANNodeName p_extRanNodeName - ) := { + template (value) InitiatingMessage m_n2_NGSetupRequest_RanNodeName_ExtRanNodeName( + in template (value) GlobalRANNodeID p_globalRANNodeID, + in template (value) RANNodeName p_ranNodeName := PX_RAN_NODE_NAME, + in template (value) SupportedTAList p_supportedTAs, + in template (value) PagingDRX p_pagingDRX := PX_PAGING_DRX, + in template (value) Extended_RANNodeName p_extRanNodeName + ) := { procedureCode := id_NGSetup, criticality := reject, value_ := { @@ -6024,6 +6024,10 @@ module LibNGAP_Templates { value_ := { GlobalRANNodeID := p_globalRANNodeID } }, { + id := id_RANNodeName, + criticality := reject, + value_ := { RANNodeName := p_ranNodeName } + },{ id := id_SupportedTAList, criticality := reject, value_ := { SupportedTAList := p_supportedTAs } @@ -6034,9 +6038,75 @@ module LibNGAP_Templates { value_ := { PagingDRX := p_pagingDRX } }, { - id := id_NB_IoT_DefaultPagingDRX, + id := id_Extended_RANNodeName, + criticality := ignore, + value_ := { Extended_RANNodeName := p_extRanNodeName } + } + } + } + } + } // End of template m_n2_NGSetupRequest_ExtRanNodeName + + template (value) InitiatingMessage m_n2_NGSetupRequest_RanNodeName( + in template (value) GlobalRANNodeID p_globalRANNodeID, + in template (value) RANNodeName p_ranNodeName := PX_RAN_NODE_NAME, + in template (value) SupportedTAList p_supportedTAs, + in template (value) PagingDRX p_pagingDRX := PX_PAGING_DRX + ) := { + procedureCode := id_NGSetup, + criticality := reject, + value_ := { + NGSetupRequest := { + protocolIEs := { + { + id := id_GlobalRANNodeID, + criticality := reject, + value_ := { GlobalRANNodeID := p_globalRANNodeID } + }, + { + id := id_RANNodeName, + criticality := reject, + value_ := { RANNodeName := p_ranNodeName } + },{ + id := id_SupportedTAList, + criticality := reject, + value_ := { SupportedTAList := p_supportedTAs } + }, + { + id := id_DefaultPagingDRX, + criticality := ignore, + value_ := { PagingDRX := p_pagingDRX } + } + } + } + } + } // End of template m_n2_NGSetupRequest_RanNodeName + + template (value) InitiatingMessage m_n2_NGSetupRequest_ExtRanNodeName( + in template (value) GlobalRANNodeID p_globalRANNodeID, + in template (value) SupportedTAList p_supportedTAs, + in template (value) PagingDRX p_pagingDRX := PX_PAGING_DRX, + in template (value) Extended_RANNodeName p_extRanNodeName + ) := { + procedureCode := id_NGSetup, + criticality := reject, + value_ := { + NGSetupRequest := { + protocolIEs := { + { + id := id_GlobalRANNodeID, + criticality := reject, + value_ := { GlobalRANNodeID := p_globalRANNodeID } + }, + { + id := id_SupportedTAList, + criticality := reject, + value_ := { SupportedTAList := p_supportedTAs } + }, + { + id := id_DefaultPagingDRX, criticality := ignore, - value_ := { NB_IoT_DefaultPagingDRX := p_nbIotDefPagDrx } + value_ := { PagingDRX := p_pagingDRX } }, { id := id_Extended_RANNodeName, @@ -6219,12 +6289,12 @@ module LibNGAP_Templates { } // End of template mw_n2_NGSetupResponse template (present) SuccessfulOutcome mw_n2_NGSetupResponse_UERetentionInf( - template (present) AMFName p_amfName := ?, - template (present) ServedGUAMIList p_servedGUAMIList := ?, - template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, - template (present) PLMNSupportList p_plmnSuppList := ?, - template (present) UERetentionInformation p_ueRetentionInf :=? - ) := { + template (present) AMFName p_amfName := ?, + template (present) ServedGUAMIList p_servedGUAMIList := ?, + template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + template (present) PLMNSupportList p_plmnSuppList := ?, + template (present) UERetentionInformation p_ueRetentionInf :=? + ) := { procedureCode := id_NGSetup, criticality := reject, value_ := { @@ -6302,16 +6372,16 @@ module LibNGAP_Templates { } } // End of template mw_n2_NGSetupResponse_ExtAmfName -/** + /** * @see ETSI TS 138 413 V16.12.0 (2023-05) Clause 9.2.6.2 NG SETUP RESPONSE */ template (present) SuccessfulOutcome mw_n2_NGSetupResponse_iab( - template (present) AMFName p_amfName := ?, - template (present) ServedGUAMIList p_servedGUAMIList := ?, - template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, - template (present) PLMNSupportList p_plmnSuppList := ?, - template (present) IAB_Supported p_iab_s:=? - ) := { + template (present) AMFName p_amfName := ?, + template (present) ServedGUAMIList p_servedGUAMIList := ?, + template (present) RelativeAMFCapacity p_relativeAmfCap:= ?, + template (present) PLMNSupportList p_plmnSuppList := ?, + template (present) IAB_Supported p_iab_s:= ? + ) := { procedureCode := id_NGSetup, criticality := reject, value_ := { @@ -15766,18 +15836,18 @@ module LibNGAP_Templates { } // End of template m_secondaryRATUsageInformation template (omit) SecondaryRATDataUsageReportTransfer m_secondaryRATDataUsageReportTransfer( - in template (omit) SecondaryRATUsageInformation p_secondaryRATUsageInformation := omit, - in template (omit) SecondaryRATDataUsageReportTransfer.iE_Extensions p_iE_Extensions := omit - ) := { + in template (omit) SecondaryRATUsageInformation p_secondaryRATUsageInformation := omit, + in template (omit) SecondaryRATDataUsageReportTransfer.iE_Extensions p_iE_Extensions := omit + ) := { secondaryRATUsageInformation := p_secondaryRATUsageInformation, iE_Extensions := p_iE_Extensions } // End of template m_secondaryRATDataUsageReportTransfer template (omit) SecurityContext m_securityContext( - in template (value) NextHopChainingCount p_nextHopChainingCount := PX_NEXT_HOP_CHAINING_COUNT, - in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, - in template (omit) SecurityContext.iE_Extensions p_iE_Extensions := omit - ) := { + in template (value) NextHopChainingCount p_nextHopChainingCount := PX_NEXT_HOP_CHAINING_COUNT, + in template (value) SecurityKey p_nextHopNH := PX_NEXT_HOP_NH, + in template (omit) SecurityContext.iE_Extensions p_iE_Extensions := omit + ) := { nextHopChainingCount := p_nextHopChainingCount, nextHopNH := p_nextHopNH, iE_Extensions := p_iE_Extensions @@ -16551,8 +16621,8 @@ module LibNGAP_Templates { } // End of template m_traceActivation template (value) TraceActivation.iE_Extensions m_traceActivation_id_MDTConfiguration( - in template (value) MDT_Configuration p_mDT_Configuration - ) := { + in template (value) MDT_Configuration p_mDT_Configuration + ) := { { id := id_MDTConfiguration, criticality := ignore, @@ -16561,8 +16631,8 @@ module LibNGAP_Templates { } // End of template m_traceActivation_id_MDTConfiguration template (value) TraceActivation.iE_Extensions m_traceActivation_id_TraceCollectionEntityURI( - in template (value) URI_address p_uRI_address - ) := { + in template (value) URI_address p_uRI_address + ) := { { id := id_TraceCollectionEntityURI, criticality := ignore, @@ -16779,40 +16849,40 @@ module LibNGAP_Templates { } // End of template m_uEHistoryInformationFromTheUE_choice_Extensions template (value) UEIdentityIndexValue m_uEIdentityIndexValue_indexLength10( - in template (value) UEIdentityIndexValue.indexLength10 p_indexLength10 - ) := { + in template (value) UEIdentityIndexValue.indexLength10 p_indexLength10 + ) := { indexLength10 := p_indexLength10 } // End of template m_uEIdentityIndexValue_indexLength10 template (value) UEIdentityIndexValue m_uEIdentityIndexValue_choice_Extensions( - in template (value) UEIdentityIndexValue.choice_Extensions p_choice_Extensions - ) := { + in template (value) UEIdentityIndexValue.choice_Extensions p_choice_Extensions + ) := { choice_Extensions := p_choice_Extensions } // End of template m_uEIdentityIndexValue_choice_Extensions template (value) UE_NGAP_IDs m_uE_NGAP_IDs_uE_NGAP_ID_pair( - in template (value) UE_NGAP_ID_pair p_uE_NGAP_ID_pair - ) := { + in template (value) UE_NGAP_ID_pair p_uE_NGAP_ID_pair + ) := { uE_NGAP_ID_pair := p_uE_NGAP_ID_pair } // End of template m_uE_NGAP_IDs_uE_NGAP_ID_pair template (value) UE_NGAP_IDs m_uE_NGAP_IDs_aMF_UE_NGAP_ID( - in template (value) AMF_UE_NGAP_ID p_aMF_UE_NGAP_ID := PX_AMF_UE_NGAP_ID - ) := { + in template (value) AMF_UE_NGAP_ID p_aMF_UE_NGAP_ID := PX_AMF_UE_NGAP_ID + ) := { aMF_UE_NGAP_ID := p_aMF_UE_NGAP_ID } // End of template m_uE_NGAP_IDs_aMF_UE_NGAP_ID template (value) UE_NGAP_IDs m_uE_NGAP_IDs_choice_Extensions( - in template (value) UE_NGAP_IDs.choice_Extensions p_choice_Extensions - ) := { + in template (value) UE_NGAP_IDs.choice_Extensions p_choice_Extensions + ) := { choice_Extensions := p_choice_Extensions } // End of template m_uE_NGAP_IDs_choice_Extensions template (omit) UE_NGAP_ID_pair m_uE_NGAP_ID_pair( - in template (value) AMF_UE_NGAP_ID p_aMF_UE_NGAP_ID := PX_AMF_UE_NGAP_ID, - in template (value) RAN_UE_NGAP_ID p_rAN_UE_NGAP_ID := PX_RAN_UE_NGAP_ID, - in template (omit) UE_NGAP_ID_pair.iE_Extensions p_iE_Extensions := omit - ) := { + in template (value) AMF_UE_NGAP_ID p_aMF_UE_NGAP_ID := PX_AMF_UE_NGAP_ID, + in template (value) RAN_UE_NGAP_ID p_rAN_UE_NGAP_ID := PX_RAN_UE_NGAP_ID, + in template (omit) UE_NGAP_ID_pair.iE_Extensions p_iE_Extensions := omit + ) := { aMF_UE_NGAP_ID := p_aMF_UE_NGAP_ID, rAN_UE_NGAP_ID := p_rAN_UE_NGAP_ID, iE_Extensions := p_iE_Extensions diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn index 7778d7c..3b8f68f 100755 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn @@ -14,16 +14,34 @@ module Lib_NG_NAS_Pixits { import from CommonDefs all; import from NAS_CommonTypeDefs all; + /** + * @desc Set to true to activate security checks + */ modulepar boolean PX_CHECK_SECURITY := true; + /** + * @desc Specify the type of identity being transmitted + */ modulepar B4_Type PX_SUPI_FORMAT := '0000'B; + /** + * @desc Identify the specific nature of a User Equipment (UE) identifier + */ modulepar NAS_IdType PX_TYPE_OF_ID := '001'B; + /** + * @desc SUPI digits + */ modulepar octetstring PX_SUPI_DIGITS := '00f110214300014444330302'O; + /** + * @desc MSIN digits + */ modulepar octetstring PX_MSIN := '0000000010'O; + /** + * @desc SUCI digits + */ modulepar octetstring PX_SUCI_DIGITS := '0000000010'O; /** @@ -37,18 +55,33 @@ module Lib_NG_NAS_Pixits { */ modulepar O16_Type PX_OPERATOR_SECRET_KEY := '00000000000000000000000000000000'O; + /** + * @desc Set to true if OPc is provided instead of OP + */ modulepar boolean PX_FORCE_USING_OPERATOR_SECRET_KEY := false + /** + * @desc Sequence Number (SQN) + */ modulepar B48_Type PX_SQN := oct2bit('000000000000'O); + /** + * @desc Authentication Management Field + */ modulepar B16_Type PX_AMF := oct2bit('8000'O); // AMF: Authentication Management Field + /** + * @desc Random challenge + */ modulepar B128_Type PX_RAND_VALUE := oct2bit('23553cbe9637a89d218ae64dae47bf35'O); /** * @desc Subscription key (K) */ modulepar B128_Type PX_SUBSCRIPTION_KEY := oct2bit('00000000000000000000000000000000'O); + /** + * @desc Bearer identifier + */ modulepar B5_Type PX_BEARER_ID := '11010'B; /** -- GitLab From ef58b3a0329898445b1b991098cf28df082cb47e Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 19 Jun 2026 14:03:44 +0000 Subject: [PATCH 149/151] References updated and TTF T048 added to those modules where TTF was mentioned. --- README.md | 8 ++++---- test_purposes/References.txt | 7 ++++++- ttcn/AtsNGAP/NGAP_Pics.ttcn | 2 +- ttcn/AtsNGAP/NGAP_Pixits.ttcn | 2 +- ttcn/AtsNGAP/NGAP_Steps.ttcn | 2 +- ttcn/AtsNGAP/NGAP_TCFunctions.ttcn | 4 ++-- ttcn/AtsNGAP/NGAP_TestCases.ttcn | 4 ++-- ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn | 2 +- ttcn/AtsNGAP/NGAP_TestControl.ttcn | 2 +- ttcn/AtsNGAP/NGAP_TestSystem.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_Pics.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn | 2 +- ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn | 2 +- ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn | 2 +- ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn | 2 +- ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn | 2 +- ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn | 2 +- 20 files changed, 30 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 60587b2..e88eb23 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ This repositories contains the test specificationsfor ETSI 5GNGAP protocols testing, Release 16. ETSI 5GNGAP protocols project supports: -- ETSI TS 123 501: "5G; System architecture for the 5G System (5GS) (3GPP TS 23.501 version 16.16.0 Release 16)" -- ETSI TS 123 502: "5G; Procedures for the 5G System (5GS) (3GPP TS 23.502 version 16.15.0 Release 16)" -- ETSI TS 124 501: "5G; Non-Access-Stratum (NAS) protocol for 5G System (5GS); Stage 3 (3GPP TS 24.501 version 16.12.0 Release 16)" -- ETSI TS 138 413: "5G; NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.12.0 Release 16)" +- [ETSI TS 123 501](https://www.etsi.org/deliver/etsi_ts/123500_123599/123501/16.20.00_60/ts_123501v162000p.pdf): "5G; System architecture for the 5G System (5GS) (3GPP TS 23.501 version 16.20.0 Release 16)" +- [ETSI TS 123 502](https://www.etsi.org/deliver/etsi_ts/123500_123599/123502/16.19.00_60/ts_123502v161900p.pdf): "5G; Procedures for the 5G System (5GS) (3GPP TS 23.502 version 16.19.0 Release 16)" +- [ETSI TS 124 501](https://www.etsi.org/deliver/etsi_ts/124500_124599/124501/16.15.00_60/ts_124501v161500p.pdf): "5G; Non-Access-Stratum (NAS) protocol for 5G System (5GS); Stage 3 (3GPP TS 24.501 version 16.15.0 Release 16)" +- [ETSI TS 138 413](https://www.etsi.org/deliver/etsi_ts/138400_138499/138413/16.17.00_60/ts_138413v161700p.pdf): "5G; NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.17.0 Release 16)" ## Contact information diff --git a/test_purposes/References.txt b/test_purposes/References.txt index f0ac772..c82d569 100644 --- a/test_purposes/References.txt +++ b/test_purposes/References.txt @@ -1 +1,6 @@ -[1] ETSI TS 138 413: "5G;NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 version 16.12.0 Release 16)". +Followig references are related to NGAP Test Specification TS 103 920-2 +[1] ETSI TS 138 413: "5G;NG-RAN; NG Application Protocol (NGAP) (3GPP TS 38.413 Release 16)". +[3] ETSI TS 123 502: "5G; Procedures for the 5G System (5GS) (3GPP TS 23.502 Release 16)". + +Followig references are related to 5G NAS Test Specification TS 103 921-2 +[1] ETSI TS 124 501: "5G; Non-Access-Stratum (NAS) protocol for 5G System (5GS); Stage 3 (3GPP TS 24.501 Release 16)". \ No newline at end of file diff --git a/ttcn/AtsNGAP/NGAP_Pics.ttcn b/ttcn/AtsNGAP/NGAP_Pics.ttcn index dd0567b..a3b70d6 100644 --- a/ttcn/AtsNGAP/NGAP_Pics.ttcn +++ b/ttcn/AtsNGAP/NGAP_Pics.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides PICS for NGAP tests. diff --git a/ttcn/AtsNGAP/NGAP_Pixits.ttcn b/ttcn/AtsNGAP/NGAP_Pixits.ttcn index 621abdc..fb1bea4 100644 --- a/ttcn/AtsNGAP/NGAP_Pixits.ttcn +++ b/ttcn/AtsNGAP/NGAP_Pixits.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides PIXITs for NGAP tests. diff --git a/ttcn/AtsNGAP/NGAP_Steps.ttcn b/ttcn/AtsNGAP/NGAP_Steps.ttcn index 3e18cd0..1ac8782 100644 --- a/ttcn/AtsNGAP/NGAP_Steps.ttcn +++ b/ttcn/AtsNGAP/NGAP_Steps.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides ATS specific steps used by the test cases for NGAP tests. diff --git a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn index c00f1f8..f98ab2a 100644 --- a/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn +++ b/ttcn/AtsNGAP/NGAP_TCFunctions.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF033 + * @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides test functions for NGAP tests. @@ -7,7 +7,7 @@ * No part may be reproduced except as authorized by written permission. * The copyright and the foregoing restriction extend to reproduction in all media. * All rights reserved. - * @see ETSI TS 138 413 / 3GPP TS 38.413 version 16.12 Release 16 + * @see ETSI TS 138 413 / 3GPP TS 38.413 Release 16 */ module NGAP_TCFunctions { diff --git a/ttcn/AtsNGAP/NGAP_TestCases.ttcn b/ttcn/AtsNGAP/NGAP_TestCases.ttcn index 5acc717..0ce29b9 100644 --- a/ttcn/AtsNGAP/NGAP_TestCases.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestCases.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF T033/T048 + * @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides test cases for NGAP tests. @@ -7,7 +7,7 @@ * No part may be reproduced except as authorized by written permission. * The copyright and the foregoing restriction extend to reproduction in all media. * All rights reserved. - * @see ETSI TS 138 413 / 3GPP TS 38.413 version 16.12 Release 16 + * @see ETSI TS 138 413 / 3GPP TS 38.413 Release 16 */ module NGAP_TestCases { diff --git a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn index 2c98043..22ad28a 100644 --- a/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestConfiguration.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides test configuration description for NGAP tests. diff --git a/ttcn/AtsNGAP/NGAP_TestControl.ttcn b/ttcn/AtsNGAP/NGAP_TestControl.ttcn index 2a225f4..dd8b4a6 100644 --- a/ttcn/AtsNGAP/NGAP_TestControl.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestControl.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides execution part for NGAP tests. diff --git a/ttcn/AtsNGAP/NGAP_TestSystem.ttcn b/ttcn/AtsNGAP/NGAP_TestSystem.ttcn index 64d5436..fd1afe4 100644 --- a/ttcn/AtsNGAP/NGAP_TestSystem.ttcn +++ b/ttcn/AtsNGAP/NGAP_TestSystem.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides the types and ports used by the test component for NGAP tests. diff --git a/ttcn/Ats_NG_NAS/NG_NAS_Pics.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_Pics.ttcn index 6e5069a..d4870fe 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_Pics.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_Pics.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF041 +* @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides PICS for NGAP tests. diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn index dca739f..0a2481a 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TCFunctions.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF041 + * @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides test functions for NG_NAS tests. diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn index a14dd95..ec1790d 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestCases.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF041 + * @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides testcases for NG_NAS tests. diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn index 470f5d4..cff7e0d 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestConfiguration.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF041 +* @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides test configuration description for NG_NAS tests. diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn index e9b7c88..177194d 100644 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestControl.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF041 + * @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides testcases for NG_NAS tests. diff --git a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn index becd977..84f26c4 100755 --- a/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn +++ b/ttcn/Ats_NG_NAS/NG_NAS_TestSystem.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF041 +* @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides the types and ports used by the test component for NG_NAS tests. diff --git a/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn b/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn index 53bd800..791cd4d 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_EncdecDeclarations.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides external function declarations. diff --git a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn index 914c4b1..62009d9 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Pixits.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF033 +* @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides PIXITS for NGAP protocol. diff --git a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn index 80919b8..abae6c1 100644 --- a/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn +++ b/ttcn/LibNGAP/lib/LibNGAP_Templates.ttcn @@ -1,5 +1,5 @@ /** - * @author ETSI / TTF033 + * @author ETSI / TTF T033, T048 * @version $URL$ * $Id$ * @desc This module provides templates for NGAP protocol. diff --git a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn index 3b8f68f..4365ff3 100755 --- a/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn +++ b/ttcn/Lib_NG_NAS/lib/Lib_NG_NAS_Pixits.ttcn @@ -1,5 +1,5 @@ /** -* @author ETSI / TTF041 +* @author ETSI / TTF T041, T048 * @version $URL$ * $Id$ * @desc This module provides PICS for NGAP tests. -- GitLab From c19bb4904b83b19a1d9a1d9b191b16717cb5a7e2 Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Fri, 19 Jun 2026 14:06:26 +0000 Subject: [PATCH 150/151] Missing TTF added --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e88eb23..d543756 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ See the attached LICENSE file or visit https://forge.etsi.org/legal-matters. ## STFs/TTFs -The following STFs were or are currently involved in the evolutions of the ETSI 5GNGAP protocols project: -- TTF T033, TTF T048 +The following STFs were or are currently involved in the evolutions of the ETSI 5GNGAP and 5GNAS protocols project: +- TTF T033, TTF T041, TTF T048 # Installation -- GitLab From 439ca11b7d3810a4b0ec316d7ec4a9634a616fba Mon Sep 17 00:00:00 2001 From: Bostjan Pintar Date: Mon, 22 Jun 2026 10:33:04 +0000 Subject: [PATCH 151/151] Some more links. --- README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d543756..0c3c76f 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,19 @@ -# ETSI 5GNGAP protocol project +# ETSI 5G NGAP and 5G NAS protocol project ## Introduction -This repositories contains the test specificationsfor ETSI 5GNGAP protocols testing, Release 16. -ETSI 5GNGAP protocols project supports: +This repositorie contains Abstract Test Suite (ATS) developed in TTCN-3 source code based on test specifications for ETSI 5G NGAP and 5G NAS conformance protocol testing, Release 16: +- [ETSI TS 103 920-1](https://www.etsi.org/deliver/etsi_ts/103900_103999/10392001/) : "5G NGAP Conformance Testing for the N2 interface; Part 1: Protocol Implementation Conformance Statement (PICS) (version 1.2.1)" +- [ETSI TS 103 920-2](https://www.etsi.org/deliver/etsi_ts/103900_103999/10392002/) : "5G NGAP Conformance Testing for the N2 interface; Part 2: Test Suite Structure (TSS) and Test Purposes (TP) (version 1.2.1)" +- [ETSI TS 103 920-3](https://www.etsi.org/deliver/etsi_ts/103900_103999/10392003/) : "5G NGAP Conformance Testing for the N2 interface; Part 3: Abstract Test Suite (ATS) and partial Protocol Implementation eXtra Information for Testing (PIXIT) proforma specification (version 1.2.1)" +- [ETSI TS 103 921-1](https://www.etsi.org/deliver/etsi_ts/103900_103999/10392101/) : "5G NAS Conformance Testing for the N1 interface; Part 1: Protocol Implementation Conformance Statement (PICS) (version 1.2.1)" +- [ETSI TS 103 921-2](https://www.etsi.org/deliver/etsi_ts/103900_103999/10392102/) : "5G NAS Conformance Testing for the N1 interface; Part 2: Test Suite Structure (TSS) and Test Purposes (TP) (version 1.2.1)" +- [ETSI TS 103 921-3](https://www.etsi.org/deliver/etsi_ts/103900_103999/10392103/) : "5G NAS Conformance Testing for the N1 interface; Part 3: Abstract Test Suite (ATS) and partial Protocol Implementation eXtra Information for Testing (PIXIT) proforma specification (version 1.2.1)" + +Following 3GPP library [Lib3GPP-IWD_23wk37](https://www.3gpp.org/ftp/tsg_ran/WG5_Test_ex-T1/TTCN/Deliveries/TTCN3/iwd-TTCN3-B2022-09_D23wk37.zip) was used. + +ETSI 5G NGAP and 5G NAS conformance test specifications are based on following base specifications: - [ETSI TS 123 501](https://www.etsi.org/deliver/etsi_ts/123500_123599/123501/16.20.00_60/ts_123501v162000p.pdf): "5G; System architecture for the 5G System (5GS) (3GPP TS 23.501 version 16.20.0 Release 16)" - [ETSI TS 123 502](https://www.etsi.org/deliver/etsi_ts/123500_123599/123502/16.19.00_60/ts_123502v161900p.pdf): "5G; Procedures for the 5G System (5GS) (3GPP TS 23.502 version 16.19.0 Release 16)" - [ETSI TS 124 501](https://www.etsi.org/deliver/etsi_ts/124500_124599/124501/16.15.00_60/ts_124501v161500p.pdf): "5G; Non-Access-Stratum (NAS) protocol for 5G System (5GS); Stage 3 (3GPP TS 24.501 version 16.15.0 Release 16)" @@ -22,7 +31,7 @@ See the attached LICENSE file or visit https://forge.etsi.org/legal-matters. ## STFs/TTFs -The following STFs were or are currently involved in the evolutions of the ETSI 5GNGAP and 5GNAS protocols project: +The following STFs/TTFs were or are currently involved in the evolutions of the ETSI 5G NGAP and 5G NAS protocols project: - TTF T033, TTF T041, TTF T048 -- GitLab