fix BSSMAP Cipher Mode Cmd: properly set permitted algorithms

The bit shifting is performed in gsm0808_enc_encrypt_info(), and must not be
done when populating the gsm0808_encrypt_info struct.

Provide vlr_ciph_to_gsm0808_alg_id() to translate the enum vlr_ciph to the
GSM0808_* constants we need to put in the gsm0808_encrypt_info struct instead.

Related: OS#2745
Change-Id: If75f95e8a5cc8b9979610ce6d746c1f0073ee39a
This commit is contained in:
Neels Hofmeyr 2017-12-14 03:57:31 +01:00
parent 4cf4fddf28
commit cf30913c8e
2 changed files with 17 additions and 1 deletions

View File

@ -7,6 +7,7 @@
#include <osmocom/gsm/protocol/gsm_23_003.h>
#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
#include <osmocom/gsm/gsm23003.h>
#include <osmocom/gsm/gsm0808.h>
#include <osmocom/msc/gsm_data.h>
// for GSM_NAME_LENGTH
#include <osmocom/msc/gsm_subscriber.h>
@ -172,6 +173,21 @@ enum vlr_ciph {
VLR_CIPH_A5_3, /*< A5/3, 'new secure' encryption */
};
static inline uint8_t vlr_ciph_to_gsm0808_alg_id(enum vlr_ciph ciph)
{
switch (ciph) {
default:
case VLR_CIPH_NONE:
return GSM0808_ALG_ID_A5_0;
case VLR_CIPH_A5_1:
return GSM0808_ALG_ID_A5_1;
case VLR_CIPH_A5_2:
return GSM0808_ALG_ID_A5_2;
case VLR_CIPH_A5_3:
return GSM0808_ALG_ID_A5_3;
}
}
struct vlr_ops {
/* encode + transmit an AUTH REQ towards the MS.
* \param[in] at auth tuple providing rand, key_seq and autn.

View File

@ -198,7 +198,7 @@ int a_iface_tx_cipher_mode(const struct gsm_subscriber_connection *conn,
if (include_imeisv)
crm_ptr = &crm;
ei.perm_algo[0] = (uint8_t) (1 << cipher);
ei.perm_algo[0] = vlr_ciph_to_gsm0808_alg_id(cipher);
ei.perm_algo_len = 1;
msg_resp = gsm0808_create_cipher(&ei, crm_ptr);