populate gsm_subscriber_connection->encr during Ciph

The gsm_subscriber_connection->encr is never used. Use it.

When sending the Ciphering Mode Command, populate the encryption key.
When receivint the Ciphering Mode Complete, populate the chosen alg_id.

Out of paranoia, store the enc key only if the size is large enough.

Hence the vty_dump_one_conn() now reports the actually chosen A5 algorithm ID
used.

For 3G connections, though, this will still remain 0 in the VTY, since there is
no explicit A5 algorithm negotiated on UTRAN. (Security Mode Command and
Security Mode Complete instead of the GERAN Ciphering.)

(Note, 'struct gsm_encr encr' will be renamed to 'struct geran_encr geran_encr'
in Idc7ca9da1aa13ae16f5db2cb1024676cbc770820)

Change-Id: Ice2c470c360612249f97301944c6fdf9443c7dce
This commit is contained in:
Neels Hofmeyr 2018-11-29 23:37:19 +01:00
parent dbaab50da3
commit b0779bbcab
2 changed files with 9 additions and 0 deletions

View File

@ -1663,6 +1663,13 @@ int msc_geran_set_cipher_mode(struct gsm_subscriber_connection *conn, bool umts_
memcpy(ei.key, tuple->vec.kc, sizeof(tuple->vec.kc));
ei.key_len = sizeof(tuple->vec.kc);
conn->encr = (struct gsm_encr){};
if (ei.key_len <= sizeof(conn->encr.key)) {
memcpy(conn->encr.key, ei.key, ei.key_len);
conn->encr.key_len = ei.key_len;
}
/* conn->encr.alg_id remains unknown until we receive a Cipher Mode Complete from the BSC */
return a_iface_tx_cipher_mode(conn, &ei, retrieve_imeisv);
}

View File

@ -222,6 +222,8 @@ void msc_cipher_mode_compl(struct gsm_subscriber_connection *conn,
}
}
conn->encr.alg_id = alg_id;
ciph_res.cause = VLR_CIPH_COMPL;
vlr_subscr_rx_ciph_res(conn->vsub, &ciph_res);
}