bt_gatt: Unable to import the key for AES CMAC -141

I am using a dynamic BAS service. I have noticed that after a few bt_gatt_service_unregister() and bt_gatt_service_register() calls, the following error occurs:
bt_gatt: Unable to import the key for AES CMAC -141.

It appears that the problem is caused by bt_gatt_service_register() calling psa_import_key() without freeing the allocated memory during bt_gatt_service_unregister()

I have added some logs to psa_crypto.c:

*** Booting My Application v2.0.99-b2bc05116228 ***
*** Using nRF Connect SDK v3.0.2-89ba1294ac9b ***
*** Using Zephyr OS v4.0.99-f791c49f492c ***
<inf> main_app: Application started
<inf> bt_sdc_hci_driver: SoftDevice Controller build revision:
                                            89 9a 50 8a 95 01 9c 58  fc 39 d2 c1 10 04 ee 02 |..P....X .9......
                                            64 ce 25 be                                      |d.%.
<inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
<inf> bt_hci_core: HW Variant: nRF52x (0x0002)
<inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 137.20634 Build 2617349514
<inf> bt_hci_core: No ID address. App must call settings_load()
<inf> bt_hci_core: Identity: E2:09:BC:9E:13:5E (random)
<inf> bt_hci_core: HCI: version 6.0 (0x0e) revision 0x10f3, manufacturer 0x0059
<inf> bt_hci_core: LMP: version 6.0 (0x0e) subver 0x10f3

<err> psa_crypto_srvc: === IMPORT KEY ===
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=0 peak=0
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=16 peak=16

<err> bas: SVC REGISTER
<err> psa_crypto_srvc: === REMOVE KEY DATA ===
<err> psa_crypto_srvc: === IMPORT KEY ===
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=16 peak=48

<err> bas: SVC UNREGISTER
<err> bas: SVC REGISTER
<err> psa_crypto_srvc: === IMPORT KEY ===
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=32 peak=48

<err> bas: SVC UNREGISTER
<err> bas: SVC REGISTER
<err> psa_crypto_srvc: === IMPORT KEY ===
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=48 peak=48

<err> bas: SVC UNREGISTER
<err> bas: SVC REGISTER
<err> psa_crypto_srvc: === IMPORT KEY ===
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=64 peak=64

...

<err> bas: SVC UNREGISTER
<err> bas: SVC REGISTER
<err> psa_crypto_srvc: === IMPORT KEY ===
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=144 peak=144

<err> psa_crypto_srvc: ==== IMPORT KEY ====
<err> psa_crypto_srvc: === PSA KEYS: tracked_cur=160 peak=160
<err> psa_crypto_srvc: === mbedtls_calloc failed ===
<err> psa_crypto_srvc: === PSA allocate buffer failed ===
<err> psa_crypto_srvc: === REMOVE KEY DATA ===
<err> bt_gatt: Unable to import the key for AES CMAC -141

Code snippet:

static void register_bas(void)
{
	for (size_t i = 0; i < ARRAY_SIZE(batteries); i++) {
		struct battery *battery = &batteries[i];

		if (!battery->registered) {
			LOG_ERR("SVC REGISTER");
			const int ret = bt_gatt_service_register(battery->svc);
			if (ret) {
				LOG_ERR("Can't register bas: %d", ret);
				continue;
			}
		}

		battery->registered = true;
	}
}

static void unregister_bas(void)
{
	for (size_t i = 0; i < ARRAY_SIZE(batteries); i++) {
		if (batteries[i].registered) {
			LOG_ERR("SVC UNREGISTER");
			const int ret = bt_gatt_service_unregister(batteries[i].svc);
			if (ret) {
				LOG_ERR("Can't unregister bas: %d", ret);
			} else {
				batteries[i].registered = false;
			}
		}
	}
}

Parents Reply Children
Related