diff --git a/srsepc/hdr/hss/hss.h b/srsepc/hdr/hss/hss.h index 862386ce7..1ab8053d2 100644 --- a/srsepc/hdr/hss/hss.h +++ b/srsepc/hdr/hss/hss.h @@ -93,7 +93,7 @@ private: bool get_k_amf_opc_sqn(uint64_t imsi, uint8_t* k, uint8_t* amf, uint8_t* opc, uint8_t* sqn); void gen_auth_info_answer_xor(hss_ue_ctx_t* ue_ctx, uint8_t* k_asme, uint8_t* autn, uint8_t* rand, uint8_t* xres); - bool gen_auth_info_answer_milenage(uint64_t imsi, uint8_t* k_asme, uint8_t* autn, uint8_t* rand, uint8_t* xres); + void gen_auth_info_answer_milenage(hss_ue_ctx_t* ue_ctx, uint8_t* k_asme, uint8_t* autn, uint8_t* rand, uint8_t* xres); bool resync_sqn_milenage(uint64_t imsi, uint8_t* auts); bool resync_sqn_xor(uint64_t imsi, uint8_t* auts); diff --git a/srsepc/src/hss/hss.cc b/srsepc/src/hss/hss.cc index a09521664..0cf15afc9 100644 --- a/srsepc/src/hss/hss.cc +++ b/srsepc/src/hss/hss.cc @@ -264,34 +264,33 @@ bool hss::gen_auth_info_answer(uint64_t imsi, uint8_t* k_asme, uint8_t* autn, ui return false; } - bool ret = false; // FIXME switch (ue_ctx->algo) { case HSS_ALGO_XOR: gen_auth_info_answer_xor(ue_ctx, k_asme, autn, rand, xres); break; case HSS_ALGO_MILENAGE: - ret = gen_auth_info_answer_milenage(imsi, k_asme, autn, rand, xres); + gen_auth_info_answer_milenage(ue_ctx, k_asme, autn, rand, xres); break; } increment_ue_sqn(imsi); - return ret; + return true; } -bool hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t* k_asme, uint8_t* autn, uint8_t* rand, uint8_t* xres) +void hss::gen_auth_info_answer_milenage(hss_ue_ctx_t* ue_ctx, uint8_t* k_asme, uint8_t* autn, uint8_t* rand, uint8_t* xres) { - uint8_t k[16]; - uint8_t amf[2]; - uint8_t opc[16]; - uint8_t sqn[6]; + // Get K, AMF, OPC and SQN + uint8_t *k = ue_ctx->key; + uint8_t *amf = ue_ctx->amf; + uint8_t *opc = ue_ctx->opc; + uint8_t *sqn = ue_ctx->sqn; + // Temp variables + uint8_t xdout[16]; uint8_t ck[16]; uint8_t ik[16]; uint8_t ak[6]; uint8_t mac[8]; - if (!get_k_amf_opc_sqn(imsi, k, amf, opc, sqn)) { - return false; - } gen_rand(rand); srslte::security_milenage_f2345(k, opc, rand, xres, ck, ik, ak); @@ -327,8 +326,9 @@ bool hss::gen_auth_info_answer_milenage(uint64_t imsi, uint8_t* k_asme, uint8_t* } m_hss_log->debug_hex(autn, 16, "User AUTN: "); - set_last_rand(imsi, rand); - return true; + // Set last RAND + memcpy(ue_ctx->last_rand, rand, 16); + return; } void hss::gen_auth_info_answer_xor(hss_ue_ctx_t* ue_ctx, uint8_t* k_asme, uint8_t* autn, uint8_t* rand, uint8_t* xres)