mirror of https://github.com/PentHertz/srsLTE.git
Merge pull request #137 from pily112/Configurable_mcc_mnc_in_HSS
Configurable mcc mnc in hss, debug prints and fix MAC failure error
This commit is contained in:
commit
e8985dbdbc
|
@ -37,6 +37,10 @@ add_executable(test_eea2 test_eea2.cc)
|
|||
target_link_libraries(test_eea2 srslte_common ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_test(test_eea2 test_eea2)
|
||||
|
||||
add_executable(test_f12345 test_f12345.cc)
|
||||
target_link_libraries(test_f12345 srslte_common ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_test(test_f12345 test_f12345)
|
||||
|
||||
add_executable(log_filter_test log_filter_test.cc)
|
||||
target_link_libraries(log_filter_test srslte_phy srslte_common srslte_phy ${SEC_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES})
|
||||
|
||||
|
|
|
@ -0,0 +1,170 @@
|
|||
/*
|
||||
* Includes
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "srslte/common/liblte_security.h"
|
||||
|
||||
|
||||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
|
||||
int32 arrcmp(uint8_t const * const a, uint8_t const * const b, uint32 len) {
|
||||
uint32 i = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (a[i] != b[i]) {
|
||||
return a[i] - b[i];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void arrprint(uint8_t const * const a, uint32 len) {
|
||||
uint32 i = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
printf("0x%02x ", a[i]);
|
||||
if ((i%16==0) && i)
|
||||
printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Tests
|
||||
*
|
||||
* Document Reference: 35.208 e00
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Functions
|
||||
*/
|
||||
|
||||
|
||||
void test_set_2()
|
||||
{
|
||||
LIBLTE_ERROR_ENUM err_lte = LIBLTE_ERROR_INVALID_INPUTS;
|
||||
int32 err_cmp = 0;
|
||||
|
||||
uint8_t k[] = {0x46, 0x5b, 0x5c, 0xe8, 0xb1, 0x99, 0xb4, 0x9f, 0xaa, 0x5f, 0x0a, 0x2e, 0xe2, 0x38, 0xa6, 0xbc};
|
||||
uint8_t rand[] = {0x23, 0x55, 0x3c, 0xbe, 0x96, 0x37, 0xa8, 0x9d, 0x21, 0x8a, 0xe6, 0x4d, 0xae, 0x47, 0xbf, 0x35};
|
||||
uint8_t sqn[] = {0xff, 0x9b, 0xb4, 0xd0, 0xb6, 0x07};
|
||||
uint8_t amf[] = {0xb9, 0xb9};
|
||||
uint8_t op[] = {0xcd, 0xc2, 0x02, 0xd5, 0x12, 0x3e, 0x20, 0xf6, 0x2b, 0x6d, 0x67, 0x6a, 0xc7, 0x2c, 0xb3, 0x18};
|
||||
// f1
|
||||
|
||||
uint8_t mac_o[8];
|
||||
err_lte = liblte_security_milenage_f1(k,
|
||||
op,
|
||||
rand,
|
||||
sqn,
|
||||
amf,
|
||||
mac_o);
|
||||
assert(err_lte == LIBLTE_SUCCESS);
|
||||
|
||||
arrprint(mac_o, sizeof(mac_o));
|
||||
|
||||
uint8_t mac_a[] = {0x4a, 0x9f, 0xfa, 0xc3, 0x54, 0xdf, 0xaf, 0xb3};
|
||||
|
||||
// compare mac a
|
||||
err_cmp = arrcmp(mac_o, mac_a, sizeof(mac_a));
|
||||
assert(err_cmp == 0);
|
||||
|
||||
// f1 star
|
||||
|
||||
uint8_t mac_so[8];
|
||||
err_lte = liblte_security_milenage_f1_star(k,
|
||||
op,
|
||||
rand,
|
||||
sqn,
|
||||
amf,
|
||||
mac_so);
|
||||
|
||||
assert(err_lte == LIBLTE_SUCCESS);
|
||||
|
||||
uint8_t mac_s[] = {0x01, 0xcf, 0xaf, 0x9e, 0xc4, 0xe8, 0x71, 0xe9};
|
||||
|
||||
arrprint(mac_so, sizeof(mac_so));
|
||||
|
||||
err_cmp = arrcmp(mac_so, mac_s, sizeof(mac_s));
|
||||
assert(err_cmp == 0);
|
||||
|
||||
// f2345
|
||||
uint8_t res_o[8];
|
||||
uint8_t ck_o[16];
|
||||
uint8_t ik_o[16];
|
||||
uint8_t ak_o[6];
|
||||
|
||||
err_lte = liblte_security_milenage_f2345(k,
|
||||
op,
|
||||
rand,
|
||||
res_o,
|
||||
ck_o,
|
||||
ik_o,
|
||||
ak_o);
|
||||
|
||||
assert(err_lte == LIBLTE_SUCCESS);
|
||||
|
||||
uint8_t res[] = {0xa5, 0x42, 0x11, 0xd5, 0xe3, 0xba, 0x50, 0xbf};
|
||||
uint8_t ck[] = {0xb4, 0x0b, 0xa9, 0xa3, 0xc5, 0x8b, 0x2a, 0x05, 0xbb, 0xf0, 0xd9, 0x87, 0xb2, 0x1b, 0xf8, 0xcb};
|
||||
uint8_t ik[] = {0xf7, 0x69, 0xbc, 0xd7, 0x51, 0x04, 0x46, 0x04, 0x12, 0x76, 0x72, 0x71, 0x1c, 0x6d, 0x34, 0x41};
|
||||
uint8_t ak[] = {0xaa, 0x68, 0x9c, 0x64, 0x83, 0x70};
|
||||
|
||||
// RESPONSE
|
||||
arrprint(res_o, sizeof(res_o));
|
||||
|
||||
err_cmp = arrcmp(res_o, res, sizeof(res));
|
||||
assert(err_cmp == 0);
|
||||
|
||||
// CK
|
||||
arrprint(ck_o, sizeof(ck_o));
|
||||
|
||||
err_cmp = arrcmp(ck_o, ck, sizeof(ck));
|
||||
assert(err_cmp == 0);
|
||||
|
||||
// IK
|
||||
arrprint(ik_o, sizeof(ik_o));
|
||||
err_cmp = arrcmp(ik_o, ik, sizeof(ik));
|
||||
assert(err_cmp == 0);
|
||||
|
||||
// AK
|
||||
arrprint(ak_o, sizeof(ak_o));
|
||||
err_cmp = arrcmp(ak_o, ak, sizeof(ak));
|
||||
assert(err_cmp == 0);
|
||||
|
||||
// f star
|
||||
uint8_t ak_star_o[6];
|
||||
|
||||
err_lte = liblte_security_milenage_f5_star(k, op, rand, ak_star_o);
|
||||
assert(err_lte == LIBLTE_SUCCESS);
|
||||
|
||||
arrprint(ak_star_o, sizeof(ak_star_o));
|
||||
uint8_t ak_star[] = {0x45, 0x1e, 0x8b, 0xec, 0xa4, 0x3b};
|
||||
err_cmp = arrcmp(ak_star_o, ak_star, sizeof(ak_star));
|
||||
assert(err_cmp == 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
Own test sets
|
||||
*/
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
test_set_2();
|
||||
/*
|
||||
test_set_3();
|
||||
test_set_4();
|
||||
test_set_5();
|
||||
test_set_6();
|
||||
*/
|
||||
}
|
|
@ -46,6 +46,8 @@ namespace srsepc{
|
|||
typedef struct{
|
||||
std::string auth_algo;
|
||||
std::string db_file;
|
||||
uint16_t mcc;
|
||||
uint16_t mnc;
|
||||
}hss_args_t;
|
||||
|
||||
typedef struct{
|
||||
|
@ -99,6 +101,8 @@ private:
|
|||
/*Logs*/
|
||||
srslte::log_filter *m_hss_log;
|
||||
|
||||
uint16_t mcc;
|
||||
uint16_t mnc;
|
||||
};
|
||||
|
||||
} // namespace srsepc
|
||||
|
|
|
@ -90,7 +90,10 @@ hss::init(hss_args_t *hss_args, srslte::log_filter *hss_log)
|
|||
return -1;
|
||||
}
|
||||
|
||||
m_hss_log->info("HSS Initialized. DB file %s, authentication algorithm %s\n", hss_args->db_file.c_str(),hss_args->auth_algo.c_str());
|
||||
mcc = hss_args->mcc;
|
||||
mnc = hss_args->mnc;
|
||||
|
||||
m_hss_log->info("HSS Initialized. DB file %s, authentication algorithm %s, MCC: %d, MNC: %d\n", hss_args->db_file.c_str(),hss_args->auth_algo.c_str(), mcc, mnc);
|
||||
m_hss_log->console("HSS Initialized\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -203,8 +206,6 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
|||
uint8_t ak[6];
|
||||
uint8_t mac[8];
|
||||
|
||||
uint16_t mcc=61441; //001
|
||||
uint16_t mnc=65281; //01
|
||||
|
||||
if(!get_k_amf_op(imsi,k,amf,op))
|
||||
{
|
||||
|
@ -221,6 +222,14 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
|||
ik,
|
||||
ak);
|
||||
|
||||
m_hss_log->debug_hex(k, 16, "User Key : ");
|
||||
m_hss_log->debug_hex(op, 16, "User OP : ");
|
||||
m_hss_log->debug_hex(rand, 16, "User Rand : ");
|
||||
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
||||
m_hss_log->debug_hex(ck, 16, "User CK: ");
|
||||
m_hss_log->debug_hex(ik, 16, "User IK: ");
|
||||
m_hss_log->debug_hex(ak, 6, "User AK: ");
|
||||
|
||||
security_milenage_f1( k,
|
||||
op,
|
||||
rand,
|
||||
|
@ -228,6 +237,9 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
|||
amf,
|
||||
mac);
|
||||
|
||||
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
||||
m_hss_log->debug_hex(mac, 8, "User MAC : ");
|
||||
|
||||
// Generate K_asme
|
||||
security_generate_k_asme( ck,
|
||||
ik,
|
||||
|
@ -237,6 +249,9 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
|||
mnc,
|
||||
k_asme);
|
||||
|
||||
m_hss_log->debug("User MCC : %x MNC : %x \n", mcc, mnc);
|
||||
m_hss_log->debug_hex(k_asme, 32, "User k_asme : ");
|
||||
|
||||
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
||||
for(int i=0;i<6;i++ )
|
||||
{
|
||||
|
@ -251,9 +266,7 @@ hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t *k_asme, uint8_t *autn
|
|||
autn[8+i]=mac[i];
|
||||
}
|
||||
|
||||
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
||||
m_hss_log->debug_hex(autn, 8, "User AUTN: ");
|
||||
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
||||
m_hss_log->debug_hex(autn, 16, "User AUTN: ");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -274,9 +287,6 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
|||
uint8_t ak[6];
|
||||
uint8_t mac[8];
|
||||
|
||||
uint16_t mcc=61441; //001
|
||||
uint16_t mnc=65281; //01
|
||||
|
||||
int i = 0;
|
||||
|
||||
if(!get_k_amf_op(imsi,k,amf,op))
|
||||
|
@ -300,6 +310,14 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
|||
ak[i] = xdout[i+3];
|
||||
}
|
||||
|
||||
m_hss_log->debug_hex(k, 16, "User Key : ");
|
||||
m_hss_log->debug_hex(op, 16, "User OP : ");
|
||||
m_hss_log->debug_hex(rand, 16, "User Rand : ");
|
||||
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
||||
m_hss_log->debug_hex(ck, 16, "User CK: ");
|
||||
m_hss_log->debug_hex(ik, 16, "User IK: ");
|
||||
m_hss_log->debug_hex(ak, 6, "User AK: ");
|
||||
|
||||
// Generate cdout
|
||||
for(i=0; i<6; i++) {
|
||||
cdout[i] = sqn[i];
|
||||
|
@ -313,6 +331,9 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
|||
mac[i] = xdout[i] ^ cdout[i];
|
||||
}
|
||||
|
||||
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
||||
m_hss_log->debug_hex(mac, 8, "User MAC : ");
|
||||
|
||||
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
||||
for(int i=0;i<6;i++ )
|
||||
{
|
||||
|
@ -336,6 +357,9 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
|||
mnc,
|
||||
k_asme);
|
||||
|
||||
m_hss_log->debug("User MCC : %x MNC : %x \n", mcc, mnc);
|
||||
m_hss_log->debug_hex(k_asme, 32, "User k_asme : ");
|
||||
|
||||
//Generate AUTN (autn = sqn ^ ak |+| amf |+| mac)
|
||||
for(int i=0;i<6;i++ )
|
||||
{
|
||||
|
@ -350,9 +374,7 @@ hss::gen_auth_info_answer_xor(uint64_t imsi, uint8_t *k_asme, uint8_t *autn, uin
|
|||
autn[8+i]=mac[i];
|
||||
}
|
||||
|
||||
m_hss_log->debug_hex(sqn, 6, "User SQN : ");
|
||||
m_hss_log->debug_hex(autn, 8, "User AUTN: ");
|
||||
m_hss_log->debug_hex(xres, 8, "User XRES: ");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -189,10 +189,18 @@ parse_args(all_args_t *args, int argc, char* argv[]) {
|
|||
}
|
||||
// Convert MCC/MNC strings
|
||||
if(!srslte::string_to_mcc(mcc, &args->mme_args.s1ap_args.mcc)) {
|
||||
cout << "Error parsing enb.mcc:" << mcc << " - must be a 3-digit string." << endl;
|
||||
cout << "Error parsing mme.mcc:" << mcc << " - must be a 3-digit string." << endl;
|
||||
}
|
||||
if(!srslte::string_to_mnc(mnc, &args->mme_args.s1ap_args.mnc)) {
|
||||
cout << "Error parsing enb.mnc:" << mnc << " - must be a 2 or 3-digit string." << endl;
|
||||
cout << "Error parsing mme.mnc:" << mnc << " - must be a 2 or 3-digit string." << endl;
|
||||
}
|
||||
|
||||
// Convert MCC/MNC strings
|
||||
if(!srslte::string_to_mcc(mcc, &args->hss_args.mcc)) {
|
||||
cout << "Error parsing mme.mcc:" << mcc << " - must be a 3-digit string." << endl;
|
||||
}
|
||||
if(!srslte::string_to_mnc(mnc, &args->hss_args.mnc)) {
|
||||
cout << "Error parsing mme.mnc:" << mnc << " - must be a 2 or 3-digit string." << endl;
|
||||
}
|
||||
|
||||
args->mme_args.s1ap_args.mme_bind_addr = mme_bind_addr;
|
||||
|
|
|
@ -241,7 +241,7 @@ s1ap_nas_transport::handle_nas_imsi_attach_request(uint32_t enb_ue_s1ap_id,
|
|||
{
|
||||
uint8_t k_asme[32];
|
||||
uint8_t autn[16];
|
||||
uint8_t rand[6];
|
||||
uint8_t rand[16];
|
||||
uint8_t xres[8];
|
||||
|
||||
ue_ctx_t ue_ctx;
|
||||
|
@ -584,7 +584,7 @@ bool
|
|||
s1ap_nas_transport::handle_identity_response(srslte::byte_buffer_t *nas_msg, ue_ctx_t* ue_ctx, srslte::byte_buffer_t *reply_msg, bool *reply_flag)
|
||||
{
|
||||
uint8_t autn[16];
|
||||
uint8_t rand[6];
|
||||
uint8_t rand[16];
|
||||
uint8_t xres[8];
|
||||
|
||||
LIBLTE_MME_ID_RESPONSE_MSG_STRUCT id_resp;
|
||||
|
|
Loading…
Reference in New Issue