fix(nimble): Fixed error in writing signed write value when IRK is shared along with CSRK

This commit is contained in:
Sumeet Singh
2024-10-11 12:11:05 +05:30
committed by Rahul Tank
parent 36d16f1e59
commit d207de68f5
+66 -60
View File
@@ -2650,42 +2650,42 @@ ble_sm_fail_rx(uint16_t conn_handle, struct os_mbuf **om,
int
ble_sm_incr_our_sign_counter(uint16_t conn_handle)
{
struct ble_store_key_sec key_sec;
struct ble_store_value_sec value_sec;
struct ble_gap_conn_desc desc;
int rc;
struct ble_store_key_sec key_sec;
struct ble_store_value_sec value_sec;
struct ble_gap_conn_desc desc;
int rc;
rc = ble_gap_conn_find(conn_handle, &desc);
if (rc != 0) {
return rc;
}
rc = ble_gap_conn_find(conn_handle, &desc);
if (rc != 0) {
return rc;
}
memset(&key_sec, 0, sizeof key_sec);
key_sec.peer_addr = desc.peer_id_addr;
memset(&key_sec, 0, sizeof key_sec);
key_sec.peer_addr = desc.peer_id_addr;
rc = ble_store_read_our_sec(&key_sec, &value_sec);
if (rc != 0) {
return rc;
}
if (value_sec.csrk_present != 1) {
return BLE_HS_ENOENT;
}
if (value_sec.sign_counter == (uint32_t)0xffffffff) {
return BLE_HS_ENOMEM;
}
rc = ble_store_read_our_sec(&key_sec, &value_sec);
if (rc != 0) {
return rc;
}
if (value_sec.csrk_present != 1) {
return BLE_HS_ENOENT;
}
if (value_sec.sign_counter == (uint32_t)0xffffffff) {
return BLE_HS_ENOMEM;
}
rc = ble_store_delete_our_sec(&key_sec);
if (rc != 0) {
return rc;
}
rc = ble_store_delete_our_sec(&key_sec);
if (rc != 0) {
return rc;
}
value_sec.sign_counter += 1;
rc = ble_store_write_our_sec(&value_sec);
if (rc != 0) {
return rc;
}
value_sec.sign_counter += 1;
rc = ble_store_write_our_sec(&value_sec);
if (rc != 0) {
return rc;
}
return 0;
return 0;
}
/**
@@ -2700,42 +2700,48 @@ ble_sm_incr_our_sign_counter(uint16_t conn_handle)
int
ble_sm_incr_peer_sign_counter(uint16_t conn_handle)
{
struct ble_store_key_sec key_sec;
struct ble_store_value_sec value_sec;
struct ble_gap_conn_desc desc;
int rc;
struct ble_store_key_sec key_sec;
struct ble_store_value_sec value_sec;
struct ble_gap_conn_desc desc;
int rc;
rc = ble_gap_conn_find(conn_handle, &desc);
if (rc != 0) {
return rc;
}
rc = ble_gap_conn_find(conn_handle, &desc);
if (rc != 0) {
return rc;
}
memset(&key_sec, 0, sizeof key_sec);
key_sec.peer_addr = desc.peer_id_addr;
memset(&key_sec, 0, sizeof key_sec);
key_sec.peer_addr = desc.peer_id_addr;
rc = ble_store_read_peer_sec(&key_sec, &value_sec);
if (rc != 0) {
return rc;
}
if (value_sec.csrk_present != 1) {
return BLE_HS_ENOENT;
}
if (value_sec.sign_counter == (uint32_t)0xffffffff) {
return BLE_HS_ENOMEM;
}
rc = ble_store_read_peer_sec(&key_sec, &value_sec);
if (rc != 0) {
return rc;
}
if (value_sec.csrk_present != 1) {
return BLE_HS_ENOENT;
}
if (value_sec.sign_counter == (uint32_t)0xffffffff) {
return BLE_HS_ENOMEM;
}
rc = ble_store_delete_peer_sec(&key_sec);
if (rc != 0) {
return rc;
}
rc = ble_store_delete_peer_sec(&key_sec);
if (rc != 0) {
return rc;
}
value_sec.sign_counter += 1;
rc = ble_store_write_peer_sec(&value_sec);
if (rc != 0) {
return rc;
}
if (value_sec.irk_present == 1) {
ble_hs_pvcy_remove_entry(value_sec.peer_addr.type, value_sec.peer_addr.val);
// No need to check if the above command fails or passes
// Proceed with trying to write the new sign counter
}
return 0;
value_sec.sign_counter += 1;
rc = ble_store_write_peer_sec(&value_sec);
if (rc != 0) {
return rc;
}
return 0;
}
/**