aboutsummaryrefslogtreecommitdiffstats
path: root/msc
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2021-11-28 04:33:32 +0300
committerfixeria <vyanitskiy@sysmocom.de>2021-12-04 11:01:57 +0000
commit0649d1c0dbf7ace8b50d5d0841020651459e080d (patch)
tree41549896a85ad4bc551851783daa9cc1abbb0d20 /msc
parent23d6665945bdb049df16267e7c710e6702874f96 (diff)
msc/BSC_ConnectionHandler: refactor and split f_mm_common()
Reduce nesting and improve readability by splitting GERAN/UTRAN specific CMC/SMC message handling into separate functions. Change-Id: Ib7ebe8fd675295beb02cadebb19d8465dffeb732 Related: OS#5333
Diffstat (limited to 'msc')
-rw-r--r--msc/BSC_ConnectionHandler.ttcn126
1 files changed, 69 insertions, 57 deletions
diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn
index 2f270ca9..873ec5bd 100644
--- a/msc/BSC_ConnectionHandler.ttcn
+++ b/msc/BSC_ConnectionHandler.ttcn
@@ -611,68 +611,80 @@ function f_get_expected_encryption(
}
+private function f_mm_ciph_geran() runs on BSC_ConnHdlr
+{
+ var template BSSMAP_IE_EncryptionInformation encryptionInformation;
+ var template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm;
+ var template BSSMAP_IE_KC128 kC128;
+ var OCT1 a5_perm_alg;
+ var PDU_BSSAP pdu;
+
+ if (g_pars.net.expect_ciph) {
+ /* There is nothing to do */
+ return;
+ }
+
+ f_get_expected_encryption(encryptionInformation, chosenEncryptionAlgorithm, kC128, a5_perm_alg);
+ alt {
+ [] BSSAP.receive(tr_BSSMAP_CipherModeCmd2(encryptionInformation, kC128)) -> value pdu {
+ var OCT1 a5_chosen := f_best_alg_from_mask(a5_perm_alg);
+ var integer a5_nr := f_alg_from_mask(a5_chosen);
+ BSSAP.send(ts_BSSMAP_CipherModeCompl(int2oct(a5_nr+1, 1)));
+ }
+ [] BSSAP.receive(tr_BSSMAP_CipherModeCmd2) -> value pdu {
+ log("Error: Ciphering Mode Command with unexpected content. Expected: ",
+ tr_BSSMAP_CipherModeCmd2(encryptionInformation, kC128), " got: ", pdu);
+ setverdict(fail, "Ciphering Mode Command with unexpected content.");
+ mtc.stop;
+ }
+ [] BSSAP.receive(tr_BSSMAP_ClassmarkRequest) {
+ BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3))
+ repeat;
+ }
+ }
+ /* FIXME: Send the best available algorithm */
+}
+
+private function f_mm_ciph_utran() runs on BSC_ConnHdlr
+{
+ alt {
+ [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(uia_algs := ?,
+ uia_key := oct2bit(g_pars.vec.ik),
+ key_sts := ?,
+ uea_algs := ?,
+ uea_key := oct2bit(g_pars.vec.ck))) {
+ var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1*/
+ var EncryptionAlgorithm uea_chosen := 1; /*standard_UMTS_encryption_algorith_UEA1*/
+ BSSAP.send(ts_RANAP_SecurityModeCompleteEnc(uia_chosen, uea_chosen));
+ }
+ [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(?,?,?,?,?)) {
+ setverdict(fail, "Invalid SecurityModeCommand (ciphering case)");
+ mtc.stop;
+ }
+ [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,
+ uia_key := oct2bit(g_pars.vec.ik),
+ key_sts := ?)) {
+ var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1;*/
+ BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
+ }
+ [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(?,?,?)) {
+ setverdict(fail, "Invalid SecurityModeCommand (non-ciphering case)");
+ mtc.stop;
+ }
+ }
+}
+
function f_mm_common() runs on BSC_ConnHdlr
{
f_mm_auth();
+
if (g_pars.ran_is_geran) {
- if (g_pars.net.expect_ciph) {
- var template BSSMAP_IE_EncryptionInformation encryptionInformation;
- var template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm;
- var template BSSMAP_IE_KC128 kC128;
- var OCT1 a5_perm_alg;
- f_get_expected_encryption(encryptionInformation, chosenEncryptionAlgorithm, kC128, a5_perm_alg);
-
- var PDU_BSSAP pdu;
- var template PDU_BSSAP expect_ciph_mode_cmd := tr_BSSMAP_CipherModeCmd2(encryptionInformation, kC128);
- alt {
- [] BSSAP.receive(expect_ciph_mode_cmd) -> value pdu {
- var OCT1 a5_chosen := f_best_alg_from_mask(a5_perm_alg);
- var integer a5_nr := f_alg_from_mask(a5_chosen);
- BSSAP.send(ts_BSSMAP_CipherModeCompl(int2oct(a5_nr+1, 1)));
- }
- [] BSSAP.receive(tr_BSSMAP_CipherModeCmd2) -> value pdu {
- log("Error: Ciphering Mode Command with unexpected content. Expected: ",
- expect_ciph_mode_cmd, " got: ", pdu);
- setverdict(fail, "Ciphering Mode Command with unexpected content.");
- mtc.stop;
- }
- [] BSSAP.receive(tr_BSSMAP_ClassmarkRequest) {
- BSSAP.send(ts_BSSMAP_ClassmarkUpd(g_pars.cm2, g_pars.cm3))
- repeat;
- }
- }
- /* FIXME: Send the best available algorithm */
- }
- f_expect_common_id();
- } else { /* UTRAN */
- alt {
- [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(uia_algs := ?,
- uia_key := oct2bit(g_pars.vec.ik),
- key_sts := ?,
- uea_algs := ?,
- uea_key := oct2bit(g_pars.vec.ck))) {
- var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1*/
- var EncryptionAlgorithm uea_chosen := 1; /*standard_UMTS_encryption_algorith_UEA1*/
- BSSAP.send(ts_RANAP_SecurityModeCompleteEnc(uia_chosen, uea_chosen));
- f_expect_common_id();
- }
- [g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmdEnc(?,?,?,?,?)) {
- setverdict(fail, "Invalid SecurityModeCommand (ciphering case)");
- mtc.stop;
- }
- [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(uia_algs := ?,
- uia_key := oct2bit(g_pars.vec.ik),
- key_sts := ?)) {
- var IntegrityProtectionAlgorithm uia_chosen := 0; /*standard_UMTS_integrity_algorithm_UIA1;*/
- BSSAP.send(ts_RANAP_SecurityModeComplete(uia_chosen));
- f_expect_common_id();
- }
- [not g_pars.net.expect_ciph] BSSAP.receive(tr_RANAP_SecurityModeCmd(?,?,?)) {
- setverdict(fail, "Invalid SecurityModeCommand (non-ciphering case)");
- mtc.stop;
- }
- }
+ f_mm_ciph_geran();
+ } else {
+ f_mm_ciph_utran();
}
+
+ f_expect_common_id();
}
function f_expect_mm_info() runs on BSC_ConnHdlr {