diff mbox series

[BlueZ,2/2] device: Update local and remote CSRK on management event

Message ID 20240123121519.523735-2-frederic.danis@collabora.com
State New
Headers show
Series [BlueZ,1/2] gatt-server: Add support for signed write command | expand

Commit Message

Frédéric Danis Jan. 23, 2024, 12:15 p.m. UTC
The local and remote CSRK keys are only loaded from storage during start.

Those keys should be updated on MGMT_EV_NEW_CSRK event to be able to
perform signed write for GAP/SEC/CSIGN/BV-02-C.
---
 src/adapter.c |  2 ++
 src/device.c  | 16 ++++++++++++++++
 src/device.h  |  2 ++
 3 files changed, 20 insertions(+)
diff mbox series

Patch

diff --git a/src/adapter.c b/src/adapter.c
index 022390f0d..fb71ef83e 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -8882,6 +8882,8 @@  static void new_csrk_callback(uint16_t index, uint16_t length,
 		return;
 	}
 
+	device_set_csrk(device, key->val, key->type & 0x01);
+
 	if (!ev->store_hint)
 		return;
 
diff --git a/src/device.c b/src/device.c
index 17bcfbc49..34f64ca5b 100644
--- a/src/device.c
+++ b/src/device.c
@@ -1955,6 +1955,22 @@  bool btd_device_get_ltk(struct btd_device *device, uint8_t key[16],
 	return true;
 }
 
+void device_set_csrk(struct btd_device *device, const uint8_t val[16],
+				bool remote)
+{
+	if (remote) {
+		g_free(device->remote_csrk);
+		device->remote_csrk = g_new0(struct csrk_info, 1);
+		memcpy(device->remote_csrk->key, val,
+		       sizeof(device->remote_csrk->key));
+	} else {
+		g_free(device->local_csrk);
+		device->local_csrk = g_new0(struct csrk_info, 1);
+		memcpy(device->local_csrk->key, val,
+		       sizeof(device->local_csrk->key));
+	}
+}
+
 static bool match_sirk(const void *data, const void *match_data)
 {
 	const struct sirk_info *sirk = data;
diff --git a/src/device.h b/src/device.h
index 8bb38669d..d00c002c3 100644
--- a/src/device.h
+++ b/src/device.h
@@ -134,6 +134,8 @@  void device_set_ltk(struct btd_device *device, const uint8_t val[16],
 				bool central, uint8_t enc_size);
 bool btd_device_get_ltk(struct btd_device *device, uint8_t val[16],
 				bool *central, uint8_t *enc_size);
+void device_set_csrk(struct btd_device *device, const uint8_t val[16],
+				bool remote);
 bool btd_device_add_set(struct btd_device *device, bool encrypted,
 				uint8_t sirk[16], uint8_t size, uint8_t rank);
 void device_store_svc_chng_ccc(struct btd_device *device, uint8_t bdaddr_type,