Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Shweta Shrivastava
openairinterface5G
Commits
1b62c915
Commit
1b62c915
authored
Jun 14, 2021
by
Thomas Laurent
Browse files
add configurable USIM
parent
6749c5f7
Changes
13
Hide whitespace changes
Inline
Side-by-side
cmake_targets/CMakeLists.txt
View file @
1b62c915
...
...
@@ -997,7 +997,6 @@ add_boolean_option(PHY_TX_THREAD False "enable UE_EXPANSION w
add_boolean_option
(
PRE_SCD_THREAD False
"enable UE_EXPANSION with max 256 UE"
)
add_boolean_option
(
UESIM_EXPANSION False
"enable UESIM_EXPANSION with max 256 UE"
)
add_boolean_option
(
ITTI_SIM False
"enable itti simulator"
)
add_boolean_option
(
RFSIM_NAS False
"enable rfsim nas"
)
########################
# Include order
##########################
...
...
@@ -2443,108 +2442,6 @@ set (libnas_utils_OBJS
${
NAS_SRC
}
COMMON/UTIL/OctetString.c
)
if
(
NAS_UE
)
set
(
libnas_ue_api_OBJS
${
NAS_SRC
}
UE/API/USER/at_command.c
${
NAS_SRC
}
UE/API/USER/at_error.c
${
NAS_SRC
}
UE/API/USER/at_response.c
${
NAS_SRC
}
UE/API/USER/user_api.c
${
NAS_SRC
}
UE/API/USER/user_indication.c
${
NAS_SRC
}
UE/API/USIM/aka_functions.c
${
NAS_SRC
}
UE/API/USIM/usim_api.c
)
set
(
libnas_ue_emm_OBJS
${
NAS_SRC
}
UE/EMM/Attach.c
${
NAS_SRC
}
UE/EMM/Authentication.c
${
NAS_SRC
}
UE/EMM/Detach.c
${
NAS_SRC
}
UE/EMM/emm_main.c
${
NAS_SRC
}
UE/EMM/EmmStatusHdl.c
${
NAS_SRC
}
UE/EMM/Identification.c
${
NAS_SRC
}
UE/EMM/IdleMode.c
${
NAS_SRC
}
UE/EMM/LowerLayer.c
${
NAS_SRC
}
UE/EMM/SecurityModeControl.c
${
NAS_SRC
}
UE/EMM/ServiceRequestHdl.c
${
NAS_SRC
}
UE/EMM/TrackingAreaUpdate.c
)
set
(
libnas_ue_emm_sap_OBJS
${
NAS_SRC
}
UE/EMM/SAP/emm_as.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredAttachNeeded.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregistered.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredInitiated.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredLimitedService.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredNoImsi.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredNormalService.c
${
NAS_SRC
}
UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
${
NAS_SRC
}
UE/EMM/SAP/emm_esm.c
${
NAS_SRC
}
UE/EMM/SAP/emm_fsm.c
${
NAS_SRC
}
UE/EMM/SAP/EmmNull.c
${
NAS_SRC
}
UE/EMM/SAP/emm_recv.c
${
NAS_SRC
}
UE/EMM/SAP/emm_reg.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegistered.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredInitiated.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredLimitedService.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredNoCellAvailable.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredNormalService.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredPlmnSearch.c
${
NAS_SRC
}
UE/EMM/SAP/EmmRegisteredUpdateNeeded.c
${
NAS_SRC
}
UE/EMM/SAP/emm_sap.c
${
NAS_SRC
}
UE/EMM/SAP/emm_send.c
${
NAS_SRC
}
UE/EMM/SAP/EmmServiceRequestInitiated.c
${
NAS_SRC
}
UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c
)
set
(
libnas_ue_esm_OBJS
${
NAS_SRC
}
UE/ESM/DedicatedEpsBearerContextActivation.c
${
NAS_SRC
}
UE/ESM/DefaultEpsBearerContextActivation.c
${
NAS_SRC
}
UE/ESM/EpsBearerContextDeactivation.c
${
NAS_SRC
}
UE/ESM/esm_ebr.c
${
NAS_SRC
}
UE/ESM/esm_ebr_context.c
${
NAS_SRC
}
UE/ESM/esm_ip.c
${
NAS_SRC
}
UE/ESM/esm_main.c
${
NAS_SRC
}
UE/ESM/esm_pt.c
${
NAS_SRC
}
UE/ESM/EsmStatusHdl.c
${
NAS_SRC
}
UE/ESM/PdnConnectivity.c
${
NAS_SRC
}
UE/ESM/PdnDisconnect.c
)
set
(
libnas_ue_esm_sap_OBJS
${
NAS_SRC
}
UE/ESM/SAP/esm_recv.c
${
NAS_SRC
}
UE/ESM/SAP/esm_send.c
${
NAS_SRC
}
UE/ESM/SAP/esm_sap.c
)
add_library
(
LIB_NAS_UE
${
NAS_SRC
}
UE/nas_itti_messaging.c
${
NAS_SRC
}
UE/nas_network.c
${
NAS_SRC
}
UE/nas_parser.c
${
NAS_SRC
}
UE/nas_proc.c
${
NAS_SRC
}
UE/nas_user.c
${
libnas_api_OBJS
}
${
libnas_ue_api_OBJS
}
${
libnas_emm_msg_OBJS
}
${
libnas_esm_msg_OBJS
}
${
libnas_ies_OBJS
}
${
libnas_utils_OBJS
}
${
libnas_ue_emm_OBJS
}
${
libnas_ue_emm_sap_OBJS
}
${
libnas_ue_esm_OBJS
}
${
libnas_ue_esm_sap_OBJS
}
)
add_dependencies
(
LIB_NAS_UE rrc_flag
)
set
(
NAS_UE_LIB LIB_NAS_UE
)
include_directories
(
${
NAS_SRC
}
UE
)
include_directories
(
${
NAS_SRC
}
UE/API/USER
)
include_directories
(
${
NAS_SRC
}
UE/API/USIM
)
include_directories
(
${
NAS_SRC
}
UE/EMM
)
include_directories
(
${
NAS_SRC
}
UE/EMM/SAP
)
include_directories
(
${
NAS_SRC
}
UE/ESM
)
include_directories
(
${
NAS_SRC
}
UE/ESM/SAP
)
endif
()
#if(ITTI_SIM OR RFSIM_NAS)
set
(
libnas_ue_api_OBJS
${
NAS_SRC
}
UE/API/USER/at_command.c
${
NAS_SRC
}
UE/API/USER/at_error.c
...
...
@@ -2662,6 +2559,27 @@ endif()
add_dependencies
(
LIB_NAS_SIMUE rrc_flag
)
set
(
NAS_SIM_LIB LIB_NAS_SIMUE
)
add_library
(
LIB_NAS_UE
${
NAS_SRC
}
UE/nas_itti_messaging.c
${
NAS_SRC
}
UE/nas_network.c
${
NAS_SRC
}
UE/nas_parser.c
${
NAS_SRC
}
UE/nas_proc.c
${
NAS_SRC
}
UE/nas_user.c
${
libnas_api_OBJS
}
${
libnas_ue_api_OBJS
}
${
libnas_emm_msg_OBJS
}
${
libnas_esm_msg_OBJS
}
${
libnas_ies_OBJS
}
${
libnas_utils_OBJS
}
${
libnas_ue_emm_OBJS
}
${
libnas_ue_emm_sap_OBJS
}
${
libnas_ue_esm_OBJS
}
${
libnas_ue_esm_sap_OBJS
}
)
add_dependencies
(
LIB_NAS_UE rrc_flag
)
set
(
NAS_UE_LIB LIB_NAS_UE
)
include_directories
(
${
NAS_SRC
}
NR_UE
)
include_directories
(
${
NAS_SRC
}
UE
)
include_directories
(
${
NAS_SRC
}
UE/API/USER
)
...
...
@@ -2670,7 +2588,6 @@ endif()
include_directories
(
${
NAS_SRC
}
UE/EMM/SAP
)
include_directories
(
${
NAS_SRC
}
UE/ESM
)
include_directories
(
${
NAS_SRC
}
UE/ESM/SAP
)
#endif()
# nbiot
add_definitions
(
"-DNUMBER_OF_UE_MAX_NB_IoT=16"
)
...
...
cmake_targets/build_oai
View file @
1b62c915
...
...
@@ -68,7 +68,6 @@ USRP_REC_PLAY="False"
BUILD_ECLIPSE
=
0
NR
=
"False"
ITTI_SIM
=
"False"
RFSIM_NAS
=
"False"
SANITIZE_ADDRESS
=
"False"
OPTIONAL_LIBRARIES
=
"telnetsrv enbscope uescope nrscope msc"
trap
handle_ctrl_c INT
...
...
@@ -264,7 +263,6 @@ function main() {
nrUE
=
1
NR
=
"True"
rfsimNas
=
1
RFSIM_NAS
=
"True"
echo_info
"Will compile NR UE"
shift
;;
--mu
)
...
...
@@ -619,7 +617,6 @@ function main() {
echo
"set ( USRP_REC_PLAY
$USRP_REC_PLAY
)"
>>
$cmake_file
echo
"set ( SKIP_SHARED_LIB_FLAG
$SKIP_SHARED_LIB_FLAG
)"
>>
$cmake_file
echo
"set ( ITTI_SIM
$ITTI_SIM
)"
>>
$cmake_file
echo
"set ( RFSIM_NAS
$RFSIM_NAS
)"
>>
$cmake_file
echo
"set ( SANITIZE_ADDRESS
$SANITIZE_ADDRESS
)"
>>
$cmake_file
echo
'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)'
>>
$cmake_file
cd
$DIR
/
$build_dir
/build
...
...
cmake_targets/install_external_packages.ubuntu20
View file @
1b62c915
...
...
@@ -159,16 +159,8 @@ install_protobuf_from_source(){
#cd protobuf-2.6.1/
rm
-rf
/tmp/protobuf-cpp-3.3.0.tar.gz
*
/tmp/protobuf-3.3.0
wget
--tries
=
3
--retry-connrefused
https://github.com/google/protobuf/releases/download/v3.3.0/protobuf-cpp-3.3.0.tar.gz
tar
-xzvf
protobuf-cpp-3.3.0.tar.gz
--owner
$(
id
-u
)
--group
$(
id
-g
)
--no-same-owner
cd
protobuf-3.3.0/
else
export
LD_LIBRARY_PATH
=
/usr/local/lib
#protoc needs to know where toclook for shared libs
rm
-rf
/tmp/protobuf
git clone
--depth
=
1
--branch
=
v3.3.0 https://github.com/protocolbuffers/protobuf.git /tmp/protobuf
cd
/tmp/protobuf
git submodule update
--init
--recursive
./autogen.sh
fi
tar
-xzvf
protobuf-cpp-3.3.0.tar.gz
--owner
"
$USER
"
--group
"
$(
groups
|
cut
-d
" "
-f1
)
"
--no-same-owner
cd
protobuf-3.3.0/
||
exit
./configure
echo
"Compiling protobuf"
make
-j
"
$(
nproc
)
"
...
...
@@ -339,6 +331,10 @@ check_install_ubuntu_packages() {
$SUDO
apt
install
-y
software-properties-common
case
"
$(
get_distribution_release
)
"
in
"ubuntu20.04"
)
specific_packages
=
"libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
LAPACK_LIBNAME
=
"liblapack.so-x86_64-linux-gnu"
LAPACK_TARGET
=
"/usr/lib/x86_64-linux-gnu/atlas/liblapack.so"
;;
"ubuntu21.04"
)
specific_packages
=
"libtasn1-6-dev libgnutls28-dev iproute2 libconfig-dev"
LAPACK_LIBNAME
=
"liblapack.so-x86_64-linux-gnu"
...
...
executables/nr-uesoftmodem.c
View file @
1b62c915
...
...
@@ -87,9 +87,7 @@ unsigned short config_frames[4] = {2,9,11,13};
#include "executables/softmodem-common.h"
#include "executables/thread-common.h"
#if defined(ITTI_SIM) || defined(RFSIM_NAS)
#include "nr_nas_msg_sim.h"
#endif
extern
const
char
*
duplex_mode
[];
THREAD_STRUCT
thread_struct
;
...
...
@@ -193,12 +191,10 @@ int create_tasks_nrue(uint32_t ue_nb) {
LOG_E
(
NR_RRC
,
"Create task for RRC UE failed
\n
"
);
return
-
1
;
}
#if defined(ITTI_SIM) || defined(RFSIM_NAS)
if
(
itti_create_task
(
TASK_NAS_NRUE
,
nas_nrue_task
,
NULL
)
<
0
)
{
LOG_E
(
NR_RRC
,
"Create task for NAS UE failed
\n
"
);
return
-
1
;
}
#endif
}
itti_wait_ready
(
0
);
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
View file @
1b62c915
...
...
@@ -83,11 +83,11 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
mu
=
nrUE_config
->
prach_config
.
prach_sub_c_spacing
;
restricted_set
=
prach_pdu
->
restricted_set
;
rootSequenceIndex
=
prach_pdu
->
root_seq_id
;
fd_occasion
=
0
;
n_ra_prb
=
nrUE_config
->
prach_config
.
num_prach_fd_occasions_list
[
fd_occasion
].
k1
,
//prach_pdu->freq_msg1;
NCS
=
prach_pdu
->
num_cs
;
prach_fmt_id
=
prach_pdu
->
prach_format
;
preamble_index
=
prach_resources
->
ra_PreambleIndex
;
fd_occasion
=
0
;
prach_len
=
0
;
dftlen
=
0
;
first_nonzero_root_idx
=
0
;
...
...
openair1/PHY/defs_nr_UE.h
View file @
1b62c915
...
...
@@ -1071,6 +1071,7 @@ typedef struct {
#endif
int
dl_stats
[
5
];
void
*
uicc
;
}
PHY_VARS_NR_UE
;
...
...
openair2/RRC/NR_UE/rrc_UE.c
View file @
1b62c915
...
...
@@ -69,9 +69,7 @@
#include "SIMULATION/TOOLS/sim.h" // for taus
#include <executables/softmodem-common.h>
#if defined(ITTI_SIM) || defined(RFSIM_NAS)
#include "nr_nas_msg_sim.h"
#endif
NR_UE_RRC_INST_t
*
NR_UE_rrc_inst
;
/* NAS Attach request with IMSI */
...
...
@@ -1349,14 +1347,21 @@ static void rrc_ue_generate_RRCSetupComplete(
AssertFatal
(
1
==
0
,
"2 > csi_MeasConfig is not null
\n
"
);
if
(
AMF_MODE_ENABLED
)
{
#if defined(ITTI_SIM)
|| defined(RFSIM_NAS)
#if defined(ITTI_SIM)
as_nas_info_t
initialNasMsg
;
generateRegistrationRequest
(
&
initialNasMsg
);
generateRegistrationRequest
(
&
initialNasMsg
,
ctxt_pP
->
module_id
);
nas_msg
=
(
char
*
)
initialNasMsg
.
data
;
nas_msg_length
=
initialNasMsg
.
length
;
#else
nas_msg
=
(
char
*
)
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
initialNasMsg
.
data
;
nas_msg_length
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
initialNasMsg
.
length
;
if
(
get_softmodem_params
()
->
sa
)
{
as_nas_info_t
initialNasMsg
;
generateRegistrationRequest
(
&
initialNasMsg
,
ctxt_pP
->
module_id
);
nas_msg
=
(
char
*
)
initialNasMsg
.
data
;
nas_msg_length
=
initialNasMsg
.
length
;
}
else
{
nas_msg
=
(
char
*
)
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
initialNasMsg
.
data
;
nas_msg_length
=
NR_UE_rrc_inst
[
ctxt_pP
->
module_id
].
initialNasMsg
.
length
;
}
#endif
}
else
{
nas_msg
=
nr_nas_attach_req_imsi
;
...
...
openair3/NAS/COMMON/IES/FGSMobileIdentity.c
View file @
1b62c915
...
...
@@ -194,23 +194,23 @@ static int encode_guti_5gs_mobile_identity(Guti5GSMobileIdentity_t *guti, uint8_
static
int
encode_suci_5gs_mobile_identity
(
Suci5GSMobileIdentity_t
*
suci
,
uint8_t
*
buffer
)
{
uint32_t
encoded
=
0
;
*
(
buffer
+
encoded
)
=
0x00
|
(
suci
->
supiformat
<<
4
)
|
(
suci
->
typeofidentity
);
*
(
buffer
+
encoded
)
=
(
suci
->
supiformat
<<
4
)
|
(
suci
->
typeofidentity
);
encoded
++
;
*
(
buffer
+
encoded
)
=
0x00
|
((
suci
->
mccdigit2
&
0xf
)
<<
4
)
|
*
(
buffer
+
encoded
)
=
((
suci
->
mccdigit2
&
0xf
)
<<
4
)
|
(
suci
->
mccdigit1
&
0xf
);
encoded
++
;
*
(
buffer
+
encoded
)
=
0x00
|
((
suci
->
mncdigit3
&
0xf
)
<<
4
)
|
*
(
buffer
+
encoded
)
=
((
suci
->
mncdigit3
&
0xf
)
<<
4
)
|
(
suci
->
mccdigit3
&
0xf
);
encoded
++
;
*
(
buffer
+
encoded
)
=
0x00
|
((
suci
->
mncdigit2
&
0xf
)
<<
4
)
|
*
(
buffer
+
encoded
)
=
((
suci
->
mncdigit2
&
0xf
)
<<
4
)
|
(
suci
->
mncdigit1
&
0xf
);
encoded
++
;
*
(
buffer
+
encoded
)
=
0x00
|
((
suci
->
routingindicatordigit2
&
0xf
)
<<
4
)
|
*
(
buffer
+
encoded
)
=
((
suci
->
routingindicatordigit2
&
0xf
)
<<
4
)
|
(
suci
->
routingindicatordigit1
&
0xf
);
encoded
++
;
*
(
buffer
+
encoded
)
=
0x00
|
((
suci
->
routingindicatordigit4
&
0xf
)
<<
4
)
|
*
(
buffer
+
encoded
)
=
((
suci
->
routingindicatordigit4
&
0xf
)
<<
4
)
|
(
suci
->
routingindicatordigit3
&
0xf
);
encoded
++
;
...
...
@@ -220,8 +220,15 @@ static int encode_suci_5gs_mobile_identity(Suci5GSMobileIdentity_t *suci, uint8_
*
(
buffer
+
encoded
)
=
suci
->
homenetworkpki
;
encoded
++
;
IES_ENCODE_U32
(
buffer
,
encoded
,
suci
->
schemeoutput
);
char
*
ptr
=
suci
->
schemeoutput
;
while
(
ptr
<
suci
->
schemeoutput
+
strlen
(
suci
->
schemeoutput
)
)
{
buffer
[
encoded
]
=
((
*
(
ptr
+
1
)
-
'0'
)
<<
4
)
|
(
*
(
ptr
)
-
'0'
);
encoded
++
;
ptr
+=
2
;
}
if
(
strlen
(
suci
->
schemeoutput
)
%
2
==
1
)
buffer
[
encoded
++
]
=
((
*
(
ptr
-
1
)
-
'0'
))
|
0xF0
;
return
encoded
;
}
...
...
openair3/NAS/COMMON/IES/FGSMobileIdentity.h
View file @
1b62c915
...
...
@@ -64,7 +64,7 @@ typedef struct {
uint8_t
spare6
:
1
;
uint8_t
protectionschemeId
:
4
;
uint8_t
homenetworkpki
;
uint32_t
schemeoutput
;
char
schemeoutput
[
32
]
;
}
Suci5GSMobileIdentity_t
;
typedef
struct
{
...
...
openair3/NAS/COMMON/NR_NAS_defs.h
View file @
1b62c915
...
...
@@ -387,5 +387,6 @@ void processNAS(void *msg, NRUEcontext_t *UE);
int
identityRequest
(
void
**
msg
,
NRUEcontext_t
*
UE
);
int
authenticationRequest
(
void
**
msg
,
NRUEcontext_t
*
UE
);
int
securityModeCommand
(
void
**
msg
,
NRUEcontext_t
*
UE
);
void
servingNetworkName
(
uint8_t
*
msg
,
char
*
imsiStr
,
int
nmc_size
);
#endif
openair3/NAS/NR_UE/nr_nas_msg_sim.c
View file @
1b62c915
...
...
@@ -40,25 +40,30 @@
#include "PduSessionEstablishRequest.h"
#include "intertask_interface.h"
#include "openair2/RRC/NAS/nas_config.h"
#include <openair3/UICC/usim_interface.h>
#include <openair3/NAS/COMMON/NR_NAS_defs.h>
#include <openair1/PHY/phy_extern_nr_ue.h>
/*char netName[] = "5G:mnc093.mcc208.3gppnetwork.org";
char imsi[] = "2089300007487";
// USIM_API_K: 5122250214c33e723a5dd523fc145fc0
uint8_t k[16] = {0x51, 0x22, 0x25, 0x02, 0x14,0xc3, 0x3e, 0x72, 0x3a, 0x5d, 0xd5, 0x23, 0xfc, 0x14, 0x5f, 0xc0};
// OPC: 981d464c7c52eb6e5036234984ad0bcf
const uint8_t opc[16] = {0x98, 0x1d, 0x46, 0x4c,0x7c,0x52,0xeb, 0x6e, 0x50, 0x36, 0x23, 0x49, 0x84, 0xad, 0x0b, 0xcf};*/
char
netName
[]
=
"5G:mnc099.mcc208.3gppnetwork.org"
;
char
imsi
[]
=
"2089900007487"
;
//"208990100001100";
//char netName[] = "5G:mnc099.mcc208.3gppnetwork.org";
//char imsi[] = "2089900007487"; //"208990100001100";
// USIM_API_K: fe c8 6b a6 eb 70 7e d0 89 05 75 7b 1b b4 4b 8f
uint8_t
k
[
16
]
=
{
0xfe
,
0xc8
,
0x6b
,
0xa6
,
0xeb
,
0x70
,
0x7e
,
0xd0
,
0x89
,
0x05
,
0x75
,
0x7b
,
0x1b
,
0xb4
,
0x4b
,
0x8f
};
//
uint8_t k[16] = {0xfe, 0xc8, 0x6b, 0xa6, 0xeb, 0x70, 0x7e, 0xd0, 0x89, 0x05, 0x75, 0x7b, 0x1b, 0xb4, 0x4b, 0x8f};
// OPC: c4 24 49 36 3b ba d0 2b 66 d1 6b c9 75 d7 7c c1
const
uint8_t
opc
[
16
]
=
{
0xc4
,
0x24
,
0x49
,
0x36
,
0x3b
,
0xba
,
0xd0
,
0x2b
,
0x66
,
0xd1
,
0x6b
,
0xc9
,
0x75
,
0xd7
,
0x7c
,
0xc1
};
//
const uint8_t opc[16] = {0xc4, 0x24, 0x49, 0x36, 0x3b, 0xba, 0xd0, 0x2b, 0x66, 0xd1, 0x6b, 0xc9, 0x75, 0xd7, 0x7c, 0xc1};
uint8_t
*
registration_request_buf
;
uint32_t
registration_request_len
;
extern
char
*
baseNetAddress
;
extern
char
*
baseNetAddress
;
static
uicc_t
*
checkUicc
(
int
Mod_id
)
{
if
(
!
PHY_vars_UE_g
[
Mod_id
][
0
]
->
uicc
)
{
char
uiccName
[
64
];
sprintf
(
uiccName
,
"uicc%d"
,
Mod_id
);
PHY_vars_UE_g
[
Mod_id
][
0
]
->
uicc
=
(
void
*
)
init_uicc
(
uiccName
);
}
return
(
uicc_t
*
)
PHY_vars_UE_g
[
Mod_id
][
0
]
->
uicc
;
}
static
int
nas_protected_security_header_encode
(
char
*
buffer
,
...
...
@@ -163,11 +168,11 @@ int mm_msg_encode(MM_msg *mm_msg, uint8_t *buffer, uint32_t len) {
LOG_FUNC_RETURN
(
header_result
+
encode_result
);
}
void
transferRES
(
uint8_t
ck
[
16
],
uint8_t
ik
[
16
],
uint8_t
*
input
,
uint8_t
rand
[
16
],
uint8_t
*
output
)
{
uint8_t
S
[
100
];
void
transferRES
(
uint8_t
ck
[
16
],
uint8_t
ik
[
16
],
uint8_t
*
input
,
uint8_t
rand
[
16
],
uint8_t
*
output
,
uicc_t
*
uicc
)
{
uint8_t
S
[
100
]
=
{
0
}
;
S
[
0
]
=
0x6B
;
int
netNamesize
=
strlen
(
netNam
e
);
memcpy
(
&
S
[
1
],
netName
,
netNamesize
);
servingNetworkName
(
S
+
1
,
uicc
->
imsiStr
,
uicc
->
nmc_siz
e
);
int
netNamesize
=
strlen
((
char
*
)
S
+
1
);
S
[
1
+
netNamesize
]
=
(
netNamesize
&
0xff00
)
>>
8
;
S
[
2
+
netNamesize
]
=
(
netNamesize
&
0x00ff
);
for
(
int
i
=
0
;
i
<
16
;
i
++
)
...
...
@@ -204,14 +209,15 @@ void transferRES(uint8_t ck[16], uint8_t ik[16], uint8_t *input, uint8_t rand[16
output
[
i
]
=
out
[
16
+
i
];
}
void
derive_kausf
(
uint8_t
ck
[
16
],
uint8_t
ik
[
16
],
uint8_t
sqn
[
6
],
uint8_t
kausf
[
32
])
{
uint8_t
S
[
100
];
void
derive_kausf
(
uint8_t
ck
[
16
],
uint8_t
ik
[
16
],
uint8_t
sqn
[
6
],
uint8_t
kausf
[
32
]
,
uicc_t
*
uicc
)
{
uint8_t
S
[
100
]
=
{
0
}
;
uint8_t
key
[
32
];
int
netNamesize
=
strlen
(
netName
);
memcpy
(
&
key
[
0
],
ck
,
16
);
memcpy
(
&
key
[
16
],
ik
,
16
);
//KEY
S
[
0
]
=
0x6A
;
memcpy
(
&
S
[
1
],
netName
,
netNamesize
);
servingNetworkName
(
S
+
1
,
uicc
->
imsiStr
,
uicc
->
nmc_size
);
int
netNamesize
=
strlen
((
char
*
)
S
+
1
);
S
[
1
+
netNamesize
]
=
(
uint8_t
)((
netNamesize
&
0xff00
)
>>
8
);
S
[
2
+
netNamesize
]
=
(
uint8_t
)(
netNamesize
&
0x00ff
);
for
(
int
i
=
0
;
i
<
6
;
i
++
)
{
...
...
@@ -222,21 +228,21 @@ void derive_kausf(uint8_t ck[16], uint8_t ik[16], uint8_t sqn[6], uint8_t kausf[
kdf
(
key
,
32
,
S
,
11
+
netNamesize
,
kausf
,
32
);
}
void
derive_kseaf
(
uint8_t
kausf
[
32
],
uint8_t
kseaf
[
32
])
{
uint8_t
S
[
100
];
int
netNamesize
=
strlen
(
netName
);
void
derive_kseaf
(
uint8_t
kausf
[
32
],
uint8_t
kseaf
[
32
],
uicc_t
*
uicc
)
{
uint8_t
S
[
100
]
=
{
0
};
S
[
0
]
=
0x6C
;
//FC
memcpy
(
&
S
[
1
],
netName
,
netNamesize
);
servingNetworkName
(
S
+
1
,
uicc
->
imsiStr
,
uicc
->
nmc_size
);
int
netNamesize
=
strlen
((
char
*
)
S
+
1
);
S
[
1
+
netNamesize
]
=
(
uint8_t
)((
netNamesize
&
0xff00
)
>>
8
);
S
[
2
+
netNamesize
]
=
(
uint8_t
)(
netNamesize
&
0x00ff
);
kdf
(
kausf
,
32
,
S
,
3
+
netNamesize
,
kseaf
,
32
);
}
void
derive_kamf
(
uint8_t
*
kseaf
,
uint8_t
*
kamf
,
uint16_t
abba
)
{
int
imsiLen
=
strlen
(
imsi
);
void
derive_kamf
(
uint8_t
*
kseaf
,
uint8_t
*
kamf
,
uint16_t
abba
,
uicc_t
*
uicc
)
{
int
imsiLen
=
strlen
(
uicc
->
imsi
Str
);
uint8_t
S
[
100
];
S
[
0
]
=
0x6D
;
//FC = 0x6D
memcpy
(
&
S
[
1
],
imsi
,
imsiLen
);
memcpy
(
&
S
[
1
],
uicc
->
imsi
Str
,
imsiLen
);
S
[
1
+
imsiLen
]
=
(
uint8_t
)((
imsiLen
&
0xff00
)
>>
8
);
S
[
2
+
imsiLen
]
=
(
uint8_t
)(
imsiLen
&
0x00ff
);
S
[
3
+
imsiLen
]
=
abba
&
0x00ff
;
...
...
@@ -262,11 +268,11 @@ void derive_knas(algorithm_type_dist_t nas_alg_type, uint8_t nas_alg_id, uint8_t
knas_int
[
i
]
=
out
[
16
+
i
];
}
void
generateRegistrationRequest
(
as_nas_info_t
*
initialNasMsg
)
{
void
generateRegistrationRequest
(
as_nas_info_t
*
initialNasMsg
,
int
Mod_id
)
{
int
size
=
sizeof
(
mm_msg_header_t
);
fgs_nas_message_t
nas_msg
;
memset
(
&
nas_msg
,
0
,
sizeof
(
fgs_nas_message_t
));
fgs_nas_message_t
nas_msg
=
{
0
};
MM_msg
*
mm_msg
;
uicc_t
*
uicc
=
checkUicc
(
Mod_id
);
mm_msg
=
&
nas_msg
.
plain
.
mm_msg
;
// set header
...
...
@@ -291,26 +297,31 @@ void generateRegistrationRequest(as_nas_info_t *initialNasMsg) {
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
amfpointer
=
0
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
amfsetid
=
1016
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
tmsi
=
10
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mncdigit1
=
9
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mncdigit2
=
9
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mncdigit3
=
0xf
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mccdigit1
=
2
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mccdigit2
=
0
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mccdigit3
=
8
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mncdigit1
=
uicc
->
nmc_size
==
2
?
uicc
->
imsiStr
[
3
]
-
'0'
:
uicc
->
imsiStr
[
4
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mncdigit2
=
uicc
->
nmc_size
==
2
?
uicc
->
imsiStr
[
4
]
-
'0'
:
uicc
->
imsiStr
[
5
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mncdigit3
=
uicc
->
nmc_size
==
2
?
0xf
:
uicc
->
imsiStr
[
3
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mccdigit1
=
uicc
->
imsiStr
[
0
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mccdigit2
=
uicc
->
imsiStr
[
1
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
guti
.
mccdigit3
=
uicc
->
imsiStr
[
2
]
-
'0'
;
size
+=
13
;
}
else
{
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
typeofidentity
=
FGS_MOBILE_IDENTITY_SUCI
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mncdigit1
=
9
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mncdigit2
=
9
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mncdigit3
=
0xf
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mccdigit1
=
2
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mccdigit2
=
0
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mccdigit3
=
8
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
schemeoutput
=
0x4778
;
size
+=
14
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mncdigit1
=
uicc
->
nmc_size
==
2
?
uicc
->
imsiStr
[
3
]
-
'0'
:
uicc
->
imsiStr
[
4
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mncdigit2
=
uicc
->
nmc_size
==
2
?
uicc
->
imsiStr
[
4
]
-
'0'
:
uicc
->
imsiStr
[
5
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mncdigit3
=
uicc
->
nmc_size
==
2
?
0xf
:
uicc
->
imsiStr
[
3
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mccdigit1
=
uicc
->
imsiStr
[
0
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mccdigit2
=
uicc
->
imsiStr
[
1
]
-
'0'
;
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
mccdigit3
=
uicc
->
imsiStr
[
2
]
-
'0'
;
memcpy
(
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
schemeoutput
,
uicc
->
imsiStr
+
3
+
uicc
->
nmc_size
,
strlen
(
uicc
->
imsiStr
)
-
(
3
+
uicc
->
nmc_size
));
size
+=
sizeof
(
Suci5GSMobileIdentity_t
);
}
mm_msg
->
registration_request
.
presencemask
|=
REGISTRATION_REQUEST_5GMM_CAPABILITY_PRESENT
;
...
...
@@ -337,7 +348,7 @@ void generateRegistrationRequest(as_nas_info_t *initialNasMsg) {
}
void
generateIdentityResponse
(
as_nas_info_t
*
initialNasMsg
,
uint8_t
identitytype
)
{
void
generateIdentityResponse
(
as_nas_info_t
*
initialNasMsg
,
uint8_t
identitytype
,
uicc_t
*
uicc
)
{
int
size
=
sizeof
(
mm_msg_header_t
);
fgs_nas_message_t
nas_msg
;
memset
(
&
nas_msg
,
0
,
sizeof
(
fgs_nas_message_t
));
...
...
@@ -359,15 +370,17 @@ void generateIdentityResponse(as_nas_info_t *initialNasMsg, uint8_t identitytype
size
+=
1
;
if
(
identitytype
==
FGS_MOBILE_IDENTITY_SUCI
){
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
typeofidentity
=
FGS_MOBILE_IDENTITY_SUCI
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mncdigit1
=
9
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mncdigit2
=
9
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mncdigit3
=
0xf
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mccdigit1
=
2
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mccdigit2
=
0
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mccdigit3
=
8
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
schemeoutput
=
0x4778
;
size
+=
14
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mncdigit1
=
uicc
->
nmc_size
==
2
?
uicc
->
imsiStr
[
3
]
-
'0'
:
uicc
->
imsiStr
[
4
]
-
'0'
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mncdigit2
=
uicc
->
nmc_size
==
2
?
uicc
->
imsiStr
[
4
]
-
'0'
:
uicc
->
imsiStr
[
5
]
-
'0'
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mncdigit3
=
uicc
->
nmc_size
==
2
?
0xF
:
uicc
->
imsiStr
[
3
]
-
'0'
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mccdigit1
=
uicc
->
imsiStr
[
0
]
-
'0'
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mccdigit2
=
uicc
->
imsiStr
[
1
]
-
'0'
;
mm_msg
->
fgs_identity_response
.
fgsmobileidentity
.
suci
.
mccdigit3
=
uicc
->
imsiStr
[
2
]
-
'0'
;
memcpy
(
mm_msg
->
registration_request
.
fgsmobileidentity
.
suci
.
schemeoutput
,
uicc
->
imsiStr
+
3
+
uicc
->
nmc_size
,
strlen
(
uicc
->
imsiStr
)
-
(
3
+
uicc
->
nmc_size
));
size
+=
sizeof
(
Suci5GSMobileIdentity_t
);
}
// encode the message
...
...
@@ -378,7 +391,7 @@ void generateIdentityResponse(as_nas_info_t *initialNasMsg, uint8_t identitytype
}
OctetString
knas_int
;
void
generateAuthenticationResp
(
as_nas_info_t
*
initialNasMsg
,
uint8_t
*
buf
){
static
void
generateAuthenticationResp
(
as_nas_info_t
*
initialNasMsg
,
uint8_t
*
buf
,
uicc_t
*
uicc
){
uint8_t
ak
[
6
];
...
...
@@ -396,9 +409,9 @@ void generateAuthenticationResp(as_nas_info_t *initialNasMsg, uint8_t *buf){
uint8_t
resTemp
[
16
];
uint8_t
ck
[
16
],
ik
[
16
],
output
[
16
];
f2345
(
k
,
rand
,
resTemp
,
ck
,
ik
,
ak
,
opc
);
f2345
(
uicc
->
key
,
rand
,
resTemp
,
ck
,
ik
,
ak
,
uicc
->
opc
);
transferRES
(
ck
,
ik
,
resTemp
,
rand
,
output
);
transferRES
(
ck
,
ik
,
resTemp
,
rand
,
output
,
uicc
);
// get knas_int
knas_int
.
length
=
16
;
...
...
@@ -407,9 +420,9 @@ void generateAuthenticationResp(as_nas_info_t *initialNasMsg, uint8_t *buf){
sqn
[
index
]
=
buf
[
26
+
index
];
}
derive_kausf
(
ck
,
ik
,
sqn
,
kausf
);
derive_kseaf
(
kausf
,
kseaf
);
derive_kamf
(
kseaf
,
kamf
,
0x0000
);
derive_kausf
(
ck
,
ik
,
sqn
,
kausf
,
uicc
);
derive_kseaf
(
kausf
,
kseaf
,
uicc
);
derive_kamf
(
kseaf
,
kamf
,
0x0000
,
uicc
);
derive_knas
(
0x02
,
2
,
kamf
,
knas_int
.
value
);
printf
(
"kausf:"
);
...
...
@@ -703,6 +716,7 @@ void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){