LE Privacy 1.2 and LE secure connections

Bug: 19816438
Original author: Chaojing Sun <cjsun@broadcom.com>
Change-Id: I5951f4d4e038f8348a62aa6d19b2111bae0b3ecc
diff --git a/btif/src/btif_dm.c b/btif/src/btif_dm.c
index 7a7ec01..2e687e1 100644
--- a/btif/src/btif_dm.c
+++ b/btif/src/btif_dm.c
@@ -228,6 +228,7 @@
 static void btif_dm_ble_key_notif_evt(tBTA_DM_SP_KEY_NOTIF *p_ssp_key_notif);
 static void btif_dm_ble_auth_cmpl_evt (tBTA_DM_AUTH_CMPL *p_auth_cmpl);
 static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ *p_pin_req);
+static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF *p_notif_req) ;
 #endif
 
 static void bte_scan_filt_param_cfg_evt(UINT8 action_type,
@@ -1758,31 +1759,41 @@
                 case BTA_LE_KEY_PENC:
                     BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PENC");
                     pairing_cb.ble.is_penc_key_rcvd = TRUE;
-                    memcpy(pairing_cb.ble.penc_key.ltk,p_data->ble_key.key_value.penc_key.ltk, 16);
-                    memcpy(pairing_cb.ble.penc_key.rand, p_data->ble_key.key_value.penc_key.rand,8);
-                    pairing_cb.ble.penc_key.ediv = p_data->ble_key.key_value.penc_key.ediv;
-                    pairing_cb.ble.penc_key.sec_level = p_data->ble_key.key_value.penc_key.sec_level;
+                    memcpy(pairing_cb.ble.penc_key.ltk,
+                           p_data->ble_key.p_key_value->penc_key.ltk, 16);
+                    memcpy(pairing_cb.ble.penc_key.rand,
+                           p_data->ble_key.p_key_value->penc_key.rand,8);
+                    pairing_cb.ble.penc_key.ediv = p_data->ble_key.p_key_value->penc_key.ediv;
+                    pairing_cb.ble.penc_key.sec_level =
+                           p_data->ble_key.p_key_value->penc_key.sec_level;
 
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ltk[%d]=0x%02x",i,pairing_cb.ble.penc_key.ltk[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ltk[%d]=0x%02x",
+                                          i,pairing_cb.ble.penc_key.ltk[i]);
                     }
                     for (i=0; i<8; i++)
                     {
-                        BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.rand[%d]=0x%02x",i,pairing_cb.ble.penc_key.rand[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.rand[%d]=0x%02x",
+                                          i,pairing_cb.ble.penc_key.rand[i]);
                     }
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ediv=0x%04x",pairing_cb.ble.penc_key.ediv);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.sec_level=0x%02x",pairing_cb.ble.penc_key.sec_level);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.key_size=0x%02x",pairing_cb.ble.penc_key.key_size);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.ediv=0x%04x",
+                        pairing_cb.ble.penc_key.ediv);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.sec_level=0x%02x",
+                        pairing_cb.ble.penc_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.penc_key.key_size=0x%02x",
+                        pairing_cb.ble.penc_key.key_size);
                     break;
 
                 case BTA_LE_KEY_PID:
                     BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PID");
                     pairing_cb.ble.is_pid_key_rcvd = TRUE;
-                    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);
+                    pairing_cb.ble.pid_key.addr_type =
+                           p_data->ble_key.p_key_value->pid_key.addr_type;
+                    memcpy(pairing_cb.ble.pid_key.irk,
+                           p_data->ble_key.p_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);
+                           p_data->ble_key.p_key_value->pid_key.static_addr,BD_ADDR_LEN);
                     for (i=0; i<16; i++)
                     {
                         BTIF_TRACE_DEBUG("pairing_cb.ble.pid_key.irk[%d]=0x%02x"
@@ -1798,28 +1809,39 @@
                 case BTA_LE_KEY_PCSRK:
                     BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_PCSRK");
                     pairing_cb.ble.is_pcsrk_key_rcvd = TRUE;
-                    pairing_cb.ble.pcsrk_key.counter = p_data->ble_key.key_value.pcsrk_key.counter;
-                    pairing_cb.ble.pcsrk_key.sec_level = p_data->ble_key.key_value.pcsrk_key.sec_level;
-                    memcpy(pairing_cb.ble.pcsrk_key.csrk,p_data->ble_key.key_value.pcsrk_key.csrk,16);
+                    pairing_cb.ble.pcsrk_key.counter =
+                           p_data->ble_key.p_key_value->pcsrk_key.counter;
+                    pairing_cb.ble.pcsrk_key.sec_level =
+                           p_data->ble_key.p_key_value->pcsrk_key.sec_level;
+                    memcpy(pairing_cb.ble.pcsrk_key.csrk,
+                           p_data->ble_key.p_key_value->pcsrk_key.csrk,16);
 
                     for (i=0; i<16; i++)
                     {
-                        BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.csrk[%d]=0x%02x",i,pairing_cb.ble.pcsrk_key.csrk[i]);
+                        BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.csrk[%d]=0x%02x",
+                                          i,pairing_cb.ble.pcsrk_key.csrk[i]);
                     }
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.counter=0x%08x",pairing_cb.ble.pcsrk_key.counter);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.sec_level=0x%02x",pairing_cb.ble.pcsrk_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.counter=0x%08x",
+                                      pairing_cb.ble.pcsrk_key.counter);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.pcsrk_key.sec_level=0x%02x",
+                                      pairing_cb.ble.pcsrk_key.sec_level);
                     break;
 
                 case BTA_LE_KEY_LENC:
                     BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LENC");
                     pairing_cb.ble.is_lenc_key_rcvd = TRUE;
-                    pairing_cb.ble.lenc_key.div = p_data->ble_key.key_value.lenc_key.div;
-                    pairing_cb.ble.lenc_key.key_size = p_data->ble_key.key_value.lenc_key.key_size;
-                    pairing_cb.ble.lenc_key.sec_level = p_data->ble_key.key_value.lenc_key.sec_level;
+                    pairing_cb.ble.lenc_key.div = p_data->ble_key.p_key_value->lenc_key.div;
+                    pairing_cb.ble.lenc_key.key_size =
+                           p_data->ble_key.p_key_value->lenc_key.key_size;
+                    pairing_cb.ble.lenc_key.sec_level =
+                           p_data->ble_key.p_key_value->lenc_key.sec_level;
 
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.div=0x%04x",pairing_cb.ble.lenc_key.div);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.key_size=0x%02x",pairing_cb.ble.lenc_key.key_size);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.sec_level=0x%02x",pairing_cb.ble.lenc_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.div=0x%04x",
+                                      pairing_cb.ble.lenc_key.div);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.key_size=0x%02x",
+                                      pairing_cb.ble.lenc_key.key_size);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lenc_key.sec_level=0x%02x",
+                                      pairing_cb.ble.lenc_key.sec_level);
                     break;
 
 
@@ -1827,16 +1849,27 @@
                 case BTA_LE_KEY_LCSRK:
                     BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LCSRK");
                     pairing_cb.ble.is_lcsrk_key_rcvd = TRUE;
-                    pairing_cb.ble.lcsrk_key.counter = p_data->ble_key.key_value.lcsrk_key.counter;
-                    pairing_cb.ble.lcsrk_key.div = p_data->ble_key.key_value.lcsrk_key.div;
-                    pairing_cb.ble.lcsrk_key.sec_level = p_data->ble_key.key_value.lcsrk_key.sec_level;
+                    pairing_cb.ble.lcsrk_key.counter =
+                        p_data->ble_key.p_key_value->lcsrk_key.counter;
+                    pairing_cb.ble.lcsrk_key.div =
+                        p_data->ble_key.p_key_value->lcsrk_key.div;
+                    pairing_cb.ble.lcsrk_key.sec_level =
+                        p_data->ble_key.p_key_value->lcsrk_key.sec_level;
 
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.div=0x%04x",pairing_cb.ble.lcsrk_key.div);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.counter=0x%08x",pairing_cb.ble.lcsrk_key.counter);
-                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.sec_level=0x%02x",pairing_cb.ble.lcsrk_key.sec_level);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.div=0x%04x",
+                        pairing_cb.ble.lcsrk_key.div);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.counter=0x%08x",
+                        pairing_cb.ble.lcsrk_key.counter);
+                    BTIF_TRACE_DEBUG("pairing_cb.ble.lcsrk_key.sec_level=0x%02x",
+                        pairing_cb.ble.lcsrk_key.sec_level);
 
                     break;
 
+                case BTA_LE_KEY_LID:
+                    BTIF_TRACE_DEBUG("Rcv BTA_LE_KEY_LID");
+                    pairing_cb.ble.is_lidk_key_rcvd =  TRUE;
+                    break;
+
                 default:
                     BTIF_TRACE_ERROR("unknown BLE key type (0x%02x)", p_data->ble_key.key_type);
                     break;
@@ -1855,15 +1888,22 @@
             BTIF_TRACE_DEBUG("BTA_DM_BLE_PASSKEY_REQ_EVT. ");
             btif_dm_ble_passkey_req_evt(&p_data->pin_req);
             break;
+        case BTA_DM_BLE_NC_REQ_EVT:
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_PASSKEY_REQ_EVT. ");
+            btif_dm_ble_key_nc_req_evt(&p_data->key_notif);
+            break;
         case BTA_DM_BLE_OOB_REQ_EVT:
             BTIF_TRACE_DEBUG("BTA_DM_BLE_OOB_REQ_EVT. ");
             break;
         case BTA_DM_BLE_LOCAL_IR_EVT:
             BTIF_TRACE_DEBUG("BTA_DM_BLE_LOCAL_IR_EVT. ");
             ble_local_key_cb.is_id_keys_rcvd = TRUE;
-            memcpy(&ble_local_key_cb.id_keys.irk[0], &p_data->ble_id_keys.irk[0], sizeof(BT_OCTET16));
-            memcpy(&ble_local_key_cb.id_keys.ir[0], &p_data->ble_id_keys.ir[0], sizeof(BT_OCTET16));
-            memcpy(&ble_local_key_cb.id_keys.dhk[0], &p_data->ble_id_keys.dhk[0], sizeof(BT_OCTET16));
+            memcpy(&ble_local_key_cb.id_keys.irk[0],
+                   &p_data->ble_id_keys.irk[0], sizeof(BT_OCTET16));
+            memcpy(&ble_local_key_cb.id_keys.ir[0],
+                   &p_data->ble_id_keys.ir[0], sizeof(BT_OCTET16));
+            memcpy(&ble_local_key_cb.id_keys.dhk[0],
+                   &p_data->ble_id_keys.dhk[0], sizeof(BT_OCTET16));
             btif_storage_add_ble_local_key( (char *)&ble_local_key_cb.id_keys.irk[0],
                                             BTIF_DM_LE_LOCAL_KEY_IR,
                                             BT_OCTET16_LEN);
@@ -1884,7 +1924,7 @@
             break;
 
         case BTA_DM_BLE_AUTH_CMPL_EVT:
-            BTIF_TRACE_DEBUG("BTA_DM_BLE_KEY_EVT. ");
+            BTIF_TRACE_DEBUG("BTA_DM_BLE_AUTH_CMPL_EVT. ");
             btif_dm_ble_auth_cmpl_evt(&p_data->auth_cmpl);
             break;
 
@@ -2982,6 +3022,14 @@
                                          sizeof(btif_dm_ble_lcsrk_keys_t));
     }
 
+    if (pairing_cb.ble.is_lidk_key_rcvd)
+    {
+        btif_storage_add_ble_bonding_key(&bd_addr,
+                                         NULL,
+                                         BTIF_DM_LE_KEY_LID,
+                                         0);
+    }
+
 }
 
 
@@ -3080,7 +3128,28 @@
     HAL_CBACK(bt_hal_cbacks, pin_request_cb,
               &bd_addr, &bd_name, cod);
 }
+static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF *p_notif_req)
+{
+    /* TODO implement key notification for numeric comparison */
+    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
 
+    /* Remote name update */
+    btif_update_remote_properties(p_notif_req->bd_addr , p_notif_req->bd_name,
+                                          NULL, BT_DEVICE_TYPE_BLE);
+
+    bt_bdaddr_t bd_addr;
+    bdcpy(bd_addr.address, p_notif_req->bd_addr);
+
+    bt_bdname_t bd_name;
+    memcpy(bd_name.name, p_notif_req->bd_name, BD_NAME_LEN);
+
+    bond_state_changed(BT_STATUS_SUCCESS, &bd_addr, BT_BOND_STATE_BONDING);
+    pairing_cb.is_ssp = FALSE;
+
+    HAL_CBACK(bt_hal_cbacks, ssp_request_cb, &bd_addr, &bd_name,
+              COD_UNCLASSIFIED, BT_SSP_VARIANT_PASSKEY_CONFIRMATION,
+              p_notif_req->passkey);
+}
 
 void btif_dm_update_ble_remote_properties( BD_ADDR bd_addr, BD_NAME bd_name,
                                            tBT_DEVICE_TYPE dev_type)