[PATCH] osmocom-bb[master]: L1CTL/L1CTL_CRYPTO_REQ: add key length and channel info

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Vadim Yanitskiy gerrit-no-reply at lists.osmocom.org
Wed Mar 14 15:23:15 UTC 2018


Review at  https://gerrit.osmocom.org/7284

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
---
M include/l1ctl_proto.h
M src/host/layer23/include/osmocom/bb/common/l1ctl.h
M src/host/layer23/src/common/l1ctl.c
M src/host/layer23/src/mobile/gsm48_rr.c
M src/target/firmware/layer1/l23_api.c
5 files changed, 19 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/84/7284/1

diff --git a/include/l1ctl_proto.h b/include/l1ctl_proto.h
index 1706534..9d548bc 100644
--- a/include/l1ctl_proto.h
+++ b/include/l1ctl_proto.h
@@ -281,6 +281,7 @@
 
 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 3534589..824b1b0 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 @@
 /* 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 c75872e..c90588e 100644
--- a/src/host/layer23/src/common/l1ctl.c
+++ b/src/host/layer23/src/common/l1ctl.c
@@ -427,8 +427,8 @@
 }
 
 /* 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 @@
 	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 f4b9500..dd3fe93 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -1005,9 +1005,11 @@
 	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 @@
 	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 @@
 		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 311ca6a..e53b0c8 100644
--- a/src/target/firmware/layer1/l23_api.c
+++ b/src/target/firmware/layer1/l23_api.c
@@ -301,11 +301,10 @@
 	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;
 	}

-- 
To view, visit https://gerrit.osmocom.org/7284
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5fab079907c5276322d3ec2b46cab81f10c7ed09
Gerrit-PatchSet: 1
Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Owner: Vadim Yanitskiy <axilirator at gmail.com>



More information about the gerrit-log mailing list