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,