msc: test auth options, and fall-back to no-auth
Test 12 permutations of (auth optional,required) x (a5 '0', '0 3', '3') x (hlr has auth info) In TC_auth_options_2(), expect behavior after implementing OS#4830: if the HLR fails to return auth info and auth + ciph are configured optional, fall back to no authentication. This test will start succeeding starting with commit I5feda196fa481dd8a46b0e4721c64b7c6600f0d1 in osmo-msc.git. All other tests yield the current behavior of osmo-msc. Related: I5feda196fa481dd8a46b0e4721c64b7c6600f0d1 (osmo-msc) Related: OS#4830 Change-Id: I8e3b02ca83e56ef5349d85f08407509e19fa353c
This commit is contained in:
parent
262584764f
commit
e860fc49d9
|
@ -78,8 +78,24 @@ type component BSC_ConnHdlr extends RAN_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr,
|
||||||
}
|
}
|
||||||
|
|
||||||
type record BSC_ConnHdlrNetworkPars {
|
type record BSC_ConnHdlrNetworkPars {
|
||||||
|
/* Bitmask of expected A5 levels; in Ciphering, will expect use of the highest A5 remaining after masking this
|
||||||
|
* with A5 supported by the MS */
|
||||||
OCT1 kc_support,
|
OCT1 kc_support,
|
||||||
|
/* osmo-msc VTY cfg under 'network': If a test wants to temporarily modify auth and encr config, this is the
|
||||||
|
* original config to return to for this test (is *not* sent to vty before the test, but maybe it should).
|
||||||
|
* For example: { "authentication optional", "encryption a5 0 3" } */
|
||||||
|
rof_charstring net_config,
|
||||||
|
/* expect_attach_success == true: expect Location Updating / CM Service Request to succeed.
|
||||||
|
* expect_attach_success == false: expect the MSC to reject LU / CM Service. */
|
||||||
|
boolean expect_attach_success,
|
||||||
|
/* expect_tmsi == true: expect MSC to allocate a new TMSI.
|
||||||
|
* expect_tmsi == false: expect no TMSI to be assigned, operate with IMSI Mobile Identity. */
|
||||||
boolean expect_tmsi,
|
boolean expect_tmsi,
|
||||||
|
/* expect_auth == true overrides expect_auth_attempt == false */
|
||||||
|
boolean expect_auth_attempt,
|
||||||
|
/* hlr_has_auth_info has an effect only when (expect_auth_attempt or expect_auth) == true.
|
||||||
|
* hlr_has_auth_info == false means the HLR responds to Send Auth Info Request with a NACK. */
|
||||||
|
boolean hlr_has_auth_info,
|
||||||
boolean expect_auth,
|
boolean expect_auth,
|
||||||
boolean expect_ciph,
|
boolean expect_ciph,
|
||||||
boolean expect_imei,
|
boolean expect_imei,
|
||||||
|
@ -404,7 +420,11 @@ runs on BSC_ConnHdlr {
|
||||||
} else {
|
} else {
|
||||||
if (etype != EST_TYPE_PAG_RESP) {
|
if (etype != EST_TYPE_PAG_RESP) {
|
||||||
/* explicit CM SERVICE ACCEPT */
|
/* explicit CM SERVICE ACCEPT */
|
||||||
|
if (g_pars.net.expect_attach_success) {
|
||||||
BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
|
BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
|
||||||
|
} else {
|
||||||
|
BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -436,6 +456,7 @@ private function f_build_lu(MobileIdentityLV mi) runs on BSC_ConnHdlr return PDU
|
||||||
altstep as_GSUP_SAI() runs on BSC_ConnHdlr {
|
altstep as_GSUP_SAI() runs on BSC_ConnHdlr {
|
||||||
var GSUP_IE auth_tuple;
|
var GSUP_IE auth_tuple;
|
||||||
[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)) {
|
[] GSUP.receive(tr_GSUP_SAI_REQ(g_pars.imsi)) {
|
||||||
|
if (g_pars.net.hlr_has_auth_info) {
|
||||||
if (g_pars.use_umts_aka) {
|
if (g_pars.use_umts_aka) {
|
||||||
if (not g_pars.vec_keep) {
|
if (not g_pars.vec_keep) {
|
||||||
g_pars.vec := f_gen_auth_vec_3g();
|
g_pars.vec := f_gen_auth_vec_3g();
|
||||||
|
@ -457,13 +478,21 @@ var GSUP_IE auth_tuple;
|
||||||
g_pars.vec.kc));
|
g_pars.vec.kc));
|
||||||
GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
|
GSUP.send(ts_GSUP_SAI_RES(g_pars.imsi, auth_tuple));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
log("XXX ts_GSUP_SAI_ERR");
|
||||||
|
/* HLR knows the IMSI but has no authentication info; osmo-hlr responds with GMM_CAUSE_IMSI_UNKNOWN=2 in
|
||||||
|
* this case, for SAI this merely means there is no auth entry for this IMSI. */
|
||||||
|
GSUP.send(ts_GSUP_SAI_ERR(g_pars.imsi, 2));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function f_mm_auth() runs on BSC_ConnHdlr
|
function f_mm_auth() runs on BSC_ConnHdlr
|
||||||
{
|
{
|
||||||
if (g_pars.net.expect_auth) {
|
if (g_pars.net.expect_auth or g_pars.net.expect_auth_attempt) {
|
||||||
as_GSUP_SAI();
|
as_GSUP_SAI();
|
||||||
|
}
|
||||||
|
if (g_pars.net.expect_auth) {
|
||||||
if (g_pars.use_umts_aka) {
|
if (g_pars.use_umts_aka) {
|
||||||
BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_AUTH_REQ_3G(g_pars.vec.rand, g_pars.vec.autn)));
|
BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_MM_AUTH_REQ_3G(g_pars.vec.rand, g_pars.vec.autn)));
|
||||||
var OCT4 res := substr(g_pars.vec.res, 0, 4);
|
var OCT4 res := substr(g_pars.vec.res, 0, 4);
|
||||||
|
@ -685,6 +714,9 @@ function f_mm_common() runs on BSC_ConnHdlr
|
||||||
f_mm_ciph_utran();
|
f_mm_ciph_utran();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (not g_pars.net.expect_attach_success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
f_expect_common_id();
|
f_expect_common_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -810,15 +842,18 @@ runs on BSC_ConnHdlr {
|
||||||
f_mm_common();
|
f_mm_common();
|
||||||
f_msc_lu_hlr();
|
f_msc_lu_hlr();
|
||||||
f_mm_imei();
|
f_mm_imei();
|
||||||
f_accept_reject_lu();
|
as_accept_reject_lu(g_pars.net.expect_attach_success);
|
||||||
/* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */
|
/* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */
|
||||||
f_expect_clear();
|
f_expect_clear(verify_vlr_cell_id := g_pars.net.expect_attach_success);
|
||||||
|
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
}
|
}
|
||||||
|
|
||||||
function f_msc_lu_hlr() runs on BSC_ConnHdlr
|
function f_msc_lu_hlr() runs on BSC_ConnHdlr
|
||||||
{
|
{
|
||||||
|
if (not g_pars.net.expect_attach_success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
/* Expect MSC to perform LU with HLR */
|
/* Expect MSC to perform LU with HLR */
|
||||||
GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
|
GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
|
||||||
GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
|
GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
|
||||||
|
@ -826,11 +861,10 @@ function f_msc_lu_hlr() runs on BSC_ConnHdlr
|
||||||
GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
|
GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
|
||||||
}
|
}
|
||||||
|
|
||||||
function f_accept_reject_lu() runs on BSC_ConnHdlr {
|
altstep as_accept_reject_lu(boolean expect_accept := true) runs on BSC_ConnHdlr {
|
||||||
var PDU_DTAP_MT dtap_mt;
|
var PDU_DTAP_MT dtap_mt;
|
||||||
|
|
||||||
alt {
|
[expect_accept] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {
|
||||||
[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {
|
|
||||||
var PDU_ML3_LocationUpdateAccept lu_acc := dtap_mt.dtap.msgs.mm.locationUpdateAccept;
|
var PDU_ML3_LocationUpdateAccept lu_acc := dtap_mt.dtap.msgs.mm.locationUpdateAccept;
|
||||||
if (g_pars.net.expect_tmsi) {
|
if (g_pars.net.expect_tmsi) {
|
||||||
if (not ispresent(lu_acc.mobileIdentityTLV) or
|
if (not ispresent(lu_acc.mobileIdentityTLV) or
|
||||||
|
@ -848,17 +882,24 @@ function f_accept_reject_lu() runs on BSC_ConnHdlr {
|
||||||
mtc.stop;
|
mtc.stop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
|
|
||||||
setverdict(fail, "Expected LU ACK, but received LU REJ");
|
|
||||||
mtc.stop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait for MM-Information (if enabled) */
|
/* Wait for MM-Information (if enabled) */
|
||||||
f_expect_mm_info();
|
f_expect_mm_info();
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
}
|
}
|
||||||
|
[expect_accept] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
|
||||||
|
setverdict(fail, "Expected LU ACK, but received LU REJ");
|
||||||
|
mtc.stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
[not expect_accept] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
|
||||||
|
setverdict(pass);
|
||||||
|
}
|
||||||
|
[not expect_accept] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {
|
||||||
|
setverdict(fail, "Expected LU REJ, but received LU ACK");
|
||||||
|
mtc.stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function f_expect_lu_reject(template OCT1 cause := ?) runs on BSC_ConnHdlr {
|
function f_expect_lu_reject(template OCT1 cause := ?) runs on BSC_ConnHdlr {
|
||||||
var PDU_DTAP_MT dtap_mt;
|
var PDU_DTAP_MT dtap_mt;
|
||||||
|
|
|
@ -371,7 +371,11 @@ function f_init_pars(integer imsi_suffix, boolean sgsap := false, boolean gsup :
|
||||||
runs on MTC_CT return BSC_ConnHdlrPars {
|
runs on MTC_CT return BSC_ConnHdlrPars {
|
||||||
var BSC_ConnHdlrNetworkPars net_pars := {
|
var BSC_ConnHdlrNetworkPars net_pars := {
|
||||||
kc_support := '0A'O, /* A5/1 and A5/3 enabled */
|
kc_support := '0A'O, /* A5/1 and A5/3 enabled */
|
||||||
|
net_config := { "authentication optional", "encryption a5 0" },
|
||||||
|
expect_attach_success := true,
|
||||||
expect_tmsi := true,
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := false,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
expect_auth := false,
|
expect_auth := false,
|
||||||
expect_ciph := false,
|
expect_ciph := false,
|
||||||
expect_imei := false,
|
expect_imei := false,
|
||||||
|
@ -4474,7 +4478,7 @@ private function f_tc_cipher_complete_without_alg(charstring id, BSC_ConnHdlrPar
|
||||||
/* TODO: Verify MSC is using the best cipher available! How? */
|
/* TODO: Verify MSC is using the best cipher available! How? */
|
||||||
|
|
||||||
f_msc_lu_hlr();
|
f_msc_lu_hlr();
|
||||||
f_accept_reject_lu();
|
as_accept_reject_lu();
|
||||||
f_expect_clear();
|
f_expect_clear();
|
||||||
setverdict(pass);
|
setverdict(pass);
|
||||||
}
|
}
|
||||||
|
@ -6848,6 +6852,325 @@ testcase TC_cm_serv_wrong_mi() runs on MTC_CT {
|
||||||
vc_conn.done;
|
vc_conn.done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* a5 0 a5 0 a5 0 3 a5 0 3 a5 3 a5 3
|
||||||
|
* HLR has auth info no yes no yes no yes
|
||||||
|
*
|
||||||
|
* test case index [0] [1] [2] [3] [4] [5]
|
||||||
|
* authentication optional No auth No auth attempt auth, auth reject auth
|
||||||
|
* (%) fall back to +ciph +ciph
|
||||||
|
* no-auth
|
||||||
|
*
|
||||||
|
* [6] [7] [8] [9] [10] [11]
|
||||||
|
* authentication mandatory reject auth reject auth reject auth
|
||||||
|
* only +ciph +ciph
|
||||||
|
*
|
||||||
|
* (%): Arguably, when HLR has auth info, the MSC should use it. Current behavior of osmo-msc is to not attempt auth at
|
||||||
|
* all. Related: OS#4830.
|
||||||
|
*/
|
||||||
|
type record of BSC_ConnHdlrNetworkPars rof_netpars;
|
||||||
|
|
||||||
|
const rof_netpars auth_options_testcases := {
|
||||||
|
{
|
||||||
|
/* [0] auth optional, encr a5 0: no-auth" */
|
||||||
|
kc_support := '01'O,
|
||||||
|
net_config := { "authentication optional",
|
||||||
|
"encryption a5 0" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := false,
|
||||||
|
hlr_has_auth_info := false,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [1] auth optional, encr a5 0, HLR HAS auth info: no-auth */
|
||||||
|
kc_support := '01'O,
|
||||||
|
net_config := { "authentication optional",
|
||||||
|
"encryption a5 0" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := false,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [2] auth optional, encr a5 0 3, HLR has NO Auth Info: Fall back to no-auth" */
|
||||||
|
kc_support := '09'O,
|
||||||
|
net_config := { "authentication optional",
|
||||||
|
"encryption a5 0 3" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := false,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [3] auth optional, encr a5 0 3, HLR HAS Auth Info: Use A5/3 */
|
||||||
|
kc_support := '09'O,
|
||||||
|
net_config := { "authentication optional",
|
||||||
|
"encryption a5 0 3" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
|
expect_auth := true,
|
||||||
|
expect_ciph := true,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [4] auth optional, encr a5 3, HLR has NO Auth Info: reject.
|
||||||
|
* Auth is required implicitly because ciph is required. */
|
||||||
|
kc_support := '08'O,
|
||||||
|
net_config := { "authentication optional",
|
||||||
|
"encryption a5 3" },
|
||||||
|
expect_attach_success := false,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := false,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [5] auth optional, encr a5 3, HLR HAS Auth Info: auth + ciph.
|
||||||
|
* Auth is required implicitly because ciph is required. */
|
||||||
|
kc_support := '08'O,
|
||||||
|
net_config := { "authentication optional",
|
||||||
|
"encryption a5 3" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
|
expect_auth := true,
|
||||||
|
expect_ciph := true,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Same as above, but with 'authentication required' */
|
||||||
|
|
||||||
|
{
|
||||||
|
/* [6] auth required, encr a5 0, HLR has NO auth info: reject */
|
||||||
|
kc_support := '01'O,
|
||||||
|
net_config := { "authentication required",
|
||||||
|
"encryption a5 0" },
|
||||||
|
expect_attach_success := false,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := false,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [7] auth required, encr a5 0, HLR HAS auth info: do auth, no ciph" */
|
||||||
|
kc_support := '01'O,
|
||||||
|
net_config := { "authentication required",
|
||||||
|
"encryption a5 0" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
|
expect_auth := true,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [8] auth required, encr a5 0 3, HLR has NO Auth Info: reject */
|
||||||
|
kc_support := '09'O,
|
||||||
|
net_config := { "authentication required",
|
||||||
|
"encryption a5 0 3" },
|
||||||
|
expect_attach_success := false,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := false,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [9] auth required, encr a5 0 3, HLR HAS Auth Info: Use A5/3 */
|
||||||
|
kc_support := '09'O,
|
||||||
|
net_config := { "authentication required",
|
||||||
|
"encryption a5 0 3" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
|
expect_auth := true,
|
||||||
|
expect_ciph := true,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [10] auth required, encr a5 3, HLR has NO Auth Info: reject. */
|
||||||
|
kc_support := '08'O,
|
||||||
|
net_config := { "authentication required",
|
||||||
|
"encryption a5 3" },
|
||||||
|
expect_attach_success := false,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := false,
|
||||||
|
expect_auth := false,
|
||||||
|
expect_ciph := false,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* [11] auth required, encr a5 3, HLR HAS Auth Info: auth + ciph. */
|
||||||
|
kc_support := '08'O,
|
||||||
|
net_config := { "authentication required",
|
||||||
|
"encryption a5 3" },
|
||||||
|
expect_attach_success := true,
|
||||||
|
expect_tmsi := true,
|
||||||
|
expect_auth_attempt := true,
|
||||||
|
hlr_has_auth_info := true,
|
||||||
|
expect_auth := true,
|
||||||
|
expect_ciph := true,
|
||||||
|
expect_imei := false,
|
||||||
|
expect_imei_early := false,
|
||||||
|
check_imei_result := OSMO_GSUP_IMEI_RESULT_ACK,
|
||||||
|
check_imei_error := false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private function f_tc_auth_options(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
|
||||||
|
f_init_handler(pars);
|
||||||
|
|
||||||
|
/* Location Updating */
|
||||||
|
log(MSCVTY, "f_perform_lu() starting");
|
||||||
|
f_perform_lu();
|
||||||
|
log(MSCVTY, "f_perform_lu() done");
|
||||||
|
|
||||||
|
f_sleep(1.0);
|
||||||
|
|
||||||
|
if (not pars.net.expect_attach_success) {
|
||||||
|
/* Expected above LU to fail. In order to test CM Service Request below, a LU has to succeed first. So
|
||||||
|
* run another LU that will be successful. Careful not to load auth tokens into the VLR that may taint
|
||||||
|
* the test for CM Service Request below. */
|
||||||
|
|
||||||
|
log(MSCVTY, "Running a successful LU so that CM Service Request can be tested");
|
||||||
|
var BSC_ConnHdlrNetworkPars saved_net := g_pars.net;
|
||||||
|
g_pars.net.kc_support := '01'O;
|
||||||
|
g_pars.net.expect_attach_success := true;
|
||||||
|
g_pars.net.expect_auth_attempt := false;
|
||||||
|
g_pars.net.expect_auth := false;
|
||||||
|
g_pars.net.expect_ciph := false;
|
||||||
|
f_vty_config3(MSCVTY, {"network"}, {"authentication optional", "encryption a5 0"});
|
||||||
|
f_perform_lu();
|
||||||
|
|
||||||
|
/* Reconfigure like it was before */
|
||||||
|
g_pars.net := saved_net;
|
||||||
|
f_vty_config3(MSCVTY, {"network"}, g_pars.net.net_config);
|
||||||
|
log(MSCVTY, "Running a successful LU done");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* CM Service Request */
|
||||||
|
log(MSCVTY, "f_establish_fully() starting");
|
||||||
|
f_establish_fully();
|
||||||
|
log(MSCVTY, "f_establish_fully() done");
|
||||||
|
BSSAP.send(ts_BSSMAP_ClearRequest(0));
|
||||||
|
f_expect_clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
function f_TC_auth_options(integer tc_i) runs on MTC_CT {
|
||||||
|
f_init();
|
||||||
|
|
||||||
|
var BSC_ConnHdlrNetworkPars tc := auth_options_testcases[tc_i];
|
||||||
|
|
||||||
|
f_vty_config3(MSCVTY, {"network"}, tc.net_config);
|
||||||
|
|
||||||
|
var BSC_ConnHdlrPars pars := f_init_pars(42300 + tc_i);
|
||||||
|
pars.net := tc;
|
||||||
|
|
||||||
|
var BSC_ConnHdlr vc_conn;
|
||||||
|
vc_conn := f_start_handler_with_pars(refers(f_tc_auth_options), pars);
|
||||||
|
vc_conn.done;
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_0() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_1() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_2() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_3() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_4() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_5() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_6() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(6);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_7() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_8() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_9() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(9);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_10() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
testcase TC_auth_options_11() runs on MTC_CT {
|
||||||
|
f_TC_auth_options(11);
|
||||||
|
}
|
||||||
|
|
||||||
control {
|
control {
|
||||||
execute( TC_cr_before_reset() );
|
execute( TC_cr_before_reset() );
|
||||||
execute( TC_lu_imsi_noauth_tmsi() );
|
execute( TC_lu_imsi_noauth_tmsi() );
|
||||||
|
@ -7012,6 +7335,19 @@ control {
|
||||||
execute( TC_call_re_establishment_ciph() );
|
execute( TC_call_re_establishment_ciph() );
|
||||||
|
|
||||||
execute( TC_cm_serv_wrong_mi() );
|
execute( TC_cm_serv_wrong_mi() );
|
||||||
|
|
||||||
|
execute( TC_auth_options_0() );
|
||||||
|
execute( TC_auth_options_1() );
|
||||||
|
execute( TC_auth_options_2() );
|
||||||
|
execute( TC_auth_options_3() );
|
||||||
|
execute( TC_auth_options_4() );
|
||||||
|
execute( TC_auth_options_5() );
|
||||||
|
execute( TC_auth_options_6() );
|
||||||
|
execute( TC_auth_options_7() );
|
||||||
|
execute( TC_auth_options_8() );
|
||||||
|
execute( TC_auth_options_9() );
|
||||||
|
execute( TC_auth_options_10() );
|
||||||
|
execute( TC_auth_options_11() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue