summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2017-12-16 17:52:31 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2018-03-14 22:22:39 +0700
commita4d255269a7d4e58d2ec0fbb42483495b8c247c9 (patch)
tree0f7100028dc7eadbcf465aad5131f8517c0f09ac
parent8b9d3170ff265c934f6271bd445ff5a6788ffffb (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
-rw-r--r--include/l1ctl_proto.h1
-rw-r--r--src/host/layer23/include/osmocom/bb/common/l1ctl.h4
-rw-r--r--src/host/layer23/src/common/l1ctl.c8
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c12
-rw-r--r--src/target/firmware/layer1/l23_api.c5
5 files changed, 19 insertions, 11 deletions
diff --git a/include/l1ctl_proto.h b/include/l1ctl_proto.h
index 17065349..9d548bc4 100644
--- a/include/l1ctl_proto.h
+++ b/include/l1ctl_proto.h
@@ -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));
diff --git a/src/host/layer23/include/osmocom/bb/common/l1ctl.h b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
index 3534589d..824b1b03 100644
--- a/src/host/layer23/include/osmocom/bb/common/l1ctl.h
+++ b/src/host/layer23/include/osmocom/bb/common/l1ctl.h
@@ -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,
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);
diff --git a/src/target/firmware/layer1/l23_api.c b/src/target/firmware/layer1/l23_api.c
index 311ca6a2..e53b0c8f 100644
--- a/src/target/firmware/layer1/l23_api.c
+++ b/src/target/firmware/layer1/l23_api.c
@@ -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;
}