aboutsummaryrefslogtreecommitdiffstats
path: root/bsc
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-12-17 00:44:52 +0100
committerHarald Welte <laforge@gnumonks.org>2017-12-17 13:24:39 +0100
commit73cd271a56a2b2d0f5c56a48a6f23f9440aa018a (patch)
tree92b753f3470c31ea13e9d8be5879173858f598b2 /bsc
parent82d2b87b47dcedcc9f2026749cf3aa45b1467ad8 (diff)
BSC_Tests: Implement ecnryption related procedures
Let's verify the operation of the CIPHERING MODE COMMAND as issued by MSC, performed by BSC and implemented by simulated BTS/MS. Change-Id: Ibc06bd2177c63837a794a0ca1f54ebef17499e78
Diffstat (limited to 'bsc')
-rw-r--r--bsc/BSC_Tests.ttcn17
-rw-r--r--bsc/MSC_ConnectionHandler.ttcn29
2 files changed, 35 insertions, 11 deletions
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index d1f5c3d7..160d662b 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -1212,9 +1212,9 @@ private function f_tc_assignment_fr_a5_0(charstring id) runs on MSC_ConnHdlr {
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
- ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
- valueof(ts_BSSMAP_IE_EncrInfo(kc, '01'O));
+
f_establish_fully(pars, ass_cmd, exp_compl);
+ f_cipher_mode('01'O, kc);
}
testcase TC_assignment_fr_a5_0() runs on test_CT {
@@ -1239,10 +1239,9 @@ private function f_tc_assignment_fr_a5_1(charstring id) runs on MSC_ConnHdlr {
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
- ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
- valueof(ts_BSSMAP_IE_EncrInfo(kc, '02'O));
f_establish_fully(pars, ass_cmd, exp_compl);
+ f_cipher_mode('02'O, kc);
}
testcase TC_assignment_fr_a5_1() runs on test_CT {
@@ -1264,8 +1263,6 @@ private function f_tc_assignment_fr_a5_1_codec_missing(charstring id) runs on MS
const OCT8 kc := '0001020304050607'O;
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
- ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
- valueof(ts_BSSMAP_IE_EncrInfo(kc, '02'O));
f_establish_fully(pars, ass_cmd, exp_fail);
}
@@ -1289,9 +1286,9 @@ private function f_tc_assignment_fr_a5_3(charstring id ) runs on MSC_ConnHdlr {
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
- ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
- valueof(ts_BSSMAP_IE_EncrInfo(kc, '08'O));
+
f_establish_fully(pars, ass_cmd, exp_compl);
+ f_cipher_mode('08'O, kc);
}
testcase TC_assignment_fr_a5_3() runs on test_CT {
@@ -1315,11 +1312,9 @@ private function f_tc_assignment_fr_a5_4(charstring id) runs on MSC_ConnHdlr {
ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));
- ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
- valueof(ts_BSSMAP_IE_EncrInfo(kc, '10'O));
- ass_cmd.pdu.bssmap.assignmentRequest.kC128 := valueof(ts_BSSMAP_IE_Kc128(kc128));
/* TODO: expect GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED cause value */
f_establish_fully(pars, ass_cmd, exp_fail);
+ f_cipher_mode('10'O, kc, kc128);
}
testcase TC_assignment_fr_a5_4() runs on test_CT {
diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn
index d6154976..a76d1d68 100644
--- a/bsc/MSC_ConnectionHandler.ttcn
+++ b/bsc/MSC_ConnectionHandler.ttcn
@@ -99,6 +99,35 @@ function f_rsl_reply(template PDU_ML3_MS_NW l3, RSL_Message orig) runs on MSC_Co
RSL.send(ts_RSL_DATA_IND(chan_nr, link_id, enc_PDU_ML3_MS_NW(valueof(l3))));
}
+function f_cipher_mode(OCT1 alg, OCT8 key, template OCT16 kc128 := omit) runs on MSC_ConnHdlr {
+ var PDU_BSSAP bssap;
+ var RSL_Message rsl;
+
+ if (isvalue(kc128)) {
+ BSSAP.send(ts_BSSMAP_CipherModeCmdKc128(alg, key, valueof(kc128)));
+ } else {
+ BSSAP.send(ts_BSSMAP_CipherModeCmd(alg, key));
+ }
+ alt {
+ /* RSL/UE Side */
+ [] RSL.receive(tr_RSL_ENCR_CMD(g_chan_nr, ?, alg, key)) -> value rsl {
+ var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[3].body.l3_info.payload);
+ log("Rx L3 from net: ", l3);
+ if (ischosen(l3.msgs.rrm.cipheringModeCommand)) {
+ f_rsl_reply(ts_RRM_CiphModeCompl, rsl);
+ }
+ repeat;
+ }
+ [] BSSAP.receive(tr_BSSMAP_CipherModeCompl) -> value bssap {
+ // bssap.bssmap.cipherModeComplete.chosenEncryptionAlgorithm.algoritmhIdentifier
+ setverdict(pass);
+ }
+ [] BSSAP.receive(tr_BSSMAP_CipherModeRej) -> value bssap {
+ setverdict(fail, "Ciphering Mode Reject");
+ }
+ }
+}
+
/* establish a channel fully, expecting an assignment matching 'exp' */
function f_establish_fully(TestHdlrParams pars, PDU_BSSAP ass_cmd, template PDU_BSSAP exp_ass_cpl)
runs on MSC_ConnHdlr return PDU_BSSAP {