Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-AMF-Simple
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
CommunityXG
OpenXG-AMF-Simple
Commits
4eae1bc3
Commit
4eae1bc3
authored
Aug 20, 2020
by
Tien-Thinh Nguyen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove unecessary files
parent
6bb7a6c6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
417 deletions
+0
-417
etc/amf_bupt.conf
etc/amf_bupt.conf
+0
-64
src/test/ue_gnb.cpp
src/test/ue_gnb.cpp
+0
-353
No files found.
etc/amf_bupt.conf
deleted
100755 → 0
View file @
6bb7a6c6
## amf configuration file
AMF
=
{
INSTANCE_ID
=
10
;
PID_DIRECTORY
=
"/var/run"
;
######################################################################## NG SETUP RESPONSE IEs ############################################################
AMF_NAME
=
"bupt-amf"
;
GUAMI
:{
MCC
=
"460"
;
MNC
=
"11"
;
RegionID
=
"128"
;
AMFSetID
=
"4"
;
AMFPointer
=
"1"
}
ServedGUAMIList
= (
{
MCC
=
"460"
;
MNC
=
"11"
;
RegionID
=
"10"
;
AMFSetID
=
"1"
;
AMFPointer
=
"0"
},
#48bits <MCC><MNC><RegionID><AMFSetID><AMFPointer>
{
MCC
=
"460"
;
MNC
=
"11"
;
RegionID
=
"10"
;
AMFSetID
=
"1"
;
AMFPointer
=
"1"
}
#48bits <MCC><MNC><RegionID><AMFSetID><AMFPointer>
);
RelativeAMFCapacity
=
30
;
PLMNSupportList
= (
{
MCC
=
"460"
;
MNC
=
"11"
;
TAC
=
100
;
SliceSupportList
= (
{
SST
=
"222"
;
SD
=
"123"
},
{
SST
=
"1"
;
SD
=
"none"
},
{
SST
=
"1"
;
SD
=
"12"
}
)
}
);
##################################################################### clause 9.2.6.2, 3gpp ts38.413 ####################################################
STATISTICS_TIMER_INTERVAL
=
4
;
#second
INTERFACES
:{
NGAP_AMF
:{
INTERFACE_NAME
=
"ens32"
;
IPV4_ADDRESS
=
"read"
;
SCTP_PORT
=
38412
;
PPID
=
60
;
};
N11
:{
SMF_INSTANCES_POOL
= (
{
SMF_INSTANCE_ID
=
1
;
IPV4_ADDRESS
=
"192.168.1.106"
;
PORT
=
"8889"
;
VERSION
=
"v1"
;
SELECTED
=
"true"
},
{
SMF_INSTANCE_ID
=
2
;
IPV4_ADDRESS
=
"10.103.238.21"
;
PORT
=
"8181"
;
VERSION
=
"v1"
;
SELECTED
=
"false"
}
);
};
};
CORE_CONFIGURATION
:{
EMERGENCY_SUPPORT
=
"false"
;
};
AUTHENTICATION
:{
MYSQL_server
=
"127.0.0.1"
;
MYSQL_user
=
"bupt"
;
# Database server login
MYSQL_pass
=
"linux"
;
# Database server password
MYSQL_db
=
"OAI_DB"
;
OPERATOR_key
=
"1006020f0a478bf6b699f15c062e42b3"
;
# op
RANDOM
=
"true"
;
};
NAS
:{
#ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST = [ "NIA2" , "NIA1" , "NIA0" ];
ORDERED_SUPPORTED_INTEGRITY_ALGORITHM_LIST
= [
"NIA1"
,
"NIA1"
,
"NIA1"
];
ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST
= [
"NEA0"
,
"NEA1"
,
"NEA2"
];
#ORDERED_SUPPORTED_CIPHERING_ALGORITHM_LIST = [ "NEA1" , "NEA1" , "NEA1" ];
};
};
MODULES
=
{
NGAP_MESSAGE
= (
{
MSG_NAME
=
"NGSetupRequest"
;
ProcedureCode
=
21
;
TypeOfMessage
=
"initialMessage"
}
);
};
src/test/ue_gnb.cpp
deleted
100644 → 0
View file @
6bb7a6c6
#include "logger.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
#include <iostream>
using
namespace
std
;
int
encode_ng_setup_request
(
uint8_t
*
);
int
encode_initial_ue_message
(
uint8_t
*
);
void
handle_ngap_message
(
int
sd
,
uint8_t
*
buf
,
int
len
);
void
handle_authentication_request
(
uint8_t
*
nas
,
size_t
nas_len
,
uint8_t
*
resStar
);
extern
void
print_buffer
(
const
std
::
string
app
,
const
std
::
string
commit
,
uint8_t
*
buf
,
int
len
);
int
ue_gnb_simulator
(){
string
amf_addr
=
"10.103.238.78"
;
//string amf_addr = "10.103.238.78";
string
local_addr
=
"10.103.238.79"
;
int
sd
=
-
1
;
struct
sctp_initmsg
init
;
struct
sctp_event_subscribe
events
;
if
((
sd
=
socket
(
AF_INET6
,
SOCK_STREAM
,
IPPROTO_SCTP
))
<
0
)
{
Logger
::
amf_app
().
error
(
"Socket creation failed: %s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
struct
sockaddr
*
bindx_add_addr
=
(
struct
sockaddr
*
)
calloc
(
1
,
sizeof
(
struct
sockaddr
));
if
(
inet_pton
(
AF_INET
,
local_addr
.
c_str
(),
&
((
struct
sockaddr_in
*
)
&
bindx_add_addr
[
0
])
->
sin_addr
.
s_addr
)
!=
1
){
}
else
{
((
struct
sockaddr_in
*
)
bindx_add_addr
)
->
sin_port
=
0
;
bindx_add_addr
->
sa_family
=
AF_INET
;
}
if
(
sctp_bindx
(
sd
,
bindx_add_addr
,
1
,
SCTP_BINDX_ADD_ADDR
)
<
0
)
{
Logger
::
amf_app
().
error
(
"Socket bind failed: %s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
memset
((
void
*
)
&
init
,
0
,
sizeof
(
struct
sctp_initmsg
));
/*
* Request a number of in/out streams
*/
init
.
sinit_num_ostreams
=
32
;
init
.
sinit_max_instreams
=
32
;
init
.
sinit_max_attempts
=
5
;
if
(
setsockopt
(
sd
,
IPPROTO_SCTP
,
SCTP_INITMSG
,
&
init
,
(
socklen_t
)
sizeof
(
struct
sctp_initmsg
))
<
0
)
{
Logger
::
amf_app
().
error
(
"Setsockopt IPPROTO_SCTP_INITMSG failed: %s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
memset
((
void
*
)
&
events
,
1
,
sizeof
(
struct
sctp_event_subscribe
));
if
(
setsockopt
(
sd
,
IPPROTO_SCTP
,
SCTP_EVENTS
,
&
events
,
sizeof
(
struct
sctp_event_subscribe
))
<
0
)
{
Logger
::
amf_app
().
error
(
"Setsockopt IPPROTO_SCTP_EVENTS failed: %s
\n
"
,
strerror
(
errno
));
return
-
1
;
}
struct
sockaddr_in
addr
;
memset
(
&
addr
,
0
,
sizeof
(
struct
sockaddr_in
));
if
(
inet_pton
(
AF_INET
,
amf_addr
.
c_str
(),
&
addr
.
sin_addr
.
s_addr
)
!=
1
)
{
Logger
::
amf_app
().
error
(
"Failed to convert ip address %s to network type
\n
"
,
amf_addr
.
c_str
());
}
addr
.
sin_family
=
AF_INET
;
addr
.
sin_port
=
htons
(
38412
);
Logger
::
amf_app
().
debug
(
"[%d] Sending explicit connect to %s:%u
\n
"
,
sd
,
amf_addr
.
c_str
(),
38412
);
/*
* Connect to remote host and port
*/
if
(
sctp_connectx
(
sd
,
(
struct
sockaddr
*
)
&
addr
,
1
,
NULL
)
<
0
)
{
Logger
::
amf_app
().
error
(
"Connect to %s:%u failed: %s
\n
"
,
amf_addr
.
c_str
(),
38412
,
strerror
(
errno
));
}
uint8_t
buffer
[
1000
];
int
encoded_size
=
encode_ng_setup_request
(
buffer
);
sctp_sendmsg
(
sd
,
(
const
void
*
)
buffer
,
encoded_size
,
NULL
,
0
,
htonl
(
60
),
0
,
0
,
0
,
0
);
while
(
true
){
int
flags
=
0
,
recvSize
=
0
;
socklen_t
from_len
=
0
;
struct
sctp_sndrcvinfo
sinfo
=
{
0
};
struct
sockaddr_in
addr
=
{
0
};
uint8_t
recvBuffer
[
4096
]
=
{
0
};
memset
((
void
*
)
&
addr
,
0
,
sizeof
(
struct
sockaddr_in
));
from_len
=
(
socklen_t
)
sizeof
(
struct
sockaddr_in
);
memset
((
void
*
)
&
sinfo
,
0
,
sizeof
(
struct
sctp_sndrcvinfo
));
recvSize
=
sctp_recvmsg
(
sd
,
(
void
*
)
recvBuffer
,
4096
,
(
struct
sockaddr
*
)
&
addr
,
&
from_len
,
&
sinfo
,
&
flags
);
if
(
flags
&
MSG_NOTIFICATION
){
union
sctp_notification
*
snp
=
(
union
sctp_notification
*
)
recvBuffer
;
switch
(
snp
->
sn_header
.
sn_type
){
case
SCTP_SHUTDOWN_EVENT
:{
}
break
;
case
SCTP_ASSOC_CHANGE
:{
}
break
;
default:
{
}
break
;
}
}
else
{
handle_ngap_message
(
sd
,
recvBuffer
,
recvSize
);
}
}
}
#include "NGSetupRequest.hpp"
using
namespace
ngap
;
int
encode_ng_setup_request
(
uint8_t
*
buf
){
NGSetupRequestMsg
*
ng
=
new
NGSetupRequestMsg
();
ng
->
setMessageType
();
ng
->
setGlobalRanNodeID
(
"460"
,
"11"
,
Ngap_GlobalRANNodeID_PR_globalGNB_ID
,
0x00000001
);
ng
->
setRanNodeName
(
"bupt gnb"
);
std
::
vector
<
struct
SupportedItem_s
>
list
;
struct
SupportedItem_s
item
;
item
.
tac
=
100
;
PlmnSliceSupport_t
plmn
;
plmn
.
mcc
=
"460"
;
plmn
.
mnc
=
"11"
;
SliceSupportItem_t
slice
;
slice
.
sst
=
"1"
;
slice
.
sd
=
"1"
;
plmn
.
slice_list
.
push_back
(
slice
);
item
.
b_plmn_list
.
push_back
(
plmn
);
list
.
push_back
(
item
);
ng
->
setSupportedTAList
(
list
);
ng
->
setDefaultPagingDRX
(
Ngap_PagingDRX_v32
);
return
ng
->
encode2buffer
(
buf
,
1000
);
}
#include "InitialUEMessage.hpp"
int
encode_initial_ue_message
(
uint8_t
*
buf
){
InitialUEMessageMsg
*
init
=
new
InitialUEMessageMsg
();
init
->
setMessageType
();
init
->
setRanUENgapID
(
0x00000001
);
struct
NrCgi_s
cgi
;
cgi
.
mcc
=
"460"
;
cgi
.
mnc
=
"11"
;
cgi
.
nrCellID
=
0x1
;
struct
Tai_s
tai
;
tai
.
mcc
=
"460"
;
tai
.
mnc
=
"11"
;
tai
.
tac
=
100
;
init
->
setUserLocationInfoNR
(
cgi
,
tai
);
init
->
setRRCEstablishmentCause
(
Ngap_RRCEstablishmentCause_mo_Signalling
);
uint8_t
reg
[
35
]
=
{
0x7e
,
0x00
,
0x41
,
0x79
,
0x00
,
0x0d
,
0x01
,
0x64
,
0xf0
,
0x11
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x32
,
0x54
,
0x76
,
0x98
,
0x10
,
0x01
,
0x03
,
0x2e
,
0x02
,
0xf0
,
0xf0
,
0x17
,
0x07
,
0xf0
,
0xf0
,
0xc0
,
0x40
,
0x01
,
0x80
,
0x30
};
init
->
setNasPdu
(
reg
,
35
);
init
->
setUeContextRequest
(
Ngap_UEContextRequest_requested
);
return
init
->
encode2buffer
(
buf
,
2020
);
}
extern
"C"
{
#include "Ngap_NGAP-PDU.h"
#include "Ngap_InitiatingMessage.h"
}
#include "DownLinkNasTransport.hpp"
#include "UplinkNASTransport.hpp"
#include "nas_algorithms.hpp"
uint8_t
Knas_int
[
16
];
void
handle_ngap_message
(
int
sd
,
uint8_t
*
buf
,
int
len
){
Ngap_NGAP_PDU_t
*
ngap_msg_pdu
=
(
Ngap_NGAP_PDU_t
*
)
calloc
(
1
,
sizeof
(
Ngap_NGAP_PDU_t
));
asn_dec_rval_t
rc
=
asn_decode
(
NULL
,
ATS_ALIGNED_CANONICAL_PER
,
&
asn_DEF_Ngap_NGAP_PDU
,(
void
**
)
&
ngap_msg_pdu
,
buf
,
len
);
switch
(
ngap_msg_pdu
->
present
){
case
Ngap_NGAP_PDU_PR_initiatingMessage
:{
switch
(
ngap_msg_pdu
->
choice
.
initiatingMessage
->
procedureCode
){
case
Ngap_ProcedureCode_id_DownlinkNASTransport
:{
printf
(
"recv DOWNLINK-NAS-TRANSPORT message
\n
"
);
DownLinkNasTransportMsg
*
dn
=
new
DownLinkNasTransportMsg
();
dn
->
decodefrompdu
(
ngap_msg_pdu
);
uint8_t
*
nas
;
size_t
nas_len
=
0
;
dn
->
getNasPdu
(
nas
,
nas_len
);
switch
(
nas
[
1
]){
case
0x00
:{
printf
(
"plain message
\n
"
);
switch
(
nas
[
2
]){
case
0x56
:{
printf
(
"recv AUTHENTICATION-REQUEST message
\n
"
);
uint8_t
uplink
[
1000
];
uint8_t
resStar
[
16
];
handle_authentication_request
(
nas
,
nas_len
,
resStar
);
UplinkNASTransportMsg
*
up
=
new
UplinkNASTransportMsg
();
up
->
setMessageType
();
up
->
setAmfUeNgapId
(
0x1
);
up
->
setRanUeNgapId
(
0x1
);
struct
NrCgi_s
cgi
;
cgi
.
mcc
=
"460"
;
cgi
.
mnc
=
"11"
;
cgi
.
nrCellID
=
0x1
;
struct
Tai_s
tai
;
tai
.
mcc
=
"460"
;
tai
.
mnc
=
"11"
;
tai
.
tac
=
100
;
up
->
setUserLocationInfoNR
(
cgi
,
tai
);
uint8_t
nas
[
21
]
=
{
0x7e
,
0x00
,
0x57
,
0x2d
,
0x10
};
memcpy
(
&
nas
[
5
],
resStar
,
16
);
up
->
setNasPdu
(
nas
,
21
);
int
encoded_size
=
up
->
encode2buffer
(
uplink
,
1000
);
sctp_sendmsg
(
sd
,
(
const
void
*
)
uplink
,
encoded_size
,
NULL
,
0
,
htonl
(
60
),
0
,
0
,
0
,
0
);
}
}
}
break
;
case
0x03
:{
printf
(
"integrity protected message(new security)
\n
"
);
uint32_t
mac32
=
ntohl
(
*
(
uint32_t
*
)
&
nas
[
2
]);
printf
(
"received mac32 0x%x
\n
"
,
mac32
);
uint8_t
*
message
=
&
nas
[
6
];
uint32_t
count
=
0
;
nas_stream_cipher_t
stream_cipher
=
{
0
};
uint8_t
mac
[
4
];
stream_cipher
.
key
=
Knas_int
;
stream_cipher
.
key_length
=
16
;
stream_cipher
.
count
=
count
;
stream_cipher
.
bearer
=
0x00
;
stream_cipher
.
direction
=
1
;
stream_cipher
.
message
=
message
;
stream_cipher
.
blength
=
(
nas_len
-
6
)
*
8
;
nas_algorithms
::
nas_stream_encrypt_nia2
(
&
stream_cipher
,
mac
);
print_buffer
(
"amf_n1"
,
"calculated MAC"
,
mac
,
4
);
}
break
;
}
}
break
;
}
break
;
}
break
;
case
Ngap_NGAP_PDU_PR_successfulOutcome
:{
switch
(
ngap_msg_pdu
->
choice
.
successfulOutcome
->
procedureCode
){
case
Ngap_ProcedureCode_id_NGSetup
:{
printf
(
"recv NG-SETUP-RESPONSE message
\n
"
);
uint8_t
buffer
[
2049
];
int
encoded_size
=
encode_initial_ue_message
(
buffer
);
sctp_sendmsg
(
sd
,
(
const
void
*
)
buffer
,
encoded_size
,
NULL
,
0
,
htonl
(
60
),
0
,
0
,
0
,
0
);
}
break
;
}
}
break
;
}
}
uint8_t
opc
[
16
]
=
{
0x00
,
0x01
,
0x02
,
0x03
,
0x04
,
0x05
,
0x06
,
0x07
,
0x08
,
0x09
,
0x0a
,
0x0b
,
0x0c
,
0x0d
,
0x0e
,
0x0f
};
uint8_t
key
[
16
]
=
{
0x00
,
0x11
,
0x22
,
0x33
,
0x44
,
0x55
,
0x66
,
0x77
,
0x88
,
0x99
,
0xaa
,
0xbb
,
0xcc
,
0xdd
,
0xee
,
0xff
};
#include "AuthenticationRequest.hpp"
#include "authentication_algorithms_with_5gaka.hpp"
using
namespace
nas
;
void
handle_authentication_request
(
uint8_t
*
nas
,
size_t
nas_len
,
uint8_t
*
resStar
){
AuthenticationRequest
*
auth_req
=
new
AuthenticationRequest
();
auth_req
->
decodefrombuffer
(
NULL
,
nas
,
(
int
)
nas_len
);
uint8_t
*
rand
=
auth_req
->
ie_authentication_parameter_rand
->
getValue
();
print_buffer
(
"amf_n1"
,
"received RAND"
,
rand
,
16
);
uint8_t
*
autn
=
auth_req
->
ie_authentication_parameter_autn
->
getValue
();
print_buffer
(
"amf_n1"
,
"received AUTN"
,
autn
,
16
);
/************************* MILENAGE F2345 ****************************************/
uint8_t
res
[
8
],
ck
[
16
],
ik
[
16
],
ak
[
6
];
Authentication_5gaka
::
f2345
(
opc
,
key
,
rand
,
res
,
ck
,
ik
,
ak
);
print_buffer
(
"amf_n1"
,
"XRES = F2(RAND)"
,
res
,
8
);
print_buffer
(
"amf_n1"
,
"CK = F3(RAND)"
,
ck
,
16
);
print_buffer
(
"amf_n1"
,
"IK = F4(RAND)"
,
ik
,
16
);
/************************ verify MAC ********************************************/
uint8_t
sqn
[
6
];
for
(
int
i
=
0
;
i
<
6
;
i
++
)
sqn
[
i
]
=
autn
[
i
]
^
ak
[
i
];
uint8_t
amf
[
2
]
=
{
0x80
,
0x00
};
uint8_t
mac_a
[
8
];
Authentication_5gaka
::
f1
(
opc
,
key
,
rand
,
sqn
,
amf
,
mac_a
);
print_buffer
(
"amf_n1"
,
"mac_a"
,
mac_a
,
8
);
/************************ RES to RES* ********************************************/
std
::
string
snnStr
=
"5G:mnc011.mcc460.3gppnetwork.org"
;
uint8_t
*
snn
=
(
uint8_t
*
)
snnStr
.
c_str
();
int
len
=
snnStr
.
length
();
uint8_t
KEY
[
32
];
memcpy
(
&
KEY
[
0
],
ck
,
16
);
memcpy
(
&
KEY
[
16
],
ik
,
16
);
print_buffer
(
"amf_n1"
,
"XRES* Derivation: KEY"
,
KEY
,
32
);
uint8_t
S
[
200
];
S
[
0
]
=
0x6B
;
memcpy
(
&
S
[
1
],
snn
,
len
);
S
[
1
+
len
]
=
(
len
&
0xff00
)
>>
8
;
S
[
2
+
len
]
=
len
&
0x00ff
;
memcpy
(
&
S
[
3
+
len
],
rand
,
16
);
S
[
19
+
len
]
=
0x00
;
S
[
20
+
len
]
=
0x10
;
memcpy
(
&
S
[
21
+
len
],
res
,
8
);
S
[
29
+
len
]
=
0x00
;
S
[
30
+
len
]
=
0x08
;
print_buffer
(
"amf_n1"
,
"XRES* Derivation: Input"
,
S
,
31
+
len
);
uint8_t
out
[
32
];
Authentication_5gaka
::
kdf
(
KEY
,
32
,
S
,
31
+
len
,
out
,
32
);
memcpy
(
resStar
,
out
+
16
,
16
);
print_buffer
(
"amf_n1"
,
"Result of KDF: XRES*"
,
resStar
,
16
);
/************************* Kausf ********************************/
memset
(
S
,
0
,
200
);
//print_buffer("amf_n1", "reset input S", S, 200);
S
[
0
]
=
0x6A
;
memcpy
(
&
S
[
1
],
snn
,
len
);
S
[
1
+
len
]
=
(
len
&
0xff00
)
>>
8
;
S
[
2
+
len
]
=
len
&
0x00ff
;
memcpy
(
&
S
[
3
+
len
],
autn
,
6
);
S
[
9
+
len
]
=
0x00
;
S
[
10
+
len
]
=
0x06
;
print_buffer
(
"amf_n1"
,
"Kausf Derivation: Input"
,
S
,
11
+
len
);
uint8_t
kausf
[
32
];
Authentication_5gaka
::
kdf
(
KEY
,
32
,
S
,
11
+
len
,
kausf
,
32
);
print_buffer
(
"amf_n1"
,
"Result of KDF: Kausf"
,
kausf
,
32
);
/********************** kseaf ************************************/
memset
(
S
,
0
,
200
);
std
::
string
newsnnStr
=
"5G:mnc011.mcc460.3gppnetwork.org"
;
uint8_t
*
newsnn
=
(
uint8_t
*
)
newsnnStr
.
c_str
();
len
=
newsnnStr
.
length
();
S
[
0
]
=
0x6C
;
memcpy
(
&
S
[
1
],
newsnn
,
len
);
S
[
1
+
len
]
=
(
len
&
0xff00
)
>>
8
;
S
[
2
+
len
]
=
len
&
0x00ff
;
print_buffer
(
"amf_n1"
,
"Kseaf Derivation: Input"
,
S
,
3
+
len
);
uint8_t
kseaf
[
32
];
Authentication_5gaka
::
kdf
(
kausf
,
32
,
S
,
3
+
len
,
kseaf
,
32
);
print_buffer
(
"amf_n1"
,
"Result of KDF: Kseaf"
,
kseaf
,
32
);
/************************* kamf ********************************/
uint8_t
abba
[
2
]
=
{
0x00
,
0x00
};
std
::
string
supiStr
=
"imsi-460110123456789"
;
//std::string supiStr = "460111032547698";
uint8_t
*
supi
=
(
uint8_t
*
)
supiStr
.
c_str
();
len
=
supiStr
.
length
();
//uint8_t supi[8] = {0x64, 0xf0, 0x11, 0x10, 0x32, 0x54, 0x76, 0x98};
//len = 8;
memset
(
S
,
0
,
200
);
S
[
0
]
=
0x6D
;
memcpy
(
&
S
[
1
],
supi
,
len
);
S
[
1
+
len
]
=
(
len
&
0xff00
)
>>
8
;
S
[
2
+
len
]
=
len
&
0x00ff
;
memcpy
(
&
S
[
3
+
len
],
abba
,
2
);
S
[
5
+
len
]
=
0x00
;
S
[
6
+
len
]
=
0x02
;
print_buffer
(
"amf_n1"
,
"Kamf Derivation: Input"
,
S
,
7
+
len
);
uint8_t
kamf
[
32
];
Authentication_5gaka
::
kdf
(
kseaf
,
32
,
S
,
7
+
len
,
kamf
,
32
);
print_buffer
(
"amf_n1"
,
"Result of KDF: Kamf"
,
kamf
,
32
);
/***************************** Knas_int **************************/
memset
(
S
,
0
,
200
);
S
[
0
]
=
0x69
;
S
[
1
]
=
0x02
;
S
[
2
]
=
0x00
;
S
[
3
]
=
0x01
;
S
[
4
]
=
0x02
;
S
[
5
]
=
0x00
;
S
[
6
]
=
0x01
;
print_buffer
(
"amf_n1"
,
"Kamf_int with NIA2 Derivation: Input"
,
S
,
7
);
memset
(
out
,
0
,
32
);
Authentication_5gaka
::
kdf
(
kamf
,
32
,
S
,
7
,
out
,
32
);
memcpy
(
Knas_int
,
out
+
16
,
16
);
print_buffer
(
"amf_n1"
,
"Result of KDF: Knas_int"
,
Knas_int
,
16
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment