Skip to content

Commit

Permalink
L1CTL/L1CTL_CRYPTO_REQ: add key length and channel info
Browse files Browse the repository at this point in the history
Previously, the L1CTL_CRYPTO_REQ message contained only a ciphering
algorithm and actual Kc key to be used. The key length was
calculated manually using the MSGB API.

Let's avoid manual calculations here, as it may cause unexpected
behavior if the message structure is changed. Also, let's fill
the UL header with minimal information about a channel, which
is going to be encrypted.

Change-Id: I5fab079907c5276322d3ec2b46cab81f10c7ed09
  • Loading branch information
axilirator committed Mar 14, 2018
1 parent 8b9d317 commit a4d2552
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 11 deletions.
1 change: 1 addition & 0 deletions include/l1ctl_proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ struct l1ctl_dm_freq_req {

struct l1ctl_crypto_req {
uint8_t algo;
uint8_t key_len;
uint8_t key[0];
} __attribute__((packed));

Expand Down
4 changes: 2 additions & 2 deletions src/host/layer23/include/osmocom/bb/common/l1ctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ int l1ctl_tx_data_req(struct osmocom_ms *ms, struct msgb *msg, uint8_t chan_nr,
/* Transmit L1CTL_PARAM_REQ */
int l1ctl_tx_param_req(struct osmocom_ms *ms, uint8_t ta, uint8_t tx_power);

int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t algo, uint8_t *key,
uint8_t len);
int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t chan_nr,
uint8_t algo, uint8_t *key, uint8_t len);

/* Transmit L1CTL_RACH_REQ */
int l1ctl_tx_rach_req(struct osmocom_ms *ms, uint8_t ra, uint16_t offset,
Expand Down
8 changes: 6 additions & 2 deletions src/host/layer23/src/common/l1ctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -427,8 +427,8 @@ int l1ctl_tx_param_req(struct osmocom_ms *ms, uint8_t ta, uint8_t tx_power)
}

/* Transmit L1CTL_CRYPTO_REQ */
int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t algo, uint8_t *key,
uint8_t len)
int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t chan_nr,
uint8_t algo, uint8_t *key, uint8_t len)
{
struct msgb *msg;
struct l1ctl_info_ul *ul;
Expand All @@ -441,7 +441,11 @@ int l1ctl_tx_crypto_req(struct osmocom_ms *ms, uint8_t algo, uint8_t *key,
DEBUGP(DL1C, "CRYPTO Req. algo=%d, len=%d\n", algo, len);
ul = (struct l1ctl_info_ul *) msgb_put(msg, sizeof(*ul));
req = (struct l1ctl_crypto_req *) msgb_put(msg, sizeof(*req) + len);

ul->chan_nr = chan_nr;
req->key_len = len;
req->algo = algo;

if (len)
memcpy(req->key, key, len);

Expand Down
12 changes: 8 additions & 4 deletions src/host/layer23/src/mobile/gsm48_rr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1005,9 +1005,11 @@ static int gsm48_rr_rx_cip_mode_cmd(struct osmocom_ms *ms, struct msgb *msg)
rr->cipher_on = sc;
rr->cipher_type = alg_id;
if (rr->cipher_on)
l1ctl_tx_crypto_req(ms, rr->cipher_type + 1, subscr->key, 8);
l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
rr->cipher_type + 1, subscr->key, 8);
else
l1ctl_tx_crypto_req(ms, 0, NULL, 0);
l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
0, NULL, 0);

/* response (using the new mode) */
return gsm48_rr_tx_cip_mode_cpl(ms, cr);
Expand Down Expand Up @@ -2996,7 +2998,8 @@ static int gsm48_rr_activate_channel(struct osmocom_ms *ms,
s->si5 = s->si5bis = s->si5ter = s->si6 = 0;

if (rr->cipher_on)
l1ctl_tx_crypto_req(ms, rr->cipher_type + 1, subscr->key, 8);
l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
rr->cipher_type + 1, subscr->key, 8);

return 0;
}
Expand All @@ -3015,7 +3018,8 @@ static int gsm48_rr_channel_after_time(struct osmocom_ms *ms,
l1ctl_tx_dm_freq_req_h0(ms, cd->arfcn, cd->tsc, fn);

if (rr->cipher_on)
l1ctl_tx_crypto_req(ms, rr->cipher_type + 1, subscr->key, 8);
l1ctl_tx_crypto_req(ms, rr->cd_now.chan_nr,
rr->cipher_type + 1, subscr->key, 8);

gsm48_rr_set_mode(ms, cd->chan_nr, cd->mode);

Expand Down
5 changes: 2 additions & 3 deletions src/target/firmware/layer1/l23_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,11 +301,10 @@ static void l1ctl_rx_crypto_req(struct msgb *msg)
struct l1ctl_hdr *l1h = (struct l1ctl_hdr *) msg->data;
struct l1ctl_info_ul *ul = (struct l1ctl_info_ul *) l1h->data;
struct l1ctl_crypto_req *cr = (struct l1ctl_crypto_req *) ul->payload;
uint8_t key_len = msg->len - sizeof(*l1h) - sizeof(*ul) - sizeof(*cr);

printd("L1CTL_CRYPTO_REQ (algo=A5/%u, len=%u)\n", cr->algo, key_len);
printd("L1CTL_CRYPTO_REQ (algo=A5/%u, len=%u)\n", cr->algo, cr->key_len);

if (cr->algo && key_len != 8) {
if (cr->algo && cr->key_len != 8) {
printd("L1CTL_CRYPTO_REQ -> Invalid key\n");
return;
}
Expand Down

0 comments on commit a4d2552

Please sign in to comment.