btm_sec.c revision c8a78e445a8f789a1fc682acd144053363f04c93
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions for the Bluetooth Security Manager
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#define LOG_TAG "bt_btm_sec"
2644802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati
27899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#include <stdarg.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
2930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson
30d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "device/include/controller.h"
31d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/log.h"
32d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/time.h"
33d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
3549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bt_utils.h"
3649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h"
3749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE)
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gatt_int.h"
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY     (5000)
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
5378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr);
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
586975b4d711142b885af479721cada448952c6b41Andre Eisenbach/********************************************************************************
596975b4d711142b885af479721cada448952c6b41Andre Eisenbach**              L O C A L    F U N C T I O N     P R O T O T Y P E S            *
606975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/
61ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin KochartBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur);
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id,
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_chan_id);
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec);
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec);
7178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void     btm_sec_collision_timeout(void *data);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_restore_mode(void);
7378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void     btm_sec_pairing_timeout(void *data);
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec);
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state);
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char     *btm_pair_state_descr (tBTM_PAIRING_STATE state);
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_check_pending_reqs(void);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          UINT32 mx_proto_id, UINT32 mx_chan_id,
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          tBTM_SEC_CALLBACK *p_callback, void *p_ref_data);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_sec_bond_cancel_complete (void);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void     btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec);
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8    btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec);
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN         btm_sec_are_all_trusted(UINT32 p_mask[]);
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle);
937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8           btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec);
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state);
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN  btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            UINT32 mx_chan_id);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec);
1017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec);
1027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec);
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec);
104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm);
105899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16  btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator);
1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request  (BD_ADDR bd_addr, tBT_TRANSPORT transport,
108f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data,
109f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_BLE_SEC_ACT sec_act);
110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable);
112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec);
114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec);
1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] =
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*   OUT,    IO,     IN,     NONE */
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT  */ {FALSE,  FALSE,  TRUE,   FALSE},
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO   */ {FALSE,  TRUE,   TRUE,   FALSE},
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN   */ {TRUE,   TRUE,   TRUE,   FALSE},
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE,  FALSE,  FALSE,  FALSE}
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_OUT      0   DisplayOnly */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IO       1   DisplayYesNo */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_IN       2   KeyboardOnly */
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*  BTM_IO_CAP_NONE     3   NoInputNoOutput */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authenticated
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authenticated
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec)
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_encrypted
1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is encrypted
1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec)
1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_dev_authorized
1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check device is authorized
1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec)
1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Function         btm_dev_16_digit_authenticated
187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Description      check device is authenticated by using 16 digit pin or MITM
189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Returns          BOOLEAN TRUE or FALSE
191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde*******************************************************************************/
193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bondestatic BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec)
194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde{
195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used
196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    {
198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        return(TRUE);
199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
200818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    return(FALSE);
201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde}
202818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
203818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde/*******************************************************************************
204818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde**
2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_serv_trusted
2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      check service is trusted
2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE
2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec)
2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id))
2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
2227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecRegister
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Application manager calls this function to register for
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  security services.  There can be one and only one application
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  saving link keys.  BTM allows only first registration.
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
232f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      temp_value = {0};
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
238f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
241db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_INFO(LOG_TAG, "%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback);
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb_info->p_le_callback)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
244f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE
245f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__);
246f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      SMP_Register(btm_proc_smp_cback);
247f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif
248f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      /* if no IR is loaded, need to regenerate all the keys */
249f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0)
250f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      {
251f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton        btm_ble_reset_id();
252f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton      }
253f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    }
254f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    else
255f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    {
256db554581079863974af8e1289646f5deea6fc044Marie Janssen      LOG_WARN(LOG_TAG, "%s p_cb_info->p_le_callback == NULL", __func__);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.api = *p_cb_info;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
262db554581079863974af8e1289646f5deea6fc044Marie Janssen     LOG_INFO(LOG_TAG, "%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
264f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s application registered", __func__);
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
270877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function         BTM_SecRegisterLinkKeyNotificationCallback
271877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
272877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description      Application manager calls this function to register for
273877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  link key notification.  When there is nobody registered
274877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**                  we should avoid changing link key
275877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
276877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns          TRUE if registered OK, else FALSE
277877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
278877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/
279877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback)
280877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{
281877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    btm_cb.api.p_link_key_callback = p_callback;
282877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji    return TRUE;
283877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji}
284877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji
285877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/*******************************************************************************
286877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecAddRmtNameNotifyCallback
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can register to be notified when name of the
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote device is resolved.
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == NULL)
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = p_callback;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecDeleteRmtNameNotifyCallback
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Any profile can deregister notification when a new Link Key
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is generated per connection.
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if OK, else FALSE
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN  BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.p_rmt_name_callback[i] == p_callback)
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_rmt_name_callback[i] = NULL;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(TRUE);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetSecurityFlags
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get security flags for the device
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BOOLEAN TRUE or FALSE is device found
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
3555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(FALSE);
3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
3587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
3607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_GetSecurityFlagsByTransport
3627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      Get security flags for the device on a particular transport
3647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          BOOLEAN TRUE or FALSE is device found
3667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
3677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
3687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags,
3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                tBT_TRANSPORT transport)
3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
3717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec;
3727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
3747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
3757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (transport == BT_TRANSPORT_BR_EDR)
3767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) p_dev_rec->sec_flags;
3777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
3787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8);
3797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("BTM_GetSecurityFlags false");
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(FALSE);
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPinType
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set PIN type for the device.
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len)
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d",
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pin_type, (char *) pin_code, pin_code_len);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If device is not up security mode will be set as a part of startup */
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.cfg.pin_type != pin_type)
40230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson         && controller_get_interface()->get_is_ready() )
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (pin_type);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_type     = pin_type;
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.cfg.pin_code_len = pin_code_len;
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len);
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPairableMode
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enable or disable pairing
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       allow_pairing - (TRUE or FALSE) whether or not the device
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      allows pairing.
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connect_only_paired - (TRUE or FALSE) whether or not to
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      only allow paired devices to connect.
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired)
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPairableMode()  allow_pairing: %u   connect_only_paired: %u", allow_pairing, connect_only_paired);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_disabled    = !allow_pairing;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.connect_only_paired = connect_only_paired;
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_SetSecureConnectionsOnly
437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      Enable or disable default treatment for Mode 4 Level 0 services
439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter        secure_connections_only_mode - (TRUE or FALSE) whether or not the device
441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  TRUE means that the device should treat Mode 4 Level 0 services as
442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  services of other levels. (Secure_connections_only_mode)
443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  FALSE means that the device should provide default treatment for
444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  Mode 4 Level 0 services.
445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode)
450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: Mode : %u", __FUNCTION__,
452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                   secure_connections_only_mode);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    btm_cb.devcb.secure_connections_only = secure_connections_only_mode;
455c5c741075fbc36e373f0bec4c3520188d2ba9a38Srinu Jella    btm_cb.security_mode = BTM_SEC_MODE_SC;
456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES   ((UINT16) 0xffff)
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetSecurityLevel
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      is_originator - TRUE if originating the connection, FALSE if not
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id,
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              UINT32 mx_chan_id)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    CONNECTION_TYPE conn_type;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_ORIG;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        conn_type = CONN_ORIENT_TERM;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (conn_type, p_name, service_id,
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_sec_set_security_level (is_originator, p_name, service_id,
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       sec_level, psm, mx_proto_id, mx_chan_id));
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_set_security_level
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Register service security level with Security Manager
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      conn_type   - TRUE if originating the connection, FALSE if not
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_name      - Name of the service relevant only if
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                authorization will show this name to user. ignored
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                if BTM_SEC_SERVICE_NAME_LEN is 0.
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service_id  - service ID for the service passed to authorization callback
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  sec_level   - bit mask of the security features
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm         - L2CAP PSM
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id - protocol ID of multiplexing proto below
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id  - channel ID of multiplexing proto below
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if registered OK, else FALSE
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id,
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id,
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT32 mx_chan_id)
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec;
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               index;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16               first_unused_record = BTM_NO_AVAIL_SEC_SERVICES;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              record_allocated = FALSE;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_originator;
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_ucd;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_CONNLESS_MASK )
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = TRUE;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_ucd = FALSE;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
546818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level);
547818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if the record can be reused (same service name, psm, mx_proto_id,
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       service_id, and mx_chan_id), or obtain the next unused record */
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec = &btm_cb.sec_serv_rec[0];
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if there is already a record for this service */
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srec->security_flags & BTM_SEC_IN_USE)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id    &&
5620e888661a5dc23e516429b3e80f1f6a1aac12015Andre Eisenbach                p_name                              &&
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (!strncmp (p_name, (char *) p_srec->orig_service_name,
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN) ||
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 !strncmp (p_name, (char *) p_srec->term_service_name,
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           BTM_SEC_SERVICE_NAME_LEN)))
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_srec->psm == psm                  &&
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_srec->mx_proto_id == mx_proto_id  &&
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                service_id == p_srec->service_id)
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                record_allocated = TRUE;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark the first available service record */
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (!record_allocated)
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC));
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            record_allocated = TRUE;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            first_unused_record = index;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!record_allocated)
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)",  BTM_SEC_MAX_SERVICE_RECORDS);
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(record_allocated);
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Process the request if service record is valid */
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a duplicate service wasn't found, use the first available */
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (index >= BTM_SEC_MAX_SERVICE_RECORDS)
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index = first_unused_record;
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec = &btm_cb.sec_serv_rec[index];
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->psm         = psm;
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->service_id  = service_id;
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->mx_proto_id = mx_proto_id;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->orig_mx_chan_id = mx_chan_id;
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
60866209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy ((char *)p_srec->orig_service_name, p_name, BTM_SEC_SERVICE_NAME_LEN);
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT    | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM |
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Originator should not set requirements for incoming connections */
627818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE
628818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN );
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_OUT_AUTHENTICATE)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_OUT_MITM;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_OUT_ENCRYPT)
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_OUT_AUTHENTICATE;
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* outgoing connections usually set the security level right before
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * the connection is initiated.
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * set it to be the outgoing service */
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd == FALSE )
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_srec;
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->term_mx_chan_id = mx_chan_id;
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
65666209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy ((char *)p_srec->term_service_name, p_name, BTM_SEC_SERVICE_NAME_LEN);
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* clear out the old setting, just in case it exists */
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( is_ucd )
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags &=
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
664818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE
665818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              | BTM_SEC_IN_MIN_16_DIGIT_PIN);
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags &=
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT     | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM |
672818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE
673818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde              | BTM_SEC_IN_MIN_16_DIGIT_PIN);
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Parameter validation.  Acceptor should not set requirements for outgoing connections */
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
681899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_cb.security_mode == BTM_SEC_MODE_SC)
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (sec_level & BTM_SEC_IN_AUTHENTICATE)
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sec_level |= BTM_SEC_IN_MITM;
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the authenticate bit is set, when encrypt bit is set */
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (sec_level & BTM_SEC_IN_ENCRYPT)
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sec_level |= BTM_SEC_IN_AUTHENTICATE;
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_ucd )
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags     |= (UINT16)(BTM_SEC_IN_USE);
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d",
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, conn_type, psm, mx_proto_id, mx_chan_id);
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : security_flags: 0x%04x, ucd_security_flags: 0x%04x",
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_srec->ucd_security_flags);
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
7105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : service name [%s] (up to %d chars saved)",
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_name, BTM_SEC_SERVICE_NAME_LEN);
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE);
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d",
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   index, service_id, is_originator, psm, mx_proto_id, mx_chan_id);
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
7205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("               : sec: 0x%x, service name [%s] (up to %d chars saved)",
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN);
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(record_allocated);
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecClrService
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record(s) from the security database.
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified name are removed.
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used only by devices with limited RAM so that it can
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  reuse an old security service record.
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: Unpredictable results may occur if a service is cleared
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      that is still in use by an application/profile.
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id)
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) &&
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!service_id || (service_id == p_srec->service_id)))
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id);
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->ucd_security_flags = 0;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clr_service_by_psm
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Removes specified service record from the security database.
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  All service records with the specified psm are removed.
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically used by L2CAP to free up the service record used
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by dynamic PSM clients when the channel is closed.
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The given psm must be a virtual psm.
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       Service ID - Id of the service to remove. ('0' removes all service
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          records (except SDP).
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of records that were freed.
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm)
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC   *p_srec = &btm_cb.sec_serv_rec[0];
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_freed = 0;
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++)
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Delete services with specified name (if in use and not SDP) */
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) )
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id);
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_srec->security_flags = 0;
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num_freed++;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed);
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(num_freed);
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_clr_temp_auth_service
810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Removes specified device record's temporary authorization
812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  flag from the security database.
813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters       Device address to be cleared
815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void.
817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda)
820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC   *p_dev_rec;
822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_dev_rec = btm_find_dev (bda)) == NULL)
824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB");
826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */
830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service)
831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
8325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]",
833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID;
836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PINCodeReply
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after Security Manager submitted
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PIN code request to the UI.
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device for which PIN was requested
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  res          - result of the operation BTM_SUCCESS if success
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s   PairFlags: 0x%02x  PinLen:%d  Result:%d",
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res);
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state);
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr");
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB");
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) )
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) ||
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) )
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (bd_addr);
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags   |= BTM_SEC_LINK_KEY_AUTHED;
905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (pin_len >= 16) {
906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
907818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.security_mode_changed == FALSE) )
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is start of the dedicated bonding if local device is 2.0 */
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
915818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->pin_code_length = pin_len;
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, pin_len);
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = TRUE;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable (TRUE);
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = 0xff ;
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*  before originating  */
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection");
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we change state little bit early so btm_sec_connected() will originate connection */
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*   when existing ACL link is down completely */
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we already accepted incoming connection from pairing device */
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer");
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED;
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.api.p_auth_complete_callback)
9477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE);
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_SUCCESS;
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin);
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         btm_sec_bond_by_transport
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      this is the bond function that will start either SSP or SMP.
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device to bond
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  pin_len      - length in bytes of the PIN Code
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_pin        - pointer to array with the PIN Code
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Note: After 2.1 parameters are not used and preserved here not to change API
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
9737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                       UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS      status;
9773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            *p_features;
9783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8            ii;
9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN        *p= btm_bda_to_acl(bd_addr, transport);
9805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x",
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport);
9847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Other security process is in progress */
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state));
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9926975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL)
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9946975b4d711142b885af479721cada448952c6b41Andre Eisenbach        return(BTM_NO_RESOURCES);
9957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Finished if connection is active and already paired */
10007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR
10017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
10027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
10037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE
10047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         &&  (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED))
10057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
10067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         )
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_SecBond -> Already Paired");
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell controller to get rid of the link key if it has one stored */
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS)
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the PIN code if we got a valid one */
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0))
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = pin_len;
1021818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->pin_code_length = pin_len;
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN);
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN);
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE;
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = TRUE;
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (trusted_mask)
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask);
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10346975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
10357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1037e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        btm_ble_init_pseudo_addr (p_dev_rec, bd_addr);
10387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK;
10397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (SMP_Pair(bd_addr) == SMP_STARTED)
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE;
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
10447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_cb.pairing_flags = 0;
10497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(BTM_NO_RESOURCES);
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
10547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  | BTM_SEC_ROLE_SWITCHED  | BTM_SEC_LINK_KEY_AUTHED);
10557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
10565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags);
105730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing())
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* The special case when we authenticate keyboard.  Set pin type to fixed */
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* It would be probably better to do it from the application, but it is */
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* complicated */
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED))
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pin_type_changed = TRUE;
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10713aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++)
10723aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    {
10733aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_features = p_dev_rec->features[ii];
10745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("  remote_features page[%1d] = %02x-%02x-%02x-%02x",
10753aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                         ii, p_features[0], p_features[1], p_features[2], p_features[3]);
10765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("                              %02x-%02x-%02x-%02x",
10773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                             p_features[4], p_features[5], p_features[6], p_features[7]);
10783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x  HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle);
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN;
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection already exists... */
10877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE)
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark lcb as bonding */
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (bd_addr, TRUE);
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4);
110030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_simple_pairing()
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->sm4 == BTM_SM4_KNOWN))
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( btm_sec_check_prefetch_pin (p_dev_rec) )
1104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1106899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
1107899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
1108899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
1109899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local is 2.1 and peer is unknown */
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0)
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we are not accepting connection request from peer
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * -> RNR (to learn if peer is 2.1)
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
11187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR);
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We are accepting connection request from peer */
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d",
11267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state);
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_CMD_STARTED;
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* both local and peer are 2.1  */
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_dd_create_conn(p_dev_rec);
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
11427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBondByTransport
11447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  transport    - doing SSP over BR/EDR or SMP over LE
11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport,
11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                    UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE
11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_DEVICE_TYPE     dev_type;
11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBLE_ADDR_TYPE      addr_type;
11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* LE device, do SMP pairing */
11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) ||
11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0))
11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_ILLEGAL_ACTION;
11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         BTM_SecBond
11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function is called to perform bonding with peer device.
11807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  If the connection is already up, but not secure, pairing
11817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  is attempted.  If already paired BTM_SUCCESS is returned.
11827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters:      bd_addr      - Address of the device to bond
11847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  pin_len      - length in bytes of the PIN Code
11857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  p_pin        - pointer to array with the PIN Code
11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                  trusted_mask - bitwise OR of trusted services (array of UINT32)
11877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
11887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**  Note: After 2.1 parameters are not used and preserved here not to change API
11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[])
11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT   transport = BT_TRANSPORT_BR_EDR;
11937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (BTM_UseLeLink(bd_addr))
11957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        transport = BT_TRANSPORT_LE;
11967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
11977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask);
11987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
11997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
12007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecBondCancel
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to cancel ongoing bonding process
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with peer device.
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the peer device
12077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**                         transport    - FALSE for BR/EDR link; TRUE for LE link
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr)
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SecBondCancel()  State: %s flags:0x%x",
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags);
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL)
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_UNKNOWN_ADDR;
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE
12227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE)
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING)
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("Cancel LE pairing");
12277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (SMP_PairCancel(bd_addr))
12287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
12297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return BTM_CMD_STARTED;
12307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return BTM_WRONG_MODE;
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state );
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags)
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* pre-fetching pin for dedicated bonding */
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_bond_cancel_complete();
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this BDA is in a bonding procedure */
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the HCI link is up */
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If some other thread disconnecting, we do not send second command */
1253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) ||
1254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH))
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_CMD_STARTED);
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link was set up by Bonding process */
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_update_lcb_4_bonding(bd_addr, FALSE);
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /*HCI link is not up */
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the HCI link creation was started by Bonding process */
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btsnd_hcic_create_conn_cancel(bd_addr))
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return BTM_CMD_STARTED;
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_NO_RESOURCES;
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
1276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
1277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_CancelRemoteDeviceName();
1278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD;
1279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return BTM_CMD_STARTED;
1280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NOT_AUTHORIZED;
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_WRONG_MODE;
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SecGetDeviceLinkKey
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to obtain link key for the device
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  it returns BTM_SUCCESS if link key is available, or
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device or device record does not contain link key info
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr      - Address of the device
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  link_key     - Link Key is copied into this array
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key)
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN);
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_UNKNOWN_ADDR);
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         BTM_SecGetDeviceLinkKeyType
1317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to obtain link key type for the
1319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  device.
1320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  it returns BTM_SUCCESS if link key is available, or
1321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  BTM_UNKNOWN_ADDR if Security Manager does not know about
1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the device or device record does not contain link key info
1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          BTM_LKEY_TYPE_IGNORE if link key is unknown, link type
1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  otherwise.
1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr)
1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return p_dev_rec->link_key_type;
1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return BTM_LKEY_TYPE_IGNORE;
1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetEncryption
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to ensure that connection is
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  encrypted.  Should be called only on an open connection.
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically only needed for connections that first want to
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bring up unencrypted links, then later encrypt them.
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
1349f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach**                  transport     - Link transport
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed.  Can be set to NULL
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  if status is not desired.
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - pointer to any data the caller wishes to receive
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  in the callback function upon completion.
1356f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach**                                  can be set to NULL if not used.
1357f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach**                  sec_act       - LE security action, unused for BR/EDR
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS   - already encrypted
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_PENDING   - command will be returned in the callback
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE- connection not up.
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY      - security procedures are currently active
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED - if security manager not linked in.
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback,
1367f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                               void *p_ref_data, tBTM_BLE_SEC_ACT sec_act)
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS rc = 0;
13707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
13727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!p_dev_rec ||
13737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
13747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
13757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE)
13767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
13777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        )
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Connection should be up and runnning */
13805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected");
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE);
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_WRONG_MODE);
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((transport == BT_TRANSPORT_BR_EDR &&
13897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags &  BTM_SEC_ENCRYPTED))
13907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
13917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         || (transport == BT_TRANSPORT_LE &&
13927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED))
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta          )
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted");
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
13997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* enqueue security request if security is active */
1405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE))
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request");
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1409f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach        if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data, sec_act))
1410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_CMD_STARTED;
1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (p_callback)
1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES);
1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_NO_RESOURCES;
1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = FALSE;
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x",
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->security_required);
14297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
14317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tACL_CONN *p = btm_bda_to_acl(bd_addr, transport);
1434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p)
1435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1436f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach           rc = btm_ble_set_encryption(bd_addr, sec_act, p->link_role);
1437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
1438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
1439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
1440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            rc = BTM_WRONG_MODE;
1441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__);
1442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = btm_sec_execute_procedure (p_dev_rec);
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (rc != BTM_CMD_STARTED && rc != BTM_BUSY)
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
14537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc);
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet.
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle)
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       old_state = p_dev_rec->sec_state;
1466ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS status = BTM_CMD_STARTED;
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect:  handle:0x%x, reason=0x%x",
14697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                      conn_handle, reason);
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* send HCI_Disconnect on a transport only once */
1472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    switch (old_state)
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING:
1475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->hci_handle)
1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BLE:
1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (conn_handle == p_dev_rec->ble_hci_handle)
1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                return status;
1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH;
1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        case BTM_SEC_STATE_DISCONNECTING_BOTH:
1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return status;
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        default:
1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ?
1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            break;
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */
1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle)
1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect");
1504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji              p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING;
1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        status = BTM_SUCCESS;
1506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
1507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Tear down the HCI link */
1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else if (!btsnd_hcic_disconnect (conn_handle, reason))
1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         /* could not send disconnect. restore old state */
1511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         p_dev_rec->sec_state = old_state;
1512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         status = BTM_NO_RESOURCES;
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return status;
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ConfirmReqReply
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to confirm the numeric value for
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_CFM_REQ_EVT
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res           - result of the operation BTM_SUCCESS if success
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr       - Address of the peer device
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr)
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s  Res: %u",
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM)
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) )
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (res == BTM_SUCCESS)
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL)
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED;
1551818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, TRUE);
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (bd_addr, FALSE);
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_PasskeyReqReply
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the passkey for
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_KEY_REQ_EVT
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      res     - result of the operation BTM_SUCCESS if success
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr - Address of the peer device
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  passkey - numeric value in the range of
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)).
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey)
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s  res:%d",
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_pair_state_descr(btm_cb.pairing_state), res);
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) )
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1592444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
1593444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec != NULL)
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)
15987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_SecBondCancel(bd_addr);
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN);
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY)
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (passkey > BTM_MAX_PASSKEY_VAL)
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res = BTM_ILLEGAL_VALUE;
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply (bd_addr);
1621444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_reply (bd_addr, passkey);
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SendKeypressNotif
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is used during the passkey entry model
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by a device with KeyboardOnly IO capabilities
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (very likely to be a HID Device).
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is called by a HID Device to inform the remote device when
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  a key has been entered or erased.
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type - notification type
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type)
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This API only make sense between PASSKEY_REQ and SP complete */
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY)
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_send_keypress_notif (bd_addr, type);
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_IoCapRsp
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called in response to BTM_SP_IO_REQ_EVT
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  by the tBTM_SP_CALLBACK implementation, this function is
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  called to provide the actual response
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr - Address of the peer device
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  io_cap  - The IO capability of local device.
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  oob     - BTM_OOB_NONE or BTM_OOB_PRESENT.
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  auth_req- MITM protection required or not.
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req)
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s  oob: %d io_cap: %d",
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap);
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS)
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ||  (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) )
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX)
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = auth_req;
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = io_cap;
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT));
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req);
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadLocalOobData
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the local OOB data from
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  LM
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void)
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_read_local_oob_data() == FALSE)
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_NO_RESOURCES;
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RemoteOobDataReply
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to provide the remote OOB data for
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Simple Pairing in response to BTM_SP_RMT_OOB_EVT
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr     - Address of the peer device
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c           - simple pairing Hash C.
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r           - simple pairing Randomizer  C.
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r)
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1719444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__,
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), res);
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If timeout already expired or has been canceled, ignore the reply */
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP)
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (res != BTM_SUCCESS)
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_neg_reply (bd_addr);
1733444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    } else {
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.acl_disc_reason = HCI_SUCCESS;
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_rem_oob_reply (bd_addr, c, r);
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BuildOobData
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to build the OOB data payload to
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  be sent over OOB (non-Bluetooth) link
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_len - p_data size.
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  c       - simple pairing Hash C.
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  r       - simple pairing Randomizer  C.
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  name_len- 0, local device name would not be included.
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            otherwise, the local device name is included for
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                            up to this specified length
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Number of bytes in p_data.
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c,
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BT_OCTET16 r, UINT8 name_len)
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = 0;
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  name_size;
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE)
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mandatory part */
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
177130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address);
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = BTM_OOB_MANDATORY_SIZE;
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_len -= len;
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* now optional part */
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Hash C */
1779444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        UINT16 delta = BTM_OOB_HASH_C_SIZE + 2;
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_HASH_C_SIZE + 1;
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE);
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add Rand R */
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_RAND_R_SIZE + 2;
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_RAND_R_SIZE + 1;
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE;
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE);
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add class of device */
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = BTM_OOB_COD_SIZE + 2;
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_OOB_COD_SIZE + 1;
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_EIR_OOB_COD_TYPE;
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class);
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        name_size = name_len;
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (name_size > strlen(btm_cb.cfg.bd_name))
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            name_size = (UINT16)strlen(btm_cb.cfg.bd_name);
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        delta = name_size + 2;
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= delta)
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_size + 1;
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = name_type;
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size);
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len     += delta;
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            max_len -= delta;
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update len */
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p_data;
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM(p, len);
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1836899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_BothEndsSupportSecureConnections
1837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1838899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if both the local device and the peer device
1839899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  specified by bd_addr support BR/EDR Secure Connections.
1840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1841899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1842899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1843899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by both local
1844899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  and the remote device.
1845899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
1847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
1848899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr)
1849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
1850899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return ((controller_get_interface()->supports_secure_connections()) &&
1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_PeerSupportsSecureConnections(bd_addr)));
1852899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
1853899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1854899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
1855899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1856899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         BTM_PeerSupportsSecureConnections
1857899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1858899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the peer supports
1859899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  BR/EDR Secure Connections.
1860899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1861899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters:      bd_addr - address of the peer
1862899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1863899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if BR/EDR Secure Connections are supported by the peer,
1864899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  else FALSE.
1865899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
1866899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
1867899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr)
1868899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
1869899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    tBTM_SEC_DEV_REC    *p_dev_rec;
1870899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1871899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL)
1872899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
1873899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__,
1874899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3],
1875899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (bd_addr[4]<< 8) + bd_addr[5]);
1876899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return FALSE;
1877899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
1878899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
1879899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return (p_dev_rec->remote_supports_secure_connections);
1880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
1881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
1882444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
1883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadOobData
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to parse the OOB data payload
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received over OOB (non-Bluetooth) link
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_data  - the location for OOB data
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  eir_tag - The associated EIR tag to read the data.
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  *p_len(output) - the length of the data with the given tag.
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          the beginning of the data with the given tag.
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  NULL, if the tag is not found.
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len)
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = p_data;
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  max_len;
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   len, type;
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_ret = NULL;
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ret_len = 0;
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_data)
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16(max_len, p);
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (max_len >= BTM_OOB_MANDATORY_SIZE)
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag)
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ret = p; /* the location for bd_addr */
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ret_len = BTM_OOB_BD_ADDR_SIZE;
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p += BD_ADDR_LEN;
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                max_len -= BTM_OOB_MANDATORY_SIZE;
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* now the optional data in EIR format */
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                while (max_len > 0)
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len     = *p++; /* tag data len + 1 */
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    type    = *p++;
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (eir_tag == type)
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_ret = p;
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        ret_len = len - 1;
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        break;
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* the data size of this tag is len + 1 (tag data len + 2) */
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (max_len > len)
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len -= len;
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len--;
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        len--;
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p += len;
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        max_len = 0;
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_len)
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_len = ret_len;
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_ret;
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetOutService
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the service for
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  outgoing connections.
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the profile/application calls BTM_SetSecurityLevel
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  before initiating a connection, this function does not
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  need to be called.
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id)
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_out_serv = p_serv_rec;
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (bd_addr);
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->service_id == service_id)
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->orig_mx_chan_id == mx_chan_id))
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d",
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_serv_rec->service_id, p_serv_rec->psm, p_serv_rec->mx_proto_id, p_serv_rec->orig_mx_chan_id);
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_out_serv = p_serv_rec;
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec)
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->p_cur_service = p_serv_rec;
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              I N T E R N A L     F U N C T I O N S
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1994ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_upgrade_possible
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1996ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function returns TRUE if the existing link key
1997ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  can be upgraded or if the link key does not exist.
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1999ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          BOOLEAN
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM;
2005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN             is_possible = TRUE;
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2009ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        is_possible = FALSE;
20107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if(p_dev_rec->p_cur_service)
20117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x",
2013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type,
2014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags);
20157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
20177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x",
2019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check);
20207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Already have a link key to the connected peer. Is the link key secure enough?
20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ** Is a link key upgrade even possible?
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
2024899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & mtm_check)    /* needs MITM */
2025899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) ||
2026899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256))
2027899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* has unauthenticated
2028899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key */
2029899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX)  /* a valid peer IO cap */
2030899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps]))
2031899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          /* authenticated
2032899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                          link key is possible */
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* upgrade is possible: check if the application wants the upgrade.
20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * If the application is configured to use a global MITM flag,
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * it probably would not want to upgrade the link key based on the security level database */
2037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            is_possible = TRUE;
2038ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags);
2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return is_possible;
2042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_check_upgrade
2047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is called to check if the existing link key
2049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  needs to be upgraded.
2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC  *p_dev_rec, BOOLEAN is_originator)
2055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Only check if link key already exists */
2060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))
2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return;
2062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
2063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE)
2064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
20655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags);
2066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* upgrade is possible: check if the application wants the upgrade.
2067ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * If the application is configured to use a global MITM flag,
2068ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         * it probably would not want to upgrade the link key based on the security level database */
2069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        tBTM_SP_UPGRADE evt_data;
2070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
2071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_data.upgrade = TRUE;
2072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btm_cb.api.p_sp_callback)
2073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
2074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade);
2076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (evt_data.upgrade)
2077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if the application confirms the upgrade, set the upgrade bit */
2079ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2080ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2081ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Clear the link key known to go through authentication/pairing again */
2082ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED);
2083ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED;
20845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags);
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_l2cap_access_req
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP to grant permission to
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establish L2CAP connection to or from the peer device.
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are complete. MUST NOT BE NULL.
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTM_STATUS
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle,
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      CONNECTION_TYPE conn_type,
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      tBTM_SEC_CALLBACK *p_callback,
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      void *p_ref_data)
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         security_required;
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16         old_security_required;
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       old_is_originator;
21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS   rc = BTM_SUCCESS;
21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       chk_acp_auth_done = FALSE;
21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
2120ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar    tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; /* should check PSM range in LE connection oriented L2CAP connection */
21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (conn_type & CONNECTION_TYPE_ORIG_MASK)
21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data);
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data);
21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_first_serv (conn_type, psm);
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm);
21477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_MODE_UNSUPPORTED);
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2151899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Services level0 by default have no security */
2152899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only))
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY);
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2160899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2161899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2162899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags,
2163899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                               is_originator);
2164899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2165899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->ucd_security_flags;
2168899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_originator)
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                rc = BTM_SUCCESS;
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) ||
21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) ||
21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) )
21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                // Check for 16 digits (or MITM)
2189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) &&
2191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                     btm_dev_16_digit_authenticated(p_dev_rec))) {
2192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    rc = BTM_SUCCESS;
2193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                }
21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (rc == BTM_SUCCESS)
22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_callback)
22067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
2215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                                is_originator);
2218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            security_required = p_serv_rec->security_flags;
2222899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2223899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2224899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2225899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm  0x%04x",
2226899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    __FUNCTION__, security_required, is_originator, psm);
2227899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2228899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4))
2229899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2230899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2231899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */
2232899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2233899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2234899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d",
2235899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__,
2236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc,
2237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            p_dev_rec->remote_supports_secure_connections);
2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                    BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2242899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2243899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto KRZR) which connects to several services at the same time */
22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed  state: %s mode:%d, sm4:0x%x", __func__,
2251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                          psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4);
22525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags);
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rc = BTM_CMD_STARTED;
2254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2256899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2257899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2258899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2259899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_originator)
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
22667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
22677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) ||
22687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec)  && btm_dev_encrypted(p_dev_rec))) )
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    rc = BTM_SUCCESS;
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
22767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) ||
22777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) ||
22787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
22797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
22807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_encrypted(p_dev_rec))) ||
22817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS)  && btm_dev_encrypted(p_dev_rec) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))))
22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2283818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    // Check for 16 digits (or MITM)
2284818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2285818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                       (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) {
2286818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        rc = BTM_SUCCESS;
2287818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    }
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2291899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2292899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2293899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2294899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2295899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2296899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (rc == BTM_SUCCESS)
22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_callback)
23007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS);
23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(BTM_SUCCESS);
23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.sec_req_pending = TRUE;
23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save pointer to service record */
23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service = p_serv_rec;
23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */
2313899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2315899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2317899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2319899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (is_originator)
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT);
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2324899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else /* acceptor */
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                chk_acp_auth_done = TRUE;
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SM4 to SM4 -> always authenticate & encrypt */
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT);
2330899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth           }
2331899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2332899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4))
2333899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2334899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the remote features are not known yet */
2335899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__,
2336899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags);
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2338899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sm4 |= BTM_SM4_REQ_PEND;
2339899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_CMD_STARTED);
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()  sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__,
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done);
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_security_required        = p_dev_rec->security_required;
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_is_originator            = p_dev_rec->is_originator;
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = security_required;
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK )
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = TRUE;
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_ucd = FALSE;
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are multiple service records used through the same PSM */
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* leave security decision for the multiplexor on the top */
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_sec_find_next_serv (p_serv_rec)) != NULL)
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done);
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!BTM_SEC_IS_SM4(p_dev_rec->sm4))
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm);
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pre-Lisbon: restore the old settings */
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = old_security_required;
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->is_originator     = old_is_originator;
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_SUCCESS);
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2382899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    /* if the originator is using dynamic PSM in legacy mode, do not start any security process now
2383899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * The layer above L2CAP needs to carry out the security requirement after L2CAP connect
2384899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth     * response is received */
2385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (is_originator &&
2386899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2388899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2389899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth          btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001))
23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm);
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* restore the old settings */
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required = old_security_required;
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->is_originator     = old_is_originator;
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS);
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (chk_acp_auth_done)
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x",
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED));
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* SM4, but we do not know for sure which level of security we need.
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * as long as we have a link key, it's OK */
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)))
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rc = BTM_DELAY_CHECK;
24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            because of data path issues. Delay this disconnect a little bit
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
2416db554581079863974af8e1289646f5deea6fc044Marie Janssen            LOG_INFO(LOG_TAG, "%s peer should have initiated security process by now (SM4 to SM4)", __func__);
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback        = p_callback;
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state         = BTM_SEC_STATE_DELAY_FOR_ENC;
24197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, rc);
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            return BTM_SUCCESS;
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
2428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id)
2429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2430ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Although authentication and encryption are per connection
2431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** authorization is per access request.  For example when serial connection
2432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** is up and authorized and client requests to read file (access to other
2433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ** scn), we need to request user's permission again.
2434ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        */
2435ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED;
2436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      BTM_SEC_AUTHENTICATED);
2450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else
2453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* If we already have a link key to the connected peer, is it secure enough? */
2455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_check_upgrade(p_dev_rec, is_originator);
2456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d",
2460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji           p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
24667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc);
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(rc);
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_mx_access_request
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by all Multiplexing Protocols during
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establishing connection to or from peer device to grant
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  permission to establish application connection.
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  psm           - L2CAP PSM
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is_originator - TRUE if protocol above L2CAP originates
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  connection
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_proto_id   - protocol ID of the multiplexer
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mx_chan_id    - multiplexer channel to reach application
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_callback    - Pointer to callback function called if
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  this function returns PENDING after required
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  procedures are completed
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_ref_data    - Pointer to any reference data needed by the
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  the callback function.
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator,
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       UINT32 mx_proto_id, UINT32 mx_chan_id,
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                       tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec;
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS        rc;
2502ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16             security_required;
25037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    BOOLEAN transport   = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator);
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find or get oldest record */
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Find the service record for the PSM */
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id);
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no application registered with this PSM do not allow connection */
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_serv_rec)
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
25167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED);
25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d",
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id);
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2523899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm)))
2524899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2525899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags,
2526899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                                           is_originator);
2527899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2528899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
2529899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2530899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        security_required = p_serv_rec->security_flags;
2531899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2532899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* there are some devices (moto phone) which connects to several services at the same time */
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* we will process one after another */
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) )
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2537444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed  state: %s", __func__,
25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state));
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2540ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rc = BTM_CMD_STARTED;
2541899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2542899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED ||
2543899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_NONE ||
2544899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_SERVICE ||
2545899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             btm_cb.security_mode == BTM_SEC_MODE_LINK) ||
2546899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) &&
2547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE)))
2548ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* legacy mode - local is legacy or local is lisbon/peer is legacy
2550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             * or SM4 with no possibility of link key upgrade */
2551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (is_originator)
2552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_OUT_FLAGS) == 0) ||
25547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    rc = BTM_SUCCESS;
2559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
2562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (((security_required & BTM_SEC_IN_FLAGS) == 0) ||
25647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) ||
25657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHORIZE) && (btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))) ||
25667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_AUTHENTICATE)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec)) && btm_dev_authenticated(p_dev_rec))) ||
25677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT)) && ((btm_dev_authorized(p_dev_rec)||btm_serv_trusted(p_dev_rec, p_serv_rec))&& btm_dev_encrypted(p_dev_rec))) ||
25687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)))
2569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    )
2570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2571818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    // Check for 16 digits (or MITM)
2572818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) ||
2573818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                       (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) {
2574818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        rc = BTM_SUCCESS;
2575818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    }
2576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2578899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) &&
2579899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2580899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2581899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2582899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2583899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2584899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2585899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (rc == BTM_SUCCESS)
2586899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2587899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__);
2588899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */
2589899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* btm_sec_execute_procedure */
2590899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) ||
2591899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE)))
2592899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2593899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__);
2594899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                rc = BTM_CMD_STARTED;
2595899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2596899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Check whether there is a pending security procedure, if so we should always queue */
2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* the new security request */
2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)
2601899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__);
2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            rc = BTM_CMD_STARTED;
2604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (rc == BTM_CMD_STARTED)
2606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__);
2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            btm_sec_queue_mx_request (bd_addr, psm,  is_originator, mx_proto_id,
2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                      mx_chan_id, p_callback, p_ref_data);
2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        else /* rc == BTM_SUCCESS */
2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* access granted */
2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth             if (p_callback)
2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc);
2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2618899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
2619899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2620899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc,
2621899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                          btm_pair_state_descr(btm_cb.pairing_state));
2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return rc;
2623899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
2624899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2625899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) ||
2626899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (btm_cb.security_mode == BTM_SEC_MODE_SC)))
2627899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* acceptor receives service connection establishment Request for */
2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* Secure Connections Only service */
2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,",
2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            "remote_support_for_sc %d: fail pairing",__FUNCTION__,
2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (p_callback)
2638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (*p_callback) (bd_addr, transport, (void *)p_ref_data,
2639899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                               BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2640899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            return (BTM_MODE4_LEVEL4_NOT_SUPPORTED);
2642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_cur_service     = p_serv_rec;
2646899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    p_dev_rec->security_required = security_required;
26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2648899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (btm_cb.security_mode == BTM_SEC_MODE_SP ||
2649899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
2650899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_cb.security_mode == BTM_SEC_MODE_SC)
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_IS_SM4(p_dev_rec->sm4))
26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2654899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
2655899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
2656899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2657899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */
2658899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0)
2659899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                {
2660899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                    p_dev_rec->sm4 |= BTM_SM4_UPGRADE;
2661899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                }
2662899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
2663899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED |
2664899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                          BTM_SEC_AUTHENTICATED);
2665899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags);
2666899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
2667899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
2668899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
2669899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* If we already have a link key, check if that link key is good enough */
2670899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                btm_sec_check_upgrade(p_dev_rec, is_originator);
2671899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->is_originator     = is_originator;
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback        = p_callback;
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_ref_data        = p_ref_data;
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Although authentication and encryption are per connection */
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization is per access request.  For example when serial connection */
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* is up and authorized and client requests to read file (access to other */
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* scn, we need to request user's permission again. */
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED);
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d",
2686444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags,
2687444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id);
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_callback)
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
26947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc);
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rc;
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_conn_req
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when the peer device is requesting
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connection
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc)
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bda);
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some device may request a connection before we are done with the HCI_Reset sequence */
271630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: connect request when device not ready");
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Security guys wants us not to allow connection from not paired devices */
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection is allowed for only paired devices */
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.connect_only_paired)
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))
27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device");
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If non-discoverable, only allow known devices to connect */
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE)
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: connect request from not paired device");
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN)))
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device");
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* incoming connection from bonding device is rejected */
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT;
27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE);
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Host is not interested or approved connection.  Save BDA and DC and */
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* pass request to L2CAP */
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN);
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.connecting_dc,  dc,  DEV_CLASS_LEN);
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (l2c_link_hci_conn_req (bda))
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_rec)
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* accept the connection -> allocate a device record */
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec)
27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 |= BTM_SM4_CONN_PEND;
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_bond_cancel_complete
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to report bond cancel complete
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event.
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void)
27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) ||
27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state &&
2796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) ||
2797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME &&
2798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta          BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags))
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* for dedicated bonding in legacy mode, authentication happens at "link level"
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * btm_sec_connected is called with failed status.
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * In theory, the code that handles is_pairing_device/TRUE should clean out security related code.
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * However, this function may clean out the security related flags and btm_sec_connected would not know
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * this function also needs to do proper clean up.
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL)
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required = BTM_SEC_NONE;
28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify application that the cancel succeeded */
28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_bond_cancel_cmpl_callback)
28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS);
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_create_conn_cancel_complete
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the create connection cancel
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  command.
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p)
28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       status;
28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (status, p);
28325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s  status:%d",
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state), status);
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if the create conn cancel cmd was issued by the bond cancel,
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the application needs to be notified that bond cancel succeeded
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (status)
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_SUCCESS:
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_CONNECTION_EXISTS:
28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case HCI_ERR_NO_CONNECTION:
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify application of the error */
28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_bond_cancel_cmpl_callback)
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING);
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_check_pending_reqs
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at the end of the security procedure
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to let L2CAP and RFCOMM know to re-submit any pending requests
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void)
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* First, resubmit L2CAP requests */
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.sec_req_pending)
28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.sec_req_pending = FALSE;
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (NULL);
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Now, re-submit anything in the mux queue */
28751a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        fixed_queue_t *bq = btm_cb.sec_pending_q;
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28771a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        btm_cb.sec_pending_q = fixed_queue_new(SIZE_MAX);
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28791a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        tBTM_SEC_QUEUE_ENTRY *p_e;
28801a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)fixed_queue_try_dequeue(bq)) != NULL)
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check that the ACL is still up before starting security procedures */
2883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL)
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_e->psm != 0)
2886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2887444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u",
2888444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    __FUNCTION__, p_e->psm, p_e->is_orig,
2889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                    p_e->mx_proto_id, p_e->mx_chan_id);
28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig,
28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->mx_proto_id, p_e->mx_chan_id,
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_e->p_callback, p_e->p_ref_data);
2894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
2895444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else
2896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
2897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback,
2898f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                      p_e->p_ref_data, p_e->sec_act);
2899444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2902abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov            osi_free(p_e);
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29041a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        fixed_queue_free(bq, NULL);
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_init
29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is on the SEC startup
29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode)
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.security_mode = sec_mode;
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN);
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY;
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_device_down
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called when device is disabled or
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  turned off
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void)
29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_reset
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function should be called after device reset
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void)
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
295130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_simple_pairing())
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the default IO capabilities */
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS;
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* add mx service to use no security */
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX,
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0);
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode = BTM_SEC_MODE_SERVICE;
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode);
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_abort_access_req
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called by the L2CAP or RFCOMM to abort
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the pending operation.
29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr       - Address of the peer device
29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr)
29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev (bd_addr);
29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING)
29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING))
29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->p_callback = NULL;
29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dd_create_conn
29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to create the ACL connection for
29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the dedicated boding process
30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec)
30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3006ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
3007ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING))
3008ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    {
3009ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella       BTM_TRACE_WARNING("%s Connection already exists", __func__);
3010ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella       return BTM_CMD_STARTED;
3011ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    }
30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure an L2cap link control block is available */
3014ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella    if (!p_lcb && (p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL)
30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]",
30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up the control block to indicated dedicated bonding */
30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE)
30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("Security Manager: failed create  [%02x%02x%02x%02x%02x%02x]",
30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb(p_lcb);
30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_NO_RESOURCES);
30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_PAGE_EVT);
30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]",
30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2],
30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]);
30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ);
30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3047cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
3048cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_state_getting_name(void *data, void *context)
3049cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{
3050cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    tBTM_SEC_DEV_REC *p_dev_rec = data;
3051cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
3052cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) {
3053cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        return false;
3054cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    }
3055cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    return true;
3056cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski}
3057cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_name_request_complete
3061cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski*
30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when remote name was obtained from
30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer device
30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status)
30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int              i;
30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS        dev_class;
30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sec_state;
30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete");
30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda))
30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr)))
30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_acl_resubmit_page();
30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If remote name request failed, p_bd_addr is null and we need to search */
30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* based on state assuming that we are doing 1 at a time */
30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_bd_addr)
30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec = btm_find_dev (p_bd_addr);
30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3088cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        list_node_t *node = list_foreach(btm_cb.sec_dev_rec, is_state_getting_name, NULL);
3089cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        if (node != NULL) {
3090cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski            p_dev_rec = list_node(node);
3091cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski            p_bd_addr = p_dev_rec->bd_addr;
3092cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        } else {
30937db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach            p_dev_rec = NULL;
3094cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        }
30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_bd_name)
31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bd_name = (UINT8 *)"";
31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3105c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach        BTM_TRACE_EVENT ("%s PairState: %s  RemName: %s  status: %d State:%d  p_dev_rec: 0x%08x ", __func__,
31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status, p_dev_rec->sec_state, p_dev_rec);
3108c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach    } else {
3109c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach        BTM_TRACE_EVENT ("%s PairState: %s  RemName: %s  status: %d", __func__,
31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state), p_bd_name,
31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          status);
31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        old_sec_state = p_dev_rec->sec_state;
31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
312066209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach            strlcpy((char *)p_dev_rec->sec_bd_name, (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN);
31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
31225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags);
31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */
31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_bd_name[0] = 0;
31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)
31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved */
31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3136831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class,
31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                 p_dev_rec->sec_bd_name);
31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3140c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach    } else {
31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[0] = 0;
31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[1] = 0;
31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        dev_class[2] = 0;
31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify all clients waiting for name to be resolved even if not found so clients can continue */
31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++)
31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3148831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta            if (btm_cb.p_rmt_name_callback[i] && p_bd_addr)
31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)"");
31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we were delaying asking UI for a PIN because name was not resolved, ask now */
31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr
31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) )
31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3159c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach        BTM_TRACE_EVENT ("%s() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)",
3160c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach            __func__, btm_cb.pairing_flags, btm_cb.api.p_pin_callback);
31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3162c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0 && btm_cb.api.p_pin_callback)
31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3164c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach            BTM_TRACE_EVENT ("%s() calling pin_callback", __func__);
31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
3166818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name,
3167818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (p_dev_rec->p_cur_service==NULL) ? FALSE
3168818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                     : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN));
31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the same state again to force the timer to be restarted */
31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if we were delaying bonding because name was not resolved */
31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME)
31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0)
31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3181c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach            BTM_TRACE_EVENT ("%s() continue bonding sm4: 0x%04x, status:0x%x", __func__, p_dev_rec->sm4, status);
3182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD)
3183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
3184ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_sec_bond_cancel_complete();
3185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                return;
3186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
3187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
31885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != HCI_SUCCESS)
31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_cb.api.p_auth_complete_callback)
31937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
31947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                            p_dev_rec->sec_bd_name, status);
31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */
31995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/
32027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* If it is set, there may be a race condition */
3203c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach                BTM_TRACE_DEBUG ("%s IS_SM4_UNKNOWN Flags:0x%04x", __func__,
32047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                   btm_cb.pairing_flags);
32055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0)
32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 |= BTM_SM4_KNOWN;
32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__,
32107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4),
32117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4));
32127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN.
32145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed)
32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec))
32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */
32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /*  before originating  */
32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)
32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3222c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach                    BTM_TRACE_WARNING ("%s: waiting HCI_Connection_Complete after rejecting connection", __func__);
32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Both we and the peer are 2.1 - continue to create connection */
32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3227c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach                    BTM_TRACE_WARNING ("%s: failed to start connection", __func__);
32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    if (btm_cb.api.p_auth_complete_callback)
32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3237c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach        } else {
3238c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach            BTM_TRACE_WARNING ("%s: wrong BDA, retry with pairing BDA", __func__);
32397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR);
32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if we were delaying link_key_callback because name was not resolved */
32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->link_key_not_sent)
32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HCI connection complete has not arrived, wait for it */
32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)
32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = FALSE;
32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_send_link_key_notif(p_dev_rec);
32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If its not us who perform authentication, we should tell stackserver */
32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* that some authentication has been completed                          */
32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* This is required when different entities receive link notification and auth complete */
32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, HCI_SUCCESS);
32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)");
32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE);
32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer(p_dev_rec->hci_handle);
32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (old_sec_state != BTM_SEC_STATE_GETTING_NAME)
32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If get name failed, notify the waiting layer */
32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event  (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND)
32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
32895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("waiting for remote features!!");
32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remote Name succeeded, execute the next security procedure, if any */
32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_CMD_STARTED)
32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is no next procedure or start of procedure failed, notify the waiting layer */
33017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_sec_dev_rec_cback_event  (p_dev_rec, status, FALSE);
33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_rmt_host_support_feat_evt
33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the
33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received
33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p)
33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR         bd_addr;        /* peer address */
33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_FEATURES     features;
33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (bd_addr, p);
33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bd_addr);
33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt  sm4: 0x%x  p[0]: 0x%x", p_dev_rec->sm4, p[0]);
33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 = BTM_SM4_KNOWN;
33283aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE);
33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (HCI_SSP_HOST_SUPPORTED(features))
33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 = BTM_SM4_TRUE;
33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
33335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]);
33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_req
33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when LM request for the IO
33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  capability of the local device and
33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if the OOB data is present for the device in the event
33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
33485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p)
33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_REQ  evt_data;
33515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           err_code = 0;
33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
33535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         is_orig = TRUE;
33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           callback_rc = BTM_SUCCESS;
33555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* setup the default response according to compile options */
33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* assume that the local IO capability does not change
33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * loc_io_caps is initialized with the default value */
33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.io_cap = btm_cb.devcb.loc_io_caps;
33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.oob_data = BTM_OOB_NONE;
33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.auth_req = BTM_DEFAULT_AUTH_REQ;
33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state));
33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
3368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3369899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__,
3370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                      btm_cb.security_mode, p_dev_rec->num_read_pages);
3371899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0))
3373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Device security mode is SC only.",
3375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         "To continue need to know remote features.", __FUNCTION__);
3376899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3377899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = TRUE;
3378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return;
3379899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3380899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 |= BTM_SM4_TRUE;
33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3383899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_EVENT("%s: State: %s  Flags: 0x%04x  p_cur_service: 0x%08x",
3384899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state),
3385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                     btm_cb.pairing_flags, p_dev_rec->p_cur_service);
33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->p_cur_service)
33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3389899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x",
3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, p_dev_rec->p_cur_service->psm,
3391899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         p_dev_rec->p_cur_service->security_flags);
3392899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3394899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    switch (btm_cb.pairing_state)
3395899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3396899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator connecting */
3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_IDLE:
3398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //TODO: Handle Idle pairing state
3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            //security_required = p_dev_rec->security_required;
3400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* received IO capability response already->acceptor */
3403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_INCOMING_SSP:
34045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_orig = FALSE;
34055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD)
3407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* acceptor in dedicated bonding */
34095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
3410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* initiator, at this point it is expected to be dedicated bonding
3414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        initiated by local device */
3415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        case BTM_PAIR_STATE_WAIT_PIN_REQ:
3416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN))
34175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ;
34195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
34205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
34215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                err_code = HCI_ERR_HOST_BUSY_PAIRING;
34235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* any other state is unexpected */
3427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        default:
34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            err_code = HCI_ERR_HOST_BUSY_PAIRING;
3429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__,
3430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             btm_cb.pairing_state);
3431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            break;
34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_disabled)
3435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* pairing is not allowed */
3437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__);
34385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
3440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
3442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections();
3443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* device in Secure Connections Only mode */
3444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections))
3445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,",
3447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__,
3448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                            local_supports_sc, p_dev_rec->remote_supports_secure_connections);
3449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            err_code = HCI_ERR_PAIRING_NOT_ALLOWED;
3451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
34535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (err_code != 0)
34555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code);
34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.is_orig = is_orig;
34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_orig)
34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
34685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* local device initiated the pairing non-bonding -> use p_cur_service */
34695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) &&
34705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_cur_service &&
34715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE))
34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3475899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                /* SC only mode device requires MITM protection */
3476899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = BTM_AUTH_SP_YES;
3477899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
3478899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            else
3479899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            {
3480899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags &
3481899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                                     BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO;
3482899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            }
34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: False-positive: evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS);
34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    callback_rc = BTM_SUCCESS;
35015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sm4 & BTM_SM4_UPGRADE)
35025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE;
35045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */
35065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.auth_req = BTM_AUTH_SPGB_YES;
35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (btm_cb.api.p_sp_callback)
35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* the callback function implementation may change the IO capability... */
35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data))
35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD))
35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT));
35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3521899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        if (btm_cb.security_mode == BTM_SEC_MODE_SC)
3522899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        {
3523899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* At this moment we know that both sides are SC capable, device in */
3524899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            /* SC only mode requires MITM for any service so let's set MITM bit */
3525899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            evt_data.auth_req |= BTM_AUTH_YN_BIT;
3526899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x",
3527899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                             __FUNCTION__, evt_data.auth_req);
3528899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        }
3529899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
3530899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* if the user does not indicate "reply later" by setting the oob_data to unknown */
3531899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        /* send the response right now. Save the current IO capability in the control block */
35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_auth_req   = evt_data.auth_req;
35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.devcb.loc_io_caps    = evt_data.io_cap;
35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: State: %s  IO_CAP:%d oob_data:%d auth_req:%d",
3536899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap,
3537899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                         evt_data.oob_data, evt_data.auth_req);
35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap,
35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    evt_data.oob_data, evt_data.auth_req);
35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_io_capabilities_rsp
35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the IO capability of the
35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  specified device is received
35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p)
35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_IO_RSP evt_data;
35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.io_cap, p);
35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.oob_data, p);
35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (evt_data.auth_req, p);
35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Allocate a new device record or reuse the oldest one */
35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr);
35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no security is in progress, this indicates incoming security */
35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN);
35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP);
35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* work around for FW bug */
35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_stop_on_ssp();
35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (evt_data.bd_addr);
35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We must have a device record here.
35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * Use the connecting device's CoD for the connection */
35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call]
35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp"
35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFALSE-POSITIVE error from Coverity test-tool. evt_data.bd_addr is set at the beginning with:     STREAM_TO_BDADDR (evt_data.bd_addr, p);
35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN))
35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN);
35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */
35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */
35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (evt_data.auth_req & BTM_AUTH_DD_BOND) )            /* and dedicated bonding bit is set */
35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD;
35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* save the IO capability in the device record */
36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_io_caps  = evt_data.io_cap;
36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rmt_auth_req = evt_data.auth_req;
36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_proc_sp_req_evt
36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_USER_CONFIRMATION_REQUEST_EVT
36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_REQUEST_EVT
36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or HCI_USER_PASSKEY_NOTIFY_EVT
36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p)
36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_ERR_PROCESSING;
36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_EVT_DATA evt_data;
36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_bda = evt_data.cfm_req.bd_addr;
36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All events start with bd_addr */
36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s",
36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], (p_bda[4] << 8) + p_bda[5],
36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      event, btm_pair_state_descr(btm_cb.pairing_state));
36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL)
36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
364166209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy((char *)evt_data.cfm_req.bd_name, (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN);
36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (event)
36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_CFM_REQ_EVT:
36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Numeric confirmation. Need user to conf the passkey */
36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);
36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* The device record must be allocated in the "IO cap exchange" step */
36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p);
36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.just_works = TRUE;
36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* process user confirm req in association with the auth_req param */
36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO)
36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO)
36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO)
36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     &&  ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) )
36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Both devices are DisplayYesNo and one or both devices want to authenticate
36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       -> use authenticated link key */
36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    evt_data.cfm_req.just_works = FALSE;
36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("btm_proc_sp_req_evt()  just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d",
36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps,
36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req);
36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_auth_req   = btm_cb.devcb.loc_auth_req;
36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_auth_req   = p_dev_rec->rmt_auth_req;
36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.loc_io_caps    = btm_cb.devcb.loc_io_caps;
36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                evt_data.cfm_req.rmt_io_caps    = p_dev_rec->rmt_io_caps;
36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_NOTIF_EVT:
36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Passkey notification (other side is a keyboard) */
36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT32 (evt_data.key_notif.passkey, p);
36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT:  passkey: %u", evt_data.key_notif.passkey);
36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_SP_KEY_REQ_EVT:
36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HCI_USER_PASSKEY_REQUEST_EVT */
36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY);
36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_sp_callback)
36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data);
36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status != BTM_NOT_AUTHORIZED)
36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */
37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) )
37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* automatically reply with just works if no sp_cback */
37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event == BTM_SP_CFM_REQ_EVT)
37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status);
37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_ConfirmReqReply (status, p_bda);
37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (event == BTM_SP_KEY_REQ_EVT)
37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PasskeyReqReply(status, p_bda, 0);
37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Something bad. we can only fail this connection */
37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_SP_CFM_REQ_EVT == event)
37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_conf_reply (p_bda, FALSE);
37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (BTM_SP_KEY_NOTIF_EVT == event)
37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing -> it very unlikely to happen.
37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        This event is most likely to be received by a HID host when it first connects to a HID device.
37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        Usually the Host initiated the connection in this case.
37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        On Mobile platforms, if there's a security process happening,
37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        the host probably can not initiate another connection.
37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTW (PC) is another story.  */
37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (NULL != (p_dev_rec = btm_find_dev (p_bda)) )
37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE);
37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_user_passkey_neg_reply(p_bda);
37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_keypress_notif_evt
37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a key press notification is
37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received
37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid  btm_keypress_notif_evt (UINT8 *p)
37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_KEYPRESS    evt_data;
37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse & report BTM_SP_KEYPRESS_EVT */
37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_bda = evt_data.bd_addr;
37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR (p_bda, p);
37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.notif_type = *p;
37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_simple_pair_complete
37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when simple pairing process is
37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete
37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p)
37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_COMPLT  evt_data;
37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status;
37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN         disc = FALSE;
37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = *p++;
37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (evt_data.bd_addr, p);
37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL)
37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
37985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x",
37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[0]<<24) + (evt_data.bd_addr[1]<<16) + (evt_data.bd_addr[2]<<8) + evt_data.bd_addr[3],
38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]);
38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_simple_pair_complete()  Pair State: %s  Status:%d  sec_state: %u",
38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),  status, p_dev_rec->sec_state);
38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    evt_data.status = BTM_ERR_PROCESSING;
38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_PAIRING_NOT_ALLOWED)
38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* The test spec wants the peer device to get this failure code. */
38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT);
38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Change the timer to 1 second */
382178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(btm_cb.pairing_timer, BT_1SEC_TIMEOUT_MS,
382278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btm_sec_pairing_timeout, NULL,
382378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btu_general_alarm_queue);
38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0)
38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop the timer */
382878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(btm_cb.pairing_timer);
38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* the initiating side: will receive auth complete event. disconnect ACL at that time */
38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                disc = TRUE;
38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc = TRUE;
38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Let the pairing state stay active, p_auth_complete_callback will report the failure */
38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (disc)
38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* simple pairing failed */
3850db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        /* Avoid sending disconnect on HCI_ERR_PEER_USER */
3851db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))
3852db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
3853db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
3854db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_rem_oob_req
38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to process/report
38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  HCI_REMOTE_OOB_DATA_REQUEST_EVT
38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p)
38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_bda;
38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_RMT_OOB  evt_data;
38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      c;
38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_OCTET16      r;
38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_bda = evt_data.bd_addr;
38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR (p_bda, p);
38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x",
38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) &&
38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btm_cb.api.p_sp_callback)
38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN);
38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN);
388866209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy((char *)evt_data.bd_name, (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN);
38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP);
38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((*btm_cb.api.p_sp_callback) (BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data) == BTM_NOT_AUTHORIZED)
38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_RemoteOobDataReply(TRUE, p_bda, c, r);
38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* something bad. we can only fail this connection */
38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY;
39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_rem_oob_neg_reply (p_bda);
39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_read_local_oob_complete
39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when read local oob data is
39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p)
39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SP_LOC_OOB evt_data;
39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           status = *p++;
39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status);
39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == HCI_SUCCESS)
39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_SUCCESS;
39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.c, p);
39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_ARRAY16(evt_data.r, p);
39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_data.status = BTM_ERR_PROCESSING;
39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_sp_callback)
39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data);
39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_collision
39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when authentication or encryption
39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  needs to be retried at a later time.
39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle)
39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btm_cb.collision_start_time)
3947c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov        btm_cb.collision_start_time = time_get_os_boottime_ms();
39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3949c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov    if ((time_get_os_boottime_ms() - btm_cb.collision_start_time) < btm_cb.max_collision_delay)
39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (handle == BTM_SEC_INVALID_HANDLE)
39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL)
39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING);
39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_find_dev_by_handle (handle);
39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec != NULL)
39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
39615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state);
39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We will restart authentication after timeout */
39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING)
39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_state = 0;
39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.p_collided_dev_rec = p_dev_rec;
396778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(btm_cb.sec_collision_timer, BT_1SEC_TIMEOUT_MS,
396878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btm_sec_collision_timeout, NULL,
396978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btu_general_alarm_queue);
39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_auth_complete
39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when authentication of the connection is
39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status)
39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            old_sm4;
39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state   = btm_cb.pairing_state;
39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle);
39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             are_bonding = FALSE;
39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d  dev->sec_state: %u  Bda:%08x, RName:%s",
39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status,
39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_state,
40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (p_dev_rec->bd_addr[2]<<24)+(p_dev_rec->bd_addr[3]<<16)+(p_dev_rec->bd_addr[4]<<8)+p_dev_rec->bd_addr[5],
40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s  handle:%u  status:%d",
40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr (btm_cb.pairing_state),
40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          handle, status);
40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if connection was made just to do bonding.  If we authenticate
40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       the connection that is up, this is the last event received.
40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec
40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))
40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* keep the old sm4 flag and clear the retry bit in control block */
40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    old_sm4 = p_dev_rec->sm4;
40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= ~BTM_SM4_RETRY;
40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        are_bonding = TRUE;
40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4046e11f228d1a18486cd00c36487812a763487a236fSrinu Jella    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
4047e11f228d1a18486cd00c36487812a763487a236fSrinu Jella          &&  (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) )
4048e11f228d1a18486cd00c36487812a763487a236fSrinu Jella        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)
40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS)
40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  (old_state != BTM_PAIR_STATE_IDLE) )
40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be a race condition, when we are starting authentication and
40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** the peer device is doing encryption.
40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** If first we receive encryption change up, then initiated authentication
40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** can not be performed.  According to the spec we can not do authentication
40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** on the encrypted link, so device is correct.
40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_ERR_COMMAND_DISALLOWED)
40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) ==
40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)))
40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = HCI_SUCCESS;
40735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Currently we do not notify user if it is a keyboard which connects */
40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* User probably Disabled the keyboard while it was asleap.  Let her try */
40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_auth_complete_callback)
40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* report the suthentication status */
40795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state != BTM_PAIR_STATE_IDLE)
40805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, status);
40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is a bonding procedure can disconnect the link now */
40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (are_bonding)
40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status != HCI_SUCCESS)
4093db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        {
4094db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta            if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)))
4095db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta                btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle);
4096db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta        }
40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL");
4100e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec))
4101e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* no LE keys are available, do deriving */
4102e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4103e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4104e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) &&
4105e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL");
41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (btm_sec_is_master(p_dev_rec))
4110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                {
4111e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // Encryption is required to start SM over BR/EDR
4112e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    // indicate that this is encryption after authentication
4113f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                    BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL, 0);
4114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                }
4115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            l2cu_start_post_bond_timer (p_dev_rec->hci_handle);
4117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4118e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If authentication failed, notify the waiting layer */
41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((old_sm4 & BTM_SM4_RETRY) == 0)
41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* allow retry only once */
41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION)
41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this retry for missing key is for Lisbon or later only.
41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * Legacy device do not need this. the controller will drive the retry automatically */
41365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4))
41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* not retried yet. set the retry bit */
41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sm4 |= BTM_SM4_RETRY;
41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
41415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags);
41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* With BRCM controller, we do not need to delete the stored link key in controller.
41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                If the stack may sit on top of other controller, we may need this
41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_DeleteStoredLinkKey (bd_addr, NULL); */
41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->sm4 & BTM_SM4_RETRY)
41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
41505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_execute_procedure (p_dev_rec);
41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)
41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
41597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED;
41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4166818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4167818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4168818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4169818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        // If we have MITM protection we have a higher level of security than
4170818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        // provided by 16 digits PIN
4171818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4172818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4173818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Authentication succeeded, execute the next security procedure, if any */
41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = btm_sec_execute_procedure (p_dev_rec);
41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
41797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_encrypt_change
41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when encryption of the connection is
41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  completed by the LM
41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
41905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
41915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
41925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable)
41935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
41945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
4195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
41967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tACL_CONN       *p_acl = NULL;
41977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8           acl_idx = btm_handle_to_acl_index(handle);
4198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
41995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d",
42005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable);
42015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 );
42025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* For transaction collision we need to wait and repeat.  There is no need */
42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for random timeout because only slave should receive the result */
4205e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) ||
4206e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        (status == HCI_ERR_DIFF_TRANSACTION_COLLISION))
42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_auth_collision(handle);
42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.collision_start_time = 0;
42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && encr_enable)
42177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
4218818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        if (p_dev_rec->hci_handle == handle) {
42197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED);
4220818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            if (p_dev_rec->pin_code_length >= 16 ||
4221818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4222818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4223818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4224818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            }
4225818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
42267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
4227818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        {
42287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED);
4229818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
42307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* It is possible that we decrypted the link to perform role switch */
42335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* mark link not to be encrypted, so that when we execute security next time it will kick in again */
42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status == HCI_SUCCESS) && !encr_enable)
42357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
42367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec->hci_handle == handle)
42377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED;
42387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
42397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED;
42407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
42415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
42425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags );
4243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
42445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4245e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (acl_idx != MAX_L2CAP_LINKS)
42467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_acl = &btm_cb.acl_db[acl_idx];
4247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4248efa5991fc7dc3b9b74b73966a4bf5cd5aad9f06aPavlin Radoslavov    if (p_acl != NULL)
4249efa5991fc7dc3b9b74b73966a4bf5cd5aad9f06aPavlin Radoslavov        btm_sec_check_pending_enc_req(p_dev_rec, p_acl->transport, encr_enable);
4250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
42517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_acl && p_acl->transport == BT_TRANSPORT_LE)
42525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4253e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE ||
4254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)
4255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4256d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN);
4257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
4258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4259dea4f9b42fd373d8a46565d933ec49a6583a9117Satya Calloji        btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable);
42605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
42615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
42625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4263e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    {
42645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* BR/EDR connection, update the encryption key size to be 16 as always */
42655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->enc_key_size = 16;
4266e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    }
4267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4268e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun     BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d",
4269e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                       __func__, p_dev_rec->new_encryption_key_is_p256);
4270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle))
4272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (p_dev_rec->new_encryption_key_is_p256)
4274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (btm_sec_use_smp_br_chnl(p_dev_rec) &&
4276e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                btm_sec_is_master(p_dev_rec) &&
4277e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* if LE key is not known, do deriving */
4278e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) ||
4279e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                /* or BR key is higher security than existing LE keys */
4280e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED)
4281e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                 && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED))))
4282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* BR/EDR is encrypted with LK that can be used to derive LE LTK */
4284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                p_dev_rec->new_encryption_key_is_p256 = FALSE;
4285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4286e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                if (p_dev_rec->no_smp_on_br)
4287e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4288e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__);
4289e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4290e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                else
4291e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                {
4292e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__);
4293e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                    SMP_BR_PairWith(p_dev_rec->bd_addr);
4294e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                }
4295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        else
4298e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        {
4299e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // BR/EDR is successfully encrypted. Correct LK type if needed
4300e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            // (BR/EDR LK derived from LE LTK was used for encryption)
4301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if ((encr_enable == 1)  && /* encryption is ON for SSP */
4302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                /* LK type is for BR/EDR SC */
4303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 ||
4304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                 p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
4306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)
4307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB;
4308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */
4309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB;
4310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
4311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type);
4312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                btm_send_link_key_notif(p_dev_rec);
4313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
4314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else
4317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable);
4318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */
43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this encryption was started by peer do not need to do anything */
43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING)
43225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state)
43245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
43265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->p_callback = NULL;
43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr);
43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If encryption setup failed, notify the waiting layer */
43345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
43367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Encryption setup succeeded, execute the next security procedure, if any */
43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = (UINT8)btm_sec_execute_procedure (p_dev_rec);
43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there is no next procedure, or procedure failed to start, notify the caller */
43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
43447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE);
43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connect_after_reject_timeout
43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Connection for bonding could not start because of the collision
43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Initiate outgoing connection
43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
435778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_connect_after_reject_timeout(UNUSED_ATTR void *data)
43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec;
43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
436178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    BTM_TRACE_EVENT("%s", __func__);
43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.p_collided_dev_rec = 0;
43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED)
43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
436678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        BTM_TRACE_WARNING("Security Manager: %s: failed to start connection",
436778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                          __func__);
43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (btm_cb.api.p_auth_complete_callback)
43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,  p_dev_rec->dev_class,
43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL);
43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_connected
43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  establsihed
43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode)
43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda);
43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            res;
43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          is_pairing_device = FALSE;
43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb;
43937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    UINT8            bit_shift = 0;
43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
43965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Commenting out trace due to obf/compilation problems.
43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec)
44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x RName:%s",
44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5],
44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->sec_bd_name);
44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s  handle:%d status:%d enc_mode:%d  bda:%x ",
44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode,
44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]);
44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no device record for new connection.  Allocate one */
44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_SUCCESS)
44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec = btm_sec_alloc_dev (bda);
44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4424bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            /* If the device matches with stored paring address
4425bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella             * reset the paring state to idle */
4426bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
4427bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella                (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0))
4428bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            {
4429bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella                btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
4430bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella            }
4431bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella
44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* can not find the device record and the status is error,
44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * just ignore it */
44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* Update the timestamp for this device */
44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
44397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
44407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
44417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0;
44427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->timestamp = btm_cb.dev_rec_count++;
44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND)
44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell L2CAP it's a bonding connection. */
44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if incoming connection failed while pairing, then try to connect and continue */
44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Motorola S9 disconnects without asking pin code */
44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ))
44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                    BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN");
44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* Start timer with 0 to initiate connection with new LCB */
44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        /* because L2CAP will delete current LCB with this event  */
44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_cb.p_collided_dev_rec = p_dev_rec;
446378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                        alarm_set_on_queue(btm_cb.sec_collision_timer, 0,
446478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                           btm_sec_connect_after_reject_timeout,
446578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                           NULL, btu_general_alarm_queue);
44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
44707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                        BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR);
44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE);
44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* always clear the pending flag */
44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND;
44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE
44887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR;
44897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
44907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending   = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) )
44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if we rejected incoming connection from bonding device */
45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((status == HCI_ERR_HOST_REJECT_DEVICE)
45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT))
45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x",
45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags, p_dev_rec->sm4);
45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT;
45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4))
45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */
45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME);
45127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR);
45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if we already have pin code */
45175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN)
45185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Start timer with 0 to initiate connection with new LCB */
45205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* because L2CAP will delete current LCB with this event  */
45215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.p_collided_dev_rec = p_dev_rec;
452278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                alarm_set_on_queue(btm_cb.sec_collision_timer, 0,
452378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                   btm_sec_connect_after_reject_timeout,
452478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                   NULL, btu_general_alarm_queue);
45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* wait for incoming connection without resetting pairing state */
45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (status == HCI_ERR_CONNECTION_EXISTS)
45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection");
45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_pairing_device = TRUE;
45375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if connection fails during pin request, notify application */
45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != HCI_SUCCESS)
45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If connection failed because of during pairing, need to tell user */
45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_pairing_device)
45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift);
45505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required );
45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /*
45637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta     Do not send authentication failure, if following conditions hold good
45647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      1.  BTM Sec Pairing state is idle
45657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      2.  Link key for the remote device is present.
45667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta      3.  Remote is SSP capable.
45677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta  */
45687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else if  ((p_dev_rec->link_key_type  <= BTM_LKEY_TYPE_REMOTE_UNIT) &&
45697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (((status == HCI_ERR_AUTH_FAILURE)                      ||
45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_KEY_MISSING)                         ||
45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_HOST_REJECT_SECURITY)                ||
45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_NOT_ALLOWED)                 ||
45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_UNIT_KEY_USED)                       ||
45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) ||
45755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE)           ||
45767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                 (status == HCI_ERR_REPEATED_ATTEMPTS))))
45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
45797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift);
45807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
45817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE
45827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* If we rejected pairing, pass this special result code */
45837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY)
45847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
45857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                status = HCI_ERR_HOST_REJECT_SECURITY;
45867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
45877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify host that the key is not known any more */
45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
45925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->dev_class,
45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                        p_dev_rec->sec_bd_name, status);
45955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
45975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
45985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT  ||
45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status == HCI_ERR_UNSPECIFIED     || status == HCI_ERR_PAGE_TIMEOUT)
46007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE);
46015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
46027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE);
46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If initiated dedicated bonding, return the link key now, and initiate disconnect */
46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If dedicated bonding, and we now have a link key, we are all done */
46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( is_pairing_device
46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) )
46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->link_key_not_sent)
46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->link_key_not_sent = FALSE;
46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_send_link_key_notif(p_dev_rec);
46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE;
46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* remember flag before it is initialized */
46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = TRUE;
46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            res = FALSE;
46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->dev_class,
46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( res )
46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Let l2cap start bond timer */
46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE);
46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->hci_handle = handle;
46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* role may not be correct here, it will be updated by l2cap, but we need to */
46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* notify btm_acl that link is up, so starting of rmt name request will not */
46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set paging flag up */
46477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR);
46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_acl_cb)
46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */
46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* For now there are a some devices that do not like sending */
46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* commands events and data at the same time. */
46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the packet types to the default allowed by the device */
46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.btm_def_link_policy)
46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_acl_created (bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle, HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize security flags.  We need to do that because some            */
46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* authorization complete could have come after the connection is dropped */
46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* and that would set wrong flag that link has been authorized already    */
46667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED |
46677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift);
46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enc_mode != HCI_ENCRYPT_MODE_DISABLED)
46707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift);
46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode == BTM_SEC_MODE_LINK)
46737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift);
46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4676818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4677818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4678818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift);
4679818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4680818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->link_key_changed = FALSE;
46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* After connection is established we perform security if we do not know */
46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* the name, or if we are originator because some procedure can have */
46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* been scheduled while connection was down */
46865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator);
46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator)
46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED)
46907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE);
46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
46925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnect
46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to disconnect HCI link
47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          btm status
47025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason)
47055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
47075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* In some weird race condition we may not have a record */
47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_disconnect (handle, reason);
47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_SUCCESS);
47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)
47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) )
47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we are currently doing bonding.  Link will be disconnected when done */
47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE;
47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_disconnected
47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is when a connection to the peer device is
47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  dropped
47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason)
47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec = btm_find_dev_by_handle (handle);
47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8             old_pairing_flags = btm_cb.pairing_flags;
47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               result = HCI_ERR_AUTH_FAILURE;
4743ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    tBTM_SEC_CALLBACK   *p_callback = NULL;
47447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBT_TRANSPORT      transport = BT_TRANSPORT_BR_EDR;
47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If page was delayed for disc complete, can do it now */
47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.discing = FALSE;
47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_resubmit_page();
47505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev_rec)
47525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    transport  = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE;
47557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
4757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE
4759db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_INFO(LOG_TAG, "%s clearing pending flag handle:%d reason:%d", __func__, handle, reason);
47605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING;     /* reset flag */
47615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
47625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear unused flags */
47645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 &= BTM_SM4_TRUE;
47655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4766f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr;
4767f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x"
4768f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            "  remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state),
4769f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton            reason, bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5], p_dev_rec->sec_bd_name);
47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4771f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we are in the process of bonding we need to tell client that auth failed */
47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0))
47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the disconnection reason is REPEATED_ATTEMPTS,
47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               send this error message to complete callback function
47835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               to display the error message of Repeated attempts.
47845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               All others, send HCI_ERR_AUTH_FAILURE. */
47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (reason == HCI_ERR_REPEATED_ATTEMPTS)
47865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_REPEATED_ATTEMPTS;
47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                result = HCI_ERR_HOST_REJECT_SECURITY;
47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,     p_dev_rec->dev_class,
47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, result);
47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
479924adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera    btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS);
48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see sec_flags processing in btm_acl_removed */
48017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
48027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
48037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
48047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE;
48057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED);
480682c8b9270ba962d5f271a833a3454baddbc063aaNitin Arora        p_dev_rec->enc_key_size = 0;
48077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
48087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
48107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
48117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE;
4812818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED
4813818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED);
48147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE
4817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)
4818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ?
4820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE;
4821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return;
4822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
48247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_dev_rec->sec_state  = BTM_SEC_STATE_IDLE;
48255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required = BTM_SEC_NONE;
4826ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4827ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    p_callback = p_dev_rec->p_callback;
4828ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4829ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    /* if security is pending, send callback to clean up the security state */
4830ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    if(p_callback)
4831ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    {
4832ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach        p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before
4833ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach                                         we do, this call back must be reset here */
48347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING);
4835ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach    }
4836ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach
4837f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton    BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags);
48385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
48395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
48415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_notification
48435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a new connection link key is
48455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  generated
48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
48485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
48495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type)
48515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
48525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
4853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         we_are_bonding = FALSE;
4854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BOOLEAN         ltk_derived_lk  = FALSE;
48555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_notification()  BDA:%04x%08x, TYPE: %d",
48575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5],
48585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      key_type);
48595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) &&
4861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256))
4862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        ltk_derived_lk = TRUE;
4864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        key_type -= BTM_LTK_DERIVED_LKEY_OFFSET;
4865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection was made to do bonding restore link security if changed */
48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_restore_mode();
48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_type != BTM_LKEY_TYPE_CHANGED_COMB)
48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_type = key_type;
48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN;
4873818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
4874818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    /*
4875818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     * Until this point in time, we do not know if MITM was enabled, hence we
4876818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     * add the extended security flag here.
4877818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde     */
4878818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if (p_dev_rec->pin_code_length >= 16 ||
4879818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB ||
4880818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) {
4881818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED;
4882818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    }
4883818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
4884ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
4885ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* BR/EDR connection, update the encryption key size to be 16 as always */
4886ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_dev_rec->enc_key_size = 16;
4887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
48885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN);
48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) )
48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            we_are_bonding = TRUE;
48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4899444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* save LTK derived LK no matter what */
4900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (ltk_derived_lk)
4901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (btm_cb.api.p_link_key_callback)
4903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)",
4905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                  __FUNCTION__, p_dev_rec->link_key_type);
4906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_dev_rec->sec_bd_name,
4908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                                   p_link_key, p_dev_rec->link_key_type);
4909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4911444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    else
4912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    {
4913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) ||
4914444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256))
4915444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
4916e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun             p_dev_rec->new_encryption_key_is_p256 = TRUE;
4917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji             BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d",
4918e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                               __func__, p_dev_rec->new_encryption_key_is_p256);
4919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
4920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
4921444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If name is not known at this point delay calling callback until the name is   */
49235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* resolved. Unless it is a HID Device and we really need to send all link keys. */
49245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
4925e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        &&  ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL))
4926e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        && !ltk_derived_lk)
49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_link_key_notification()  Delayed BDA: %08x%04x Type:%d",
4929444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3],
4930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                          (p_bda[4] << 8) + p_bda[5], key_type);
49315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->link_key_not_sent = TRUE;
49335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If it is for bonding nothing else will follow, so we need to start name resolution */
49355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (we_are_bonding)
49365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
49375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0)))
49385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_inq_rmt_name_failed();
49395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
49405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("rmt_io_caps:%d, sec_flags:x%x, dev_class[1]:x%02x", p_dev_rec->rmt_io_caps, p_dev_rec->sec_flags, p_dev_rec->dev_class[1])
49425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
49435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If its not us who perform authentication, we should tell stackserver */
49465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* that some authentication has been completed                          */
49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* This is required when different entities receive link notification and auth complete */
4948e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)
4949e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        /* for derived key, always send authentication callback for BR channel */
4950e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun         || ltk_derived_lk)
49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_auth_complete_callback)
49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                    p_dev_rec->sec_bd_name, HCI_SUCCESS);
49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We will save link key only if the user authorized it - BTE report link key in all cases */
49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE
49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)
49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.api.p_link_key_callback)
49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4964e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            if (ltk_derived_lk)
4965e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4966e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                BTM_TRACE_DEBUG ("btm_sec_link_key_notification()  LTK derived LK is saved already"
4967e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                    " (key_type = %d)", p_dev_rec->link_key_type);
4968e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
4969e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            else
4970e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            {
4971e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class,
4972e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_dev_rec->sec_bd_name,
4973e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun                                                   p_link_key, p_dev_rec->link_key_type);
4974e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun            }
49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda)
49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
49905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda);
49915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_link_key_request()  BDA: %02x:%02x:%02x:%02x:%02x:%02x",
49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) &&
4996b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (btm_cb.collision_start_time != 0) &&
4997b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) )
4998b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    {
4999b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req "
5000b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta            "State: %d START_TIMEOUT : %d",
5001b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta             btm_cb.pairing_state, btm_cb.collision_start_time);
5002b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        btsnd_hcic_link_key_neg_reply (p_bda);
5003b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta        return;
5004b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta    }
50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key);
50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify L2CAP to increase timeout */
50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2c_pin_code_request (p_bda);
50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The link key is not in the database and it is not known to the manager */
50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_link_key_neg_reply (p_bda);
50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pairing_timeout
50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when host does not provide PIN
50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  within requested time
50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
502878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_pairing_timeout(UNUSED_ATTR void *data)
50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB *p_cb = &btm_cb;
50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE)
50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_YES;
50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   name[2];
50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */
50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[UNUSED_VALUE] pointer p_dev_rec is actually used several times... This is a Coverity false-positive, i.e. a fake issue.
50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/
50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_dev (p_cb->pairing_bda);
50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
504478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    BTM_TRACE_EVENT ("%s  State: %s   Flags: %u", __func__,
50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags);
50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_cb->pairing_state)
50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:
50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_bond_cancel_complete();
50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:
50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0)
50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda);
50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that no longer need the PIN */
50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:
50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE);
50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:
50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda);
50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */
50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */
50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:
50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)
50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                auth_req |= BTM_AUTH_DD_BOND;
50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps,
50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         BTM_OOB_NONE, auth_req);
50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:
50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda);
50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:
51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* simple pairing failed. Started a 1-sec timer at simple pairing complete.
51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * now it's time to tear down the ACL link*/
51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec == NULL)
51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
510578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                BTM_TRACE_ERROR("%s BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x",
510678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                __func__,
510778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3],
510878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]);
51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle);
51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:
511605bb84c66dc4813b5da13a7d2db27e80fb613293Srinu Jella        case BTM_PAIR_STATE_GET_REM_NAME:
51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We need to notify the UI that timeout has happened while waiting for authentication*/
51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_auth_complete_callback)
51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_dev_rec == NULL)
51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    name[0] = 0;
51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda,
51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            NULL,
51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            name, HCI_ERR_CONNECTION_TOUT);
51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr,
51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->dev_class,
51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                            p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT);
51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
513678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            BTM_TRACE_WARNING("%s not processed state: %s", __func__,
513778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                              btm_pair_state_descr(btm_cb.pairing_state));
51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE);
51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_pin_code_request
51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests PIN code
51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda)
51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec;
51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CB          *p_cb = &btm_cb;
51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_pin_code_request()  State: %s, BDA:%04x%08x",
51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      btm_pair_state_descr(btm_cb.pairing_state),
51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      (p_bda[0]<<8)+p_bda[1], (p_bda[2]<<24)+(p_bda[3]<<16)+(p_bda[4]<<8)+p_bda[5] );
51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE)
51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0)  &&
51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) )
51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
51668ee098cd6bca17fc016dd3cc519dc5990be22429Andre Eisenbach             btsnd_hcic_pin_code_neg_reply (p_bda);
51678ee098cd6bca17fc016dd3cc519dc5990be22429Andre Eisenbach             return;
51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ)
51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0)
51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
51725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s",
51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                btm_pair_state_descr(btm_cb.pairing_state));
51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btsnd_hcic_pin_code_neg_reply (p_bda);
51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (p_bda);
51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* received PIN code request. must be non-sm4 */
51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sm4 = BTM_SM4_KNOWN;
51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE)
51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN);
51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD;
51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure we reset the trusted mask to help against attacks */
51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask);
51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED))
51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
51945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying");
51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code);
51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use the connecting device's CoD for the connection */
52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN))
52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         &&  (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) )
52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN);
52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* We could have started connection after asking user for the PIN code */
52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_code_len != 0)
52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply");
52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code);
52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Mark that we forwarded received from the user PIN code */
52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len = 0;
52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* We can change mode back right away, that other connection being established */
52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* is not forced to be secure - found a FW issue, so we can not do this
52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode(); */
52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);
52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If pairing disabled OR (no PIN callback and not bonding) */
52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* OR we could not allocate entry in the database reject pairing request */
52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cb->pairing_disabled
52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (p_cb->api.p_pin_callback == NULL)
52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* OR Microsoft keyboard can for some reason try to establish connection */
52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  the only thing we can do here is to shut it up.  Normally we will be originator */
52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /*  for keyboard bonding */
52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || (!p_dev_rec->is_originator
52305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL)
52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 &&  (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) )
52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!",
52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec);
52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_pin_code_neg_reply (p_bda);
52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Notify upper layer of PIN request and start expiration timer */
52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Pin code request can not come at the same time as connection request */
52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN);
52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (p_cb->connecting_dc,  p_dev_rec->dev_class, DEV_CLASS_LEN);
52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if the name is known */
52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Even if name is not known we might not be able to get one */
52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is the case when we are already getting something from the */
52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device, so HCI level is flow controlled */
52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Also cannot send remote name request while paging, i.e. connection is not completed */
52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback");
52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
5256818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            if (p_cb->api.p_pin_callback) {
5257818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name,
5258818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        (p_dev_rec->p_cur_service == NULL) ? FALSE
5259818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                : (p_dev_rec->p_cur_service->security_flags
5260818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                   & BTM_SEC_IN_MIN_16_DIGIT_PIN));
5261818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            }
52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
52655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name");
52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* We received PIN code request for the device with unknown name */
52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* it is not user friendly just to ask for the PIN without name */
52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* try to get name at first */
52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr,
52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_PAGE_SCAN_REP_MODE_R1,
52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                          HCI_MANDATARY_PAGE_SCAN_MODE, 0))
52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN;
52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[0] = 'f';
52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev_rec->sec_bd_name[1] = '0';
52775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback");
52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_cb->api.p_pin_callback)
5281818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class,
5282818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                            p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE
5283818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                    : (p_dev_rec->p_cur_service->security_flags
5284818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                       & BTM_SEC_IN_MIN_16_DIGIT_PIN));
52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_update_clock_offset
52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to update clock offset
52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset)
53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC  *p_dev_rec;
53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO     *p_inq_info;
53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL)
53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL)
53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID;
53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************
53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C     F U N C T I O N S
53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/
53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_execute_procedure
53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start required security
53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.  There is a case when multiplexing protocol
53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  calls this function on the originating side, connection to
53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the peer will not be established.  This function in this
53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  case performs only authorization.
53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS     - permission is granted
53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED - in process
53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES  - permission declined
53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec)
53375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
53385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d",
53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state);
53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There is a chance that we are getting name.  Wait until done. */
53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->sec_state != 0)
53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If any security is required, get the name first */
53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
53495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start get name");
53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_get_name (p_dev_rec))
53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
53545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authenticated and authentication is required */
53585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authentication and return PENDING to the caller */
5359818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde    if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))
53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE))
5361818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE))))
5362818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
5363818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            && (!p_dev_rec->is_originator
5364818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN))))
53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5367818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        /*
5368818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use,
5369818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the
5370818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM
5371818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * authenticated connections, hence we cannot distinguish here.
5372818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         */
5373818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
53755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start authentication");
53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5382818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        /*
5383818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * If we do have a link-key, but we end up here because we need an
5384818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * upgrade, then clear the link-key known and authenticated flag before
5385818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * restarting authentication.
5386818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * WARNING: If the controller has link-key, it is optional and
5387818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * recommended for the controller to send a Link_Key_Request.
5388818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * In case we need an upgrade, the only alternative would be to delete
5389818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * the existing link-key. That could lead to very bad user experience
5390818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * or even IOP issues, if a reconnect causes a new connection that
5391818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         * requires an upgrade.
5392818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde         */
5393818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)
5394818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                && (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED)
5395818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    && (!p_dev_rec->is_originator && (p_dev_rec->security_required
5396818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                            & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) {
5397818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde            p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED
5398818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                    | BTM_SEC_AUTHENTICATED);
5399818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde        }
5400818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde
54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_authentication (p_dev_rec))
54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not encrypted and encryption is required */
54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start encryption and return PENDING to the caller */
54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)
54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT))
54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT)))
54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE))
54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if incoming UCD packet, discard it */
54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE ))
54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_FAILED_ON_SECURITY);
54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("Security Manager: Start encryption");
54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_sec_start_encryption (p_dev_rec))
54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_NO_RESOURCES);
54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_CMD_STARTED);
54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) &&
5431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
5432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
5433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -",
5434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        "security failure", __FUNCTION__, p_dev_rec->link_key_type);
5435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return (BTM_FAILED_ON_SECURITY);
5436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
5437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If connection is not authorized and authorization is required */
54395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start authorization and return PENDING to the caller */
54405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED)
54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE))
54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE))))
54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT ("service id:%d, is trusted:%d",
54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          p_dev_rec->p_cur_service->service_id,
54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                      p_dev_rec->p_cur_service->service_id)));
54485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) &&
54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) &&
54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask,
54515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        p_dev_rec->p_cur_service->service_id) == FALSE))
54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
54535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("Security Manager: Start authorization");
54545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(btm_sec_start_authorization (p_dev_rec));
54555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
54565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* All required  security procedures already established */
54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE |
54605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE |
54615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT |
54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER |
54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE);
54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]);
54665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_EVENT ("Security Manager: access granted");
54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_SUCCESS);
54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_get_name
54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start get name procedure
54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec)
54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 tempstate = p_dev_rec->sec_state;
54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME;
54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Device should be connected, no need to provide correct page params */
54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* 0 and NULL are as timeout and callback params because they are not used in security get name case */
54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC,
54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                0, NULL)) != BTM_CMD_STARTED)
54905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
54915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->sec_state = tempstate;
54925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
54935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
54945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authentication
55015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authentication
55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec)
55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING;
55105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btsnd_hcic_auth_request (p_dev_rec->hci_handle));
55125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_encryption
55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start encryption
55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec)
55245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE))
55265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING;
55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_start_authorization
55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start authorization
55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if started
55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec)
55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    result;
55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_service_name = NULL;
55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    service_id;
55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN)
55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE))
55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btm_cb.api.p_authorize_callback)
55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(BTM_MODE_UNSUPPORTED);
55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_rec->p_cur_service)
55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0
55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev_rec->is_originator)
55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->orig_service_name;
55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_service_name = p_dev_rec->p_cur_service->term_service_name;
55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = p_dev_rec->p_cur_service->service_id;
55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_id = 0;
55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* Send authorization request if not already sent during this service connection */
5567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID
5568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            || p_dev_rec->last_author_service_id != service_id)
5569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
5570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING;
5571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr,
55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->dev_class,
55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->sec_bd_name,
55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_service_name,
55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     service_id,
55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     p_dev_rec->is_originator);
5577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else    /* Already authorized once for this L2CAP bringup */
5580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
55815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id);
5582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            return (BTM_SUCCESS);
5583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
5584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (result == BTM_SUCCESS)
55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED;
5588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
5589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* Save the currently authorized service in case we are asked again by another multiplexer layer */
5590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (!p_dev_rec->is_originator)
5591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev_rec->last_author_service_id = service_id;
5592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(result);
55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_start_get_name (p_dev_rec);
55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(BTM_CMD_STARTED);
55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_are_all_trusted
56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called check if all services are trusted
56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if all are trusted, otherwise FALSE
56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[])
56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT32 trusted_inx;
56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++)
56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL)
56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(FALSE);
56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(TRUE);
56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_first_serv
56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the first record in the service database
56275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5632ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin KochartBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm)
56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_originator;
56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE)
56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( conn_type & CONNECTION_TYPE_ORIG_MASK )
56415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = TRUE;
56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
56435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_originator = FALSE;
56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_originator = conn_type;
56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm)
56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the PSM matches p_out_serv,
56515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, just find the first record with the specified PSM */
56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) )
56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
56625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_next_serv
56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the next record in the service database
56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  with specified PSM
56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur)
56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec   = &btm_cb.sec_serv_rec[0];
56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               i;
56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == p_cur->psm) )
56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cur != p_serv_rec)
56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return(p_serv_rec);
56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_mx_serv
56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the service database with specified
56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  PSM and multiplexor channel information
56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm,
57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                UINT32 mx_proto_id, UINT32 mx_chan_id)
57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv;
57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0];
57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i;
57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5710444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s()", __func__);
57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_originator && p_out_serv && p_out_serv->psm == psm
57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->mx_proto_id == mx_proto_id
57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && p_out_serv->orig_mx_chan_id == mx_chan_id)
57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If this is outgoing connection and the parameters match p_out_serv,
57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * use it as the current service */
57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_cb.p_out_serv;
57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* otherwise, the old way */
57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++)
57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_serv_rec->security_flags & BTM_SEC_IN_USE)
57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->psm == psm)
57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (p_serv_rec->mx_proto_id == mx_proto_id)
57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (( is_originator && (p_serv_rec->orig_mx_chan_id  == mx_chan_id))
57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                || (!is_originator && (p_serv_rec->term_mx_chan_id  == mx_chan_id))))
57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_serv_rec);
57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(NULL);
57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_collision_timeout
57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Encryption could not start because of the collision
57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  try to do it again
57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the TLE struct
57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
574578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_collision_timeout(UNUSED_ATTR void *data)
57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5747444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()", __func__);
57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5749444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec);
57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If result is pending reply from the user or from the device is pending */
57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status != BTM_CMD_STARTED)
57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* There is no next procedure or start of procedure failed, notify the waiting layer */
57557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE);
57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_link_key_request
57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when controller requests link key
57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec)
57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
57705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.api.p_link_key_callback)
57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->sec_bd_name, p_dev_rec->link_key,
57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->link_key_type);
57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadTrustedMask
57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get trusted mask for the peer device
57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      bd_addr   - Address of the device
57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          NULL, if the device record is not found.
57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  otherwise, the trusted mask
57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
57885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr)
57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5790444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr);
5791444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (p_dev_rec != NULL)
57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(p_dev_rec->trusted_mask);
5793444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return NULL;
57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_restore_mode
57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the security mode to previous setting
58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  if it was changed during bonding.
58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void)
58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.security_mode_changed)
58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.security_mode_changed = FALSE;
5812444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK));
58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK));
58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.pin_type_changed)
58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_type_changed = FALSE;
58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type);
58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5823cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
5824cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_sec_state_equal(void *data, void *context)
5825cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{
5826cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    tBTM_SEC_DEV_REC *p_dev_rec = data;
5827cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    UINT8 *state = context;
5828cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
5829cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    if (p_dev_rec->sec_state == *state)
5830cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        return false;
5831cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
5832cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    return true;
5833cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski}
5834cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski
58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_find_dev_by_sec_state
58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Look for the record in the device database for the device
58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  which is being authenticated or encrypted
58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Pointer to the record or NULL
58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state)
58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5847cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state);
5848cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    if (n)
5849cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski        return list_node(n);
58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5851cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski    return NULL;
58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_change_pairing_state
58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to change pairing state
58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state)
58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PAIRING_STATE  old_state = btm_cb.pairing_state;
58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state));
5866444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_EVENT ("%s()  New: %s pairing_flags:0x%x", __func__,
5867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            btm_pair_state_descr(new_state), btm_cb.pairing_flags);
58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.pairing_state = new_state;
58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (new_state == BTM_PAIR_STATE_IDLE)
58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
587378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(btm_cb.pairing_timer);
58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pairing_flags = 0;
58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.pin_code_len  = 0;
58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Make sure the the lcb shows we are not bonding */
58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE);
58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_restore_mode();
58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_check_pending_reqs();
58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_inq_clear_ssp();
58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN);
58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
58885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
588978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        /* If transitioning out of idle, mark the lcb as bonding */
58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (old_state == BTM_PAIR_STATE_IDLE)
58915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE);
58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
589378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_set_on_queue(btm_cb.pairing_timer,
589478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           BTM_SEC_TIMEOUT_VALUE * 1000,
589578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btm_sec_pairing_timeout, NULL,
589678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                           btu_general_alarm_queue);
58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
58985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_pair_state_descr
59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE)
59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state)
59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE)
59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (state)
59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_IDLE:                   return("IDLE");
59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_GET_REM_NAME:           return("GET_REM_NAME");
59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_PIN_REQ:           return("WAIT_PIN_REQ");
59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_PIN:         return("WAIT_LOCAL_PIN");
59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM:   return("WAIT_NUM_CONFIRM");
59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_KEY_ENTRY:              return("KEY_ENTRY");
59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP:     return("WAIT_LOCAL_OOB_RSP");
59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS:      return("WAIT_LOCAL_IOCAPS");
59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_INCOMING_SSP:           return("INCOMING_SSP");
59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE:     return("WAIT_AUTH_COMPLETE");
59235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PAIR_STATE_WAIT_DISCONNECT:        return("WAIT_DISCONNECT");
59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return("???");
59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
5928104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer    sprintf(btm_cb.state_temp_buffer,"%hhu",state);
59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_cb.state_temp_buffer);
59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_dev_rec_cback_event
59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function calls the callback function with the given
59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  result and clear the callback function.
59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      void
59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
594532429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport)
59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_CALLBACK   *p_callback = p_dev_rec->p_callback;
59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev_rec->p_callback)
59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
59515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_rec->p_callback = NULL;
5952e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun
59531287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE
5954e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        if (is_le_transport)
5955e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res);
5956e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun        else
59571287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif
5958e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun           (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res);
59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_check_pending_reqs();
59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_queue_mx_request
59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Return state description for tracing
59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr,  UINT16 psm,  BOOLEAN is_orig,
59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         UINT32 mx_proto_id, UINT32 mx_chan_id,
59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data)
59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5975abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY));
59765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59775fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->psm            = psm;
59785fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->is_orig        = is_orig;
59795fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_callback     = p_callback;
59805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_ref_data     = p_ref_data;
59815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->mx_proto_id    = mx_proto_id;
59825fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->mx_chan_id     = mx_chan_id;
59835fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->transport      = BT_TRANSPORT_BR_EDR;
59845fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->sec_act        = 0;
59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59865fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59885fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    BTM_TRACE_EVENT("%s() PSM: 0x%04x  Is_Orig: %u  mx_proto_id: %u  mx_chan_id: %u",
59895fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                     __func__, psm, is_orig, mx_proto_id, mx_chan_id);
59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59915fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    fixed_queue_enqueue(btm_cb.sec_pending_q, p_e);
59925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59935fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    return TRUE;
59945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
59955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC  *p_dev_rec)
59975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
59985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK);
59995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK);
60005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN rv = FALSE;
60015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((major == BTM_COD_MAJOR_AUDIO)
60035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        &&  ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) )
60045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x",
6006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            __func__, major, minor);
60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.security_mode_changed == FALSE)
60095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.security_mode_changed = TRUE;
60115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION
60125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr))
60135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
60145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_write_auth_enable (TRUE);
60155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
60165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
60175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
60185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
60195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN);
60205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If we got a PIN, use that, else try to get one */
60225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.pin_code_len)
60235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_PINCodeReply (p_dev_rec->bd_addr, BTM_SUCCESS, btm_cb.pin_code_len, btm_cb.pin_code, p_dev_rec->trusted_mask);
60255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
60265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
60275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
60285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* pin was not supplied - pre-fetch pin code now */
60295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0))
60305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                BTM_TRACE_DEBUG("%s() PIN code callback called", __func__);
60327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL)
60335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD;
6034818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class,
6035818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                        p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE
6036818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                : (p_dev_rec->p_cur_service->security_flags
6037818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde                                   & BTM_SEC_IN_MIN_16_DIGIT_PIN));
60385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
60395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
60405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        rv = TRUE;
60425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
60435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
60445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return rv;
60455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
60465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_auth_payload_tout
6050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      Processes the HCI Autheniticated Payload Timeout Event
6052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  indicating that a packet containing a valid MIC on the
6053444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  connection handle was not received within the programmed
6054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  timeout value. (Spec Default is 30 secs, but can be
6055444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  changed via the BTM_SecSetAuthPayloadTimeout() function.
6056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len)
6059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT16 handle;
6061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    STREAM_TO_UINT16 (handle, p);
6063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    handle = HCID_GET_HANDLE (handle);
6064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    /* Will be exposed to upper layers in the future if/when determined necessary */
6066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle);
6067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_queue_encrypt_request
6072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      encqueue encryption request when device has active security
6074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  process pending.
6075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport,
6078f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_SEC_CALLBACK *p_callback, void *p_ref_data,
6079f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                                         tBTM_BLE_SEC_ACT sec_act)
6080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
60815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTM_SEC_QUEUE_ENTRY *p_e =
60825fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        (tBTM_SEC_QUEUE_ENTRY *)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1);
6083444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
60845fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->psm        = 0;  /* if PSM 0, encryption request */
60855fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_callback = p_callback;
60865fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->p_ref_data = p_ref_data;
60875fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->transport  = transport;
60885fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_e->sec_act    = sec_act;
60895fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN);
60905fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    fixed_queue_enqueue(btm_cb.sec_pending_q, p_e);
6091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
60925fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    return TRUE;
6093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6097899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_peer_sec_caps
6098899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6099899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set sm4 and rmt_sec_caps fields
6100899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  based on the available peer device features.
6101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          void
6103899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6105899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec)
6106899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6107899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BD_ADDR     rem_bd_addr;
6108899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT8       *p_rem_bd_addr;
6109899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6110899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if ((btm_cb.security_mode == BTM_SEC_MODE_SP ||
6111899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG ||
6112899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth         btm_cb.security_mode == BTM_SEC_MODE_SC) &&
6113899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6114899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6115899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_TRUE;
6116899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections =
6117899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth            (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1]));
6118899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6119899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    else
6120899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6121899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->sm4 = BTM_SM4_KNOWN;
6122899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_supports_secure_connections = FALSE;
6123899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6124899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6125899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__,
6126899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                  p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections);
6127899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6128899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (p_dev_rec->remote_features_needed)
6129899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6130899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!",
6131899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth                        __FUNCTION__);
6132899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6133899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr);
6134899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_rem_bd_addr = (UINT8*) rem_bd_addr;
6135899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        btm_io_capabilities_req(p_rem_bd_addr);
6136899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        p_dev_rec->remote_features_needed = FALSE;
6137899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6138899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6139899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6140899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6141899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6142899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_is_serv_level0
6143899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6144899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to check if the service corresponding
6145899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  to PSM is security mode 4 level 0 service.
6146899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6147899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          TRUE if the service is security mode 4 level 0 service
6148899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6149899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6150899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm)
6151899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6152899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    if (psm == BT_PSM_SDP)
6153899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    {
6154899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm);
6155899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth        return TRUE;
6156899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    }
6157899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return FALSE;
6158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_check_pending_enc_req
6163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      This function is called to send pending encryption callback if
6165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  waiting
6166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          void
6168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC  *p_dev_rec, tBT_TRANSPORT transport,
6171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                                            UINT8 encr_enable)
6172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6173577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov    if (fixed_queue_is_empty(btm_cb.sec_pending_q))
6174577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov        return;
6175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6176577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov    UINT8 res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING;
61771a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    list_t *list = fixed_queue_get_list(btm_cb.sec_pending_q);
61781a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov    for (const list_node_t *node = list_begin(list); node != list_end(list); ) {
61791a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)list_node(node);
61801a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov        node = list_next(node);
6181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0
6183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            && p_e->transport == transport
6185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            )
6187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        {
6188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR
6189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
6190f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                || p_e->sec_act == BTM_BLE_SEC_ENCRYPT
6191f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                || p_e->sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM
6192f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                || (p_e->sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags
6193444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                    & BTM_SEC_LE_AUTHENTICATED)
6194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
6195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji               )
6196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            {
6197f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                if (p_e->p_callback)
6198f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                    (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res);
6199f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach                fixed_queue_try_remove_from_queue(btm_cb.sec_pending_q, (void *)p_e);
6200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            }
6201444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        }
6202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    }
6203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth}
6204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/*******************************************************************************
6206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function         btm_sec_set_serv_level4_flags
6208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description      This function is called to set security mode 4 level 4 flags.
6210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns          service security requirements updated to include secure
6212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**                  connections only mode.
6213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth**
6214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/
6215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator)
6216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{
6217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    UINT16  sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS;
6218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth
6219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth    return cur_security | sec_level4_flags;
6220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
62225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_clear_ble_keys
62255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out the BLE keys.
62275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Typically when devices are removed in BTM_SecDeleteDevice,
62285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or when a new BT Link key is generated.
62295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
62315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
62335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC  *p_dev_rec)
62345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__);
62375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE)
6238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    p_dev_rec->ble.key_type = BTM_LE_KEY_NONE;
62395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS));
6240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE)
6242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    btm_ble_resolving_list_remove_dev(p_dev_rec);
6243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
62445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
62455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sec_is_a_bonded_dev
62505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description       Is the specified device is a bonded device
62525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - dev is bonded
62545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
62555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
62565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda)
62575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
62585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
62605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_bonded= FALSE;
62615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_dev_rec &&
62631287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE)
62647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))||
62651287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else
62661287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach        (
62677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
62687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)))
62695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
62705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_bonded = TRUE;
62715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded);
62735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(is_bonded);
62745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
62755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
62765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
62775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_sec_is_le_capable_dev
6279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description       Is the specified device is dual mode or LE only device
6281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE - dev is a dual mode
6283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
6285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda)
6286ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
6287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda);
6288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN le_capable = FALSE;
6289ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE)
6291e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun    if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE)
6292ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        le_capable  = TRUE;
6293ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
6294ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return le_capable;
6295ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
6296ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6297ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
6298ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
6299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_use_smp_br_chnl
6300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if SMP BR connection can be used with
6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  the peer.
6303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  Is called when authentication for dedicated bonding is
6304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  successfully completed.
6305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if SMP BR connection can be used (the link key is
6307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         generated from P-256 and the peer supports Security
6308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                         Manager over BR).
6309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec)
6312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT32  ext_feat;
6314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    UINT8   chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE];
6315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__,
6317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji                      p_dev_rec->link_key_type);
6318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) &&
6320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256))
6321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji         return FALSE;
6322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask))
6324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT))
6327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji        return FALSE;
6328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return TRUE;
6330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/*******************************************************************************
6333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function         btm_sec_is_master
6335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description      The function checks if the device is BR/EDR master after
6337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**                  pairing is completed.
6338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns          TRUE - if the device is master.
6340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji**
6341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/
6342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec)
6343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{
6344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR);
6345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji    return (p && (p->link_role == BTM_ROLE_MASTER));
6346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
6347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
6348