Hi all,
I use nRF52832-QFAA, S132 2.0.0, SDK 11.0.0, IAR 7.5, Windows
Upon connection, I am trying to resolve the peer "random private resolvable" address (not for whitelisting, just to check who I am connected to).
I have most information needed, but I don't know where to get the IRKs array. Can someone help?
Thanks,
Gil
Code is below:
void generate_address_checksum(uint8_t * p_random, uint8_t * p_checksum, uint8_t * p_irk_array)
{
nrf_ecb_hal_data_t encryption_data = {0};
uint32_t errcode;
uint8_t i;
/* Reverse the array as the ECB expect it in big endian format */
for (i=0; i<sizeof(encryption_data.key); i++)
{
encryption_data.key[i] = p_irk_array[sizeof(encryption_data.key)-1-i];
if (i < 3)
{
encryption_data.cleartext[15-i] = p_random[i];
}
}
errcode = sd_ecb_block_encrypt(&encryption_data);
if(errcode)
{
ASSERT(false);
}
for (i=0; i<3; i++)
{
p_checksum[i] = encryption_data.ciphertext[15-i];
}
}
bool ble_get_peer_address(ble_gap_addr_t orig_address, ble_gap_addr_t * res_address, uint8_t * p_irk_array)
{
ble_gap_addr_t tmp_addr;
bool result = false;
if (orig_address.addr_type == BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE)
{
memcpy(&tmp_addr.addr[3], &orig_address.addr[3], 3);
generate_address_checksum(&tmp_addr.addr[3], &tmp_addr.addr[0], p_irk_array);
if (memcmp(orig_address.addr, tmp_addr.addr, sizeof(orig_address.addr)) == 0)
{
// Save address
memcpy(res_address->addr, tmp_addr.addr, sizeof(res_address->addr));
result = true;
}
}
return result;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void ble_conn_on_ble_evt(ble_evt_t * p_ble_evt)
{
ble_gap_addr_t tmp_addr;
uint8_t *p_irk_array = NULL;
if (p_ble_evt->header.evt_id == BLE_GAP_EVT_CONNECTED)
{
// update connection handle
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
// update stats
g_ble_conn_stats.conn_req++;
g_ble_conn_stats.last_conn_ticks = get_tickcount();
// Incorrect ... not resolved yet
/*
g_ble_conn_stats.central_mac0 = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
g_ble_conn_stats.central_mac1 = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
g_ble_conn_stats.central_mac2 = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
g_ble_conn_stats.central_mac3 = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
g_ble_conn_stats.central_mac4 = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
g_ble_conn_stats.central_mac5 = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
*/
// Must resolve it first:
// Match flag
//p_ble_evt->evt.gap_evt.params.connected.irk_match;
// Index
//p_ble_evt->evt.gap_evt.params.connected.irk_match_idx;
// Missing: Get p_irk_array somewhere!!! Please HELP!!!
// Then...
if (ble_get_peer_address(p_ble_evt->evt.gap_evt.params.connected.peer_addr,
&tmp_addr,
p_irk_array))
{
g_ble_conn_stats.central_mac0 = tmp_addr.addr[5];
g_ble_conn_stats.central_mac1 = tmp_addr.addr[4];
g_ble_conn_stats.central_mac2 = tmp_addr.addr[3];
g_ble_conn_stats.central_mac3 = tmp_addr.addr[2];
g_ble_conn_stats.central_mac4 = tmp_addr.addr[1];
g_ble_conn_stats.central_mac5 = tmp_addr.addr[0];
}
else
{
g_ble_conn_stats.central_mac0 = 0;
g_ble_conn_stats.central_mac1 = 0;
g_ble_conn_stats.central_mac2 = 0;
g_ble_conn_stats.central_mac3 = 0;
g_ble_conn_stats.central_mac4 = 0;
g_ble_conn_stats.central_mac5 = 0;
}
...
}