Shift ciphering algorithm selection from VLR to MSC

The VLR code seems to have the assumption that there is one particular
algorithm to be used, as opposed to one of a set of algorithms.

What's missing is basically to decide when/where to pick the best
algorithm within the capabilities of the phone (classmark) and the
network configuration (net->a5_encryption_mask).  So far, libvlr has no
notion of classmark.  Rather, libmsc has.

Why does the VLR care about the particular algorithm at all?  The VLR
should probably simply decide if it should use encryption or not, and if
so, the MSC will figure which algorithm to use.

Change-Id: I5ed80ca2086560a5975a758ec568a034a9a8ab89
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index 126a216..c37aeb7 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -339,8 +339,7 @@
 				net->vlr, conn, vlr_lu_type, tmsi, imsi,
 				&old_lai, &new_lai,
 				is_utran || conn->network->authentication_required,
-				is_utran? VLR_CIPH_A5_3
-					: conn->network->a5_encryption,
+				is_utran || conn->network->a5_encryption,
 				classmark_is_r99(&conn->classmark),
 				is_utran,
 				net->vlr->cfg.assign_tmsi);
@@ -724,8 +723,7 @@
 			 net->vlr, conn,
 			 VLR_PR_ARQ_T_CM_SERV_REQ, mi-1, &lai,
 			 is_utran || conn->network->authentication_required,
-			 is_utran? VLR_CIPH_A5_3
-				 : conn->network->a5_encryption,
+			 is_utran || conn->network->a5_encryption,
 			 classmark_is_r99(&conn->classmark),
 			 is_utran);
 
@@ -1129,8 +1127,7 @@
 			 net->vlr, conn,
 			 VLR_PR_ARQ_T_PAGING_RESP, mi_lv, &lai,
 			 is_utran || conn->network->authentication_required,
-			 is_utran? VLR_CIPH_A5_3
-				 : conn->network->a5_encryption,
+			 is_utran || conn->network->a5_encryption,
 			 classmark_is_r99(&conn->classmark),
 			 is_utran);
 
@@ -3422,7 +3419,6 @@
 
 /* VLR asks us to start using ciphering */
 static int msc_vlr_set_ciph_mode(void *msc_conn_ref,
-				 enum vlr_ciph ciph,
 				 bool umts_aka,
 				 bool retrieve_imeisv)
 {
@@ -3453,7 +3449,7 @@
 		{
 			struct gsm0808_encrypt_info ei;
 
-			ei.perm_algo[0] = vlr_ciph_to_gsm0808_alg_id(ciph);
+			ei.perm_algo[0] = vlr_ciph_to_gsm0808_alg_id(conn->network->a5_encryption);
 			ei.perm_algo_len = 1;
 
 			/* In case of UMTS AKA, the Kc for ciphering must be derived from the 3G auth
diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c
index 21ef082..6750a46 100644
--- a/src/libvlr/vlr.c
+++ b/src/libvlr/vlr.c
@@ -1105,33 +1105,15 @@
 int vlr_set_ciph_mode(struct vlr_instance *vlr,
 		      struct osmo_fsm_inst *fi,
 		      void *msc_conn_ref,
-		      enum vlr_ciph ciph_mode,
+		      bool ciph_required,
 		      bool umts_aka,
 		      bool retrieve_imeisv)
 {
-	switch (ciph_mode) {
-	case VLR_CIPH_NONE:
+	if (!ciph_required)
 		return 0;
 
-	case VLR_CIPH_A5_1:
-	case VLR_CIPH_A5_3:
-		LOGPFSML(fi, LOGL_DEBUG, "Set Ciphering Mode: %d=%s\n",
-			 ciph_mode, vlr_ciph_name(ciph_mode));
-		return vlr->ops.set_ciph_mode(msc_conn_ref,
-					      ciph_mode,
-					      umts_aka,
-					      retrieve_imeisv);
-
-	case VLR_CIPH_A5_2:
-		/* TODO policy by user config? */
-		LOGPFSML(fi, LOGL_ERROR, "A5/2 ciphering is not allowed\n");
-		return -EINVAL;
-
-	default:
-		LOGPFSML(fi, LOGL_ERROR, "unknown ciphering value: %d\n",
-			 ciph_mode);
-		return -EINVAL;
-	}
+	LOGPFSML(fi, LOGL_DEBUG, "Set Ciphering Mode\n");
+	return vlr->ops.set_ciph_mode(msc_conn_ref, umts_aka, retrieve_imeisv);
 }
 
 /* Decide whether UMTS AKA should be used.
diff --git a/src/libvlr/vlr_access_req_fsm.c b/src/libvlr/vlr_access_req_fsm.c
index 41e629e..556e694 100644
--- a/src/libvlr/vlr_access_req_fsm.c
+++ b/src/libvlr/vlr_access_req_fsm.c
@@ -79,7 +79,7 @@
 	uint32_t tmsi;
 	struct osmo_location_area_id lai;
 	bool authentication_required;
-	enum vlr_ciph ciphering_required;
+	bool ciphering_required;
 	bool is_r99;
 	bool is_utran;
 	bool implicitly_accepted_parq_by_ciphering_cmd;
@@ -277,7 +277,7 @@
 
 static bool is_ciph_required(struct proc_arq_priv *par)
 {
-	return par->ciphering_required != VLR_CIPH_NONE;
+	return par->ciphering_required;
 }
 
 static void _proc_arq_vlr_node2(struct osmo_fsm_inst *fi)
@@ -311,8 +311,7 @@
 	/* The cases where the authentication procedure should be used
 	 * are defined in 3GPP TS 33.102 */
 	/* For now we use a default value passed in to vlr_lu_fsm(). */
-	return par->authentication_required
-	       || (par->ciphering_required != VLR_CIPH_NONE);
+	return par->authentication_required || par->ciphering_required;
 }
 
 /* after the IMSI is known */
@@ -654,7 +653,7 @@
 		 enum vlr_parq_type type, const uint8_t *mi_lv,
 		 const struct osmo_location_area_id *lai,
 		 bool authentication_required,
-		 enum vlr_ciph ciphering_required,
+		 bool ciphering_required,
 		 bool is_r99, bool is_utran)
 {
 	struct osmo_fsm_inst *fi;
diff --git a/src/libvlr/vlr_lu_fsm.c b/src/libvlr/vlr_lu_fsm.c
index e540e2a..6c8b53a 100644
--- a/src/libvlr/vlr_lu_fsm.c
+++ b/src/libvlr/vlr_lu_fsm.c
@@ -644,7 +644,7 @@
 	struct osmo_location_area_id old_lai;
 	struct osmo_location_area_id new_lai;
 	bool authentication_required;
-	enum vlr_ciph ciphering_required;
+	bool ciphering_required;
 	bool is_r99;
 	bool is_utran;
 	bool assign_tmsi;
@@ -665,14 +665,13 @@
 	/* The cases where the authentication procedure should be used
 	 * are defined in 3GPP TS 33.102 */
 	/* For now we use a default value passed in to vlr_lu_fsm(). */
-	return lfp->authentication_required
-	       || (lfp->ciphering_required != VLR_CIPH_NONE);
+	return lfp->authentication_required || lfp->ciphering_required;
 }
 
 /* Determine if ciphering is required */
 static bool is_ciph_required(struct lu_fsm_priv *lfp)
 {
-	return lfp->ciphering_required != VLR_CIPH_NONE;
+	return lfp->ciphering_required;
 }
 
 /* Determine if a HLR Update is required */
@@ -1391,7 +1390,7 @@
 	       const struct osmo_location_area_id *old_lai,
 	       const struct osmo_location_area_id *new_lai,
 	       bool authentication_required,
-	       enum vlr_ciph ciphering_required,
+	       bool ciphering_required,
 	       bool is_r99, bool is_utran,
 	       bool assign_tmsi)
 {