msc: convert bssmap chipher to rsl chiper representation

The representation of the chiphering algorithm is different bssmap
and RSL. BSSMAP uses a bitmask and RSL a numeric value. For A50 and
A51 the values match up by coincidence, from A5/2 onwards they differ.

- Add a function to convert the BSSMAP representation to the RSL
  representation and use the converted value to set up the temlate
  for the expected RSL message

Change-Id: I274c1ff0b5636c48411f994f918e783b468cb3be
This commit is contained in:
Philipp Maier 2018-02-07 18:36:25 +01:00
parent 86f3920e5b
commit b20c3dcced
1 changed files with 47 additions and 1 deletions

View File

@ -323,19 +323,65 @@ function f_rsl_reply(template PDU_ML3_MS_NW l3, RSL_Message orig) runs on MSC_Co
f_rsl_send_l3(l3, link_id, chan_nr);
}
/* Convert the chipher representation on BSSMAP to the representation used on RSL */
function f_chipher_mode_bssmap_to_rsl(OCT1 alg_bssmap) return OCT1
{
/* A5 0 */
if (alg_bssmap == '01'O) {
return '01'O;
}
/* A5 1 */
else if (alg_bssmap == '02'O) {
return '02'O;
}
/* A5 2 */
else if (alg_bssmap == '04'O) {
return '03'O;
}
/* A5 3 */
else if (alg_bssmap == '08'O) {
return '04'O;
}
/* A5 4 */
else if (alg_bssmap == '10'O) {
return '05'O;
}
/* A5 5 */
else if (alg_bssmap == '20'O) {
return '06'O;
}
/* A5 6 */
else if (alg_bssmap == '40'O) {
return '07'O;
}
/* A5 7 */
else if (alg_bssmap == '80'O) {
return '08'O;
} else {
setverdict(fail, "Unexpected Encryption Algorithm");
return '00'O;
}
}
function f_cipher_mode(OCT1 alg, OCT8 key, template OCT16 kc128 := omit, boolean exp_fail := false)
runs on MSC_ConnHdlr {
var PDU_BSSAP bssap;
var RSL_Message rsl;
var OCT1 alg_rsl;
if (isvalue(kc128)) {
BSSAP.send(ts_BSSMAP_CipherModeCmdKc128(alg, key, valueof(kc128)));
} else {
BSSAP.send(ts_BSSMAP_CipherModeCmd(alg, key));
}
/* RSL uses a different representation of the encryption algorithm,
* so we need to convert first */
alg_rsl := f_chipher_mode_bssmap_to_rsl(alg);
alt {
/* RSL/UE Side */
[] RSL.receive(tr_RSL_ENCR_CMD(g_chan_nr, ?, alg, key)) -> value rsl {
[] RSL.receive(tr_RSL_ENCR_CMD(g_chan_nr, ?, alg_rsl, 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)) {