diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2017-12-16 17:52:31 +0700 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2018-03-14 22:22:39 +0700 |
commit | a4d255269a7d4e58d2ec0fbb42483495b8c247c9 (patch) | |
tree | 0f7100028dc7eadbcf465aad5131f8517c0f09ac /src/host/layer23/src | |
parent | 8b9d3170ff265c934f6271bd445ff5a6788ffffb (diff) |
L1CTL/L1CTL_CRYPTO_REQ: add key length and channel info
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
Diffstat (limited to 'src/host/layer23/src')
-rw-r--r-- | src/host/layer23/src/common/l1ctl.c | 8 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/gsm48_rr.c | 12 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/host/layer23/src/common/l1ctl.c b/src/host/layer23/src/common/l1ctl.c index c75872e4..c90588ea 100644 --- a/src/host/layer23/src/common/l1ctl.c +++ b/src/host/layer23/src/common/l1ctl.c @@ -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; @@ -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); diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c index f4b95002..dd3fe933 100644 --- a/src/host/layer23/src/mobile/gsm48_rr.c +++ b/src/host/layer23/src/mobile/gsm48_rr.c @@ -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); @@ -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; } @@ -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); |