diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn index 8eb3f7334..01db3d00f 100644 --- a/msc/BSC_ConnectionHandler.ttcn +++ b/msc/BSC_ConnectionHandler.ttcn @@ -435,7 +435,7 @@ var GSUP_IE auth_tuple; g_pars.vec.autn, g_pars.vec.res)); GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple)); - g_pars.vec.kc := f_auth3g_kc(); + g_pars.vec.kc := f_auth3g_kc(g_pars.vec); } else { g_pars.vec := f_gen_auth_vec_2g(); auth_tuple := valueof(ts_GSUP_IE_AuthTuple2G(g_pars.vec.rand, @@ -548,11 +548,12 @@ function f_expect_common_id() runs on BSC_ConnHdlr } } -function f_auth3g_kc() runs on BSC_ConnHdlr return OCT8 { +/* For UMTS AKA on GERAN, calculate the specific kc from the UMTS AKA ck and ik vectors. */ +function f_auth3g_kc(AuthVector vec) return OCT8 { var integer i; - var octetstring res := g_pars.vec.ck[0] xor4b g_pars.vec.ck[0 + 8] xor4b g_pars.vec.ik[0] xor4b g_pars.vec.ik[0 + 8]; + var octetstring res := vec.ck[0] xor4b vec.ck[0 + 8] xor4b vec.ik[0] xor4b vec.ik[0 + 8]; for (i := 1; i < 8; i := i + 1) { - var octetstring a := g_pars.vec.ck[i] xor4b g_pars.vec.ck[i + 8] xor4b g_pars.vec.ik[i] xor4b g_pars.vec.ik[i + 8]; + var octetstring a := vec.ck[i] xor4b vec.ck[i + 8] xor4b vec.ik[i] xor4b vec.ik[i + 8]; res := res & a; }