mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-06-06 05:14:45 +00:00
fix(nimble): Fixed error in writing signed write value when IRK is shared along with CSRK
This commit is contained in:
+66
-60
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user