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;
}
}
}
}