Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4e2d19b9 authored by Andre Eisenbach's avatar Andre Eisenbach
Browse files

LE: Do not remove bond on encryption failure

If the encryption fails during the re-connection process with a
previously paired LE device, the pairing is removed. Thus, a single
connection failure could lead to the device be unpaired.

This patch prevents unpairing when encryption fails.

Additionally, the IRK is restored from NV ram to fix reconnection to
dual-mode devices.

Bug: 18072300
Change-Id: I077a16d0715fdaa07b95b1c664c18bd839754896
parent 48868156
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -90,6 +90,13 @@ typedef struct

}btif_dm_ble_lcsrk_keys_t;

typedef struct
{
    BT_OCTET16          irk;
    tBLE_ADDR_TYPE      addr_type;
    BD_ADDR             static_addr;
}btif_dm_ble_pid_keys_t;

typedef struct
{
    BOOLEAN                   is_penc_key_rcvd;
@@ -97,7 +104,7 @@ typedef struct
    BOOLEAN                   is_pcsrk_key_rcvd;
    btif_dm_ble_pcsrk_keys_t  pcsrk_key;       /* received peer device SRK */
    BOOLEAN                   is_pid_key_rcvd;
    UINT8                     pid_key[BT_OCTET16_LEN];        /* peer device ID key */
    btif_dm_ble_pid_keys_t    pid_key;        /* peer device ID key */
    BOOLEAN                   is_lenc_key_rcvd;
    btif_dm_ble_lenc_keys_t   lenc_key;       /* local encryption reproduction keys LTK = = d1(ER,DIV,0)*/
    BOOLEAN                   is_lcsrk_key_rcvd;
+13 −4
Original line number Diff line number Diff line
@@ -1723,10 +1723,19 @@ static void btif_dm_upstreams_evt(UINT16 event, char* p_param)
                case BTA_LE_KEY_PID:
                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PID");
                    pairing_cb.ble.is_pid_key_rcvd = TRUE;
                    memcpy(pairing_cb.ble.pid_key, p_data->ble_key.key_value.pid_key.irk, 16);
                    pairing_cb.ble.pid_key.addr_type = p_data->ble_key.key_value.pid_key.addr_type;
                    memcpy(pairing_cb.ble.pid_key.irk, p_data->ble_key.key_value.pid_key.irk, 16);
                    memcpy(pairing_cb.ble.pid_key.static_addr,
                            p_data->ble_key.key_value.pid_key.static_addr,BD_ADDR_LEN);
                    for (i=0; i<16; i++)
                    {
                        BTIF_TRACE_DEBUG("pairing_cb.ble.pid_key[%d]=0x%02x",i,pairing_cb.ble.pid_key[i]);
                        BTIF_TRACE_DEBUG("pairing_cb.ble.pid_key.irk[%d]=0x%02x"
                                            ,i,pairing_cb.ble.pid_key.irk[i]);
                    }
                    for (i=0; i<BD_ADDR_LEN; i++)
                    {
                        BTIF_TRACE_DEBUG("piaring_cb.ble.pid_address[%d] = %x"
                                            ,i, pairing_cb.ble.pid_key.static_addr[i]);
                    }
                    break;

@@ -2880,9 +2889,9 @@ void btif_dm_save_ble_bonding_keys(void)
    if (pairing_cb.ble.is_pid_key_rcvd)
    {
        btif_storage_add_ble_bonding_key(&bd_addr,
                                         (char *) &pairing_cb.ble.pid_key[0],
                                         (char *) &pairing_cb.ble.pid_key,
                                         BTIF_DM_LE_KEY_PID,
                                         BT_OCTET16_LEN);
                                         sizeof(btif_dm_ble_pid_keys_t));
    }


+2 −6
Original line number Diff line number Diff line
@@ -48,8 +48,6 @@ static unsigned char BASE_UUID[16] = {
    0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

extern bt_status_t btif_dm_remove_bond(const bt_bdaddr_t *bd_addr);

int uuidType(unsigned char* p_uuid)
{
    int i = 0;
@@ -297,14 +295,12 @@ static BOOLEAN btif_gatt_is_link_encrypted (BD_ADDR bd_addr)

static void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result)
{
    UNUSED(bd_addr);
    UNUSED(transport);

    if (result != BTA_SUCCESS && result != BTA_BUSY)
    {
        bt_bdaddr_t bda;
        bdcpy(bda.address, bd_addr);

        btif_dm_remove_bond(&bda);
        BTIF_TRACE_WARNING("%s() - Encryption failed (%d)", __FUNCTION__, result);
    }
}

+9 −2
Original line number Diff line number Diff line
@@ -1225,7 +1225,7 @@ bt_status_t btif_in_fetch_bonded_ble_device(char *remote_bd_addr,int add, btif_b
            if (btif_storage_get_ble_bonding_key(&bd_addr,
                                                 BTIF_DM_LE_KEY_PID,
                                                 buf,
                                                 sizeof(btif_dm_ble_pcsrk_keys_t)) == BT_STATUS_SUCCESS)
                                                 sizeof(btif_dm_ble_pid_keys_t)) == BT_STATUS_SUCCESS)
            {
                if(add)
                {
@@ -1237,7 +1237,14 @@ bt_status_t btif_in_fetch_bonded_ble_device(char *remote_bd_addr,int add, btif_b
                    p = (tBTA_LE_KEY_VALUE *)buf;
                    for (i=0; i<16; i++)
                    {
                        BTIF_TRACE_DEBUG("p->pid_key[%d]=0x%02x",i,p->pid_key.irk[i]);
                        BTIF_TRACE_DEBUG("p->pid_key.irk[%d]=0x%02x"
                                            ,i,p->pid_key.irk[i]);
                    }
                    BTIF_TRACE_DEBUG("p->pid_key.addr_type=%d",p->pid_key.addr_type);
                    for (i=0; i<BD_ADDR_LEN; i++)
                    {
                        BTIF_TRACE_DEBUG("p->pid_key.static_addr[%d]=%02x"
                                            ,i,p->pid_key.static_addr[i]);
                    }

                    BTA_DmAddBleKey (bta_bd_addr, (tBTA_LE_KEY_VALUE *)buf, BTIF_DM_LE_KEY_PID);
+0 −3
Original line number Diff line number Diff line
@@ -1615,9 +1615,6 @@ void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role,

    if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched)
        memcpy(p_dev_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);

    if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
        btm_ble_vendor_disable_irk_list();
#endif

    if (role == HCI_ROLE_SLAVE)
Loading