support A5/4 in Cipher Mode Command
Related: SYS#5324
Change-Id: I780a739b9bfbefd4f58be051794fe1a491823e67
diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c
index 05030d3..4c38c56 100644
--- a/src/libmsc/msc_a.c
+++ b/src/libmsc/msc_a.c
@@ -292,6 +292,14 @@
return msc_a_ran_enc_ciphering(msc_a, umts_aka, retrieve_imeisv);
}
+static uint8_t filter_a5(uint8_t a5_mask, bool umts_aka)
+{
+ /* With GSM AKA: allow A5/0, 1, 3 = 0b00001011 = 0xb.
+ * UMTS aka: allow A5/0, 1, 3, 4 = 0b00011011 = 0x1b.
+ */
+ return a5_mask & (umts_aka ? 0x1b : 0x0b);
+}
+
static int msc_a_ran_enc_ciphering(struct msc_a *msc_a, bool umts_aka, bool retrieve_imeisv)
{
struct gsm_network *net;
@@ -321,7 +329,7 @@
.geran = {
.umts_aka = umts_aka,
.retrieve_imeisv = retrieve_imeisv,
- .a5_encryption_mask = net->a5_encryption_mask,
+ .a5_encryption_mask = filter_a5(net->a5_encryption_mask, umts_aka),
/* for ran_a.c to store the GERAN key that is actually used */
.chosen_key = &msc_a->geran_encr,