btm_sec.c revision db554581079863974af8e1289646f5deea6fc044
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 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 3179ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 3744802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE) 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */ 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gatt_int.h" 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY (5000) 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 546975b4d711142b885af479721cada448952c6b41Andre Eisenbach 556975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************** 566975b4d711142b885af479721cada448952c6b41Andre Eisenbach** L O C A L F U N C T I O N P R O T O T Y P E S * 576975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm); 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_check_pending_reqs(void); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec); 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle); 907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8 btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec); 987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec); 997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec); 1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec); 101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm); 102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator); 1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, 105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); 106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, 107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 encr_enable); 108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec); 110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec); 1117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OUT, IO, IN, NONE */ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT */ {FALSE, FALSE, TRUE, FALSE}, 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO */ {FALSE, TRUE, TRUE, FALSE}, 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN */ {TRUE, TRUE, TRUE, FALSE}, 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE, FALSE, FALSE, FALSE} 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_OUT 0 DisplayOnly */ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IO 1 DisplayYesNo */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IN 2 KeyboardOnly */ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_NONE 3 NoInputNoOutput */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authenticated 1297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authenticated 1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec) 1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) 1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_encrypted 1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is encrypted 1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec) 1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authorized 1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authorized 1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec) 1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_serv_trusted 1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check service is trusted 1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec) 1907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id)) 1927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecRegister 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Application manager calls this function to register for 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security services. There can be one and only one application 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** saving link keys. BTM allows only first registration. 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 209f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 temp_value = {0}; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 215f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s application registered", __func__); 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 218db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback); 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb_info->p_le_callback) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 221f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE 222f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__); 223f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton SMP_Register(btm_proc_smp_cback); 224f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif 225f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton /* if no IR is loaded, need to regenerate all the keys */ 226f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) 227f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton { 228f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton btm_ble_reset_id(); 229f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton } 230f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton } 231f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton else 232f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton { 233db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_WARN(LOG_TAG, "%s p_cb_info->p_le_callback == NULL", __func__); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api = *p_cb_info; 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 239db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback); 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 241f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s application registered", __func__); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24770b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** Function BTM_SecRegisterLinkKeyNotificationCallback 24870b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** 24970b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** Description Application manager calls this function to register for 25070b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** link key notification. When there is nobody registered 25170b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** we should avoid changing link key 25270b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** 25370b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** Returns TRUE if registered OK, else FALSE 25470b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** 25570b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji*******************************************************************************/ 25670b9598970e5b18ba53c282319e68faea6eb5681Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback) 25770b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji{ 25870b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji btm_cb.api.p_link_key_callback = p_callback; 25970b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji return TRUE; 26070b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji} 26170b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji 26270b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji/******************************************************************************* 26370b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddRmtNameNotifyCallback 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can register to be notified when name of the 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** remote device is resolved. 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == NULL) 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = p_callback; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteRmtNameNotifyCallback 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can deregister notification when a new Link Key 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is generated per connection. 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if OK, else FALSE 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == p_callback) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = NULL; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetSecurityFlags 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get security flags for the device 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE or FALSE is device found 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags) 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 3327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 3335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 3357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 3367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 3387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_GetSecurityFlagsByTransport 3407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description Get security flags for the device on a particular transport 3427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE is device found 3447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 3467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags, 3477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport) 3487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 3497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 3507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_BR_EDR) 3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8); 3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPinType 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set PIN type for the device. 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len) 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d", 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pin_type, (char *) pin_code, pin_code_len); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If device is not up security mode will be set as a part of startup */ 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.cfg.pin_type != pin_type) 38030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson && controller_get_interface()->get_is_ready() ) 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (pin_type); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_type = pin_type; 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_code_len = pin_code_len; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPairableMode 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enable or disable pairing 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters allow_pairing - (TRUE or FALSE) whether or not the device 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allows pairing. 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connect_only_paired - (TRUE or FALSE) whether or not to 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** only allow paired devices to connect. 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired) 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", allow_pairing, connect_only_paired); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_disabled = !allow_pairing; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.connect_only_paired = connect_only_paired; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_SetSecureConnectionsOnly 415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description Enable or disable default treatment for Mode 4 Level 0 services 417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter secure_connections_only_mode - (TRUE or FALSE) whether or not the device 419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** TRUE means that the device should treat Mode 4 Level 0 services as 420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** services of other levels. (Secure_connections_only_mode) 421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** FALSE means that the device should provide default treatment for 422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Mode 4 Level 0 services. 423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns void 425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode) 428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_API("%s: Mode : %u", __FUNCTION__, 430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth secure_connections_only_mode); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.devcb.secure_connections_only = secure_connections_only_mode; 433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES ((UINT16) 0xffff) 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetSecurityLevel 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: is_originator - TRUE if originating the connection, FALSE if not 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id, 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type; 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_ORIG; 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_TERM; 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (conn_type, p_name, service_id, 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (is_originator, p_name, service_id, 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_set_security_level 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: conn_type - TRUE if originating the connection, FALSE if not 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 index; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 first_unused_record = BTM_NO_AVAIL_SEC_SERVICES; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN record_allocated = FALSE; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_ucd; 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = TRUE; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = FALSE; 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if the record can be reused (same service name, psm, mx_proto_id, 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, and mx_chan_id), or obtain the next unused record */ 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[0]; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if there is already a record for this service */ 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->security_flags & BTM_SEC_IN_USE) 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id && 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!strncmp (p_name, (char *) p_srec->orig_service_name, 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN) || 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !strncmp (p_name, (char *) p_srec->term_service_name, 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN))) 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id) 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark the first available service record */ 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!record_allocated) 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC)); 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project first_unused_record = index; 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!record_allocated) 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)", BTM_SEC_MAX_SERVICE_RECORDS); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process the request if service record is valid */ 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If a duplicate service wasn't found, use the first available */ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (index >= BTM_SEC_MAX_SERVICE_RECORDS) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = first_unused_record; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[index]; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->psm = psm; 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->service_id = service_id; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id = mx_proto_id; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->orig_mx_chan_id = mx_chan_id; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_srec->orig_service_name, sizeof(p_srec->orig_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Originator should not set requirements for incoming connections */ 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM); 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_AUTHENTICATE) 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_MITM; 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_ENCRYPT) 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_AUTHENTICATE; 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connections usually set the security level right before 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection is initiated. 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set it to be the outgoing service */ 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd == FALSE ) 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_srec; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->term_mx_chan_id = mx_chan_id; 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_srec->term_service_name, sizeof(p_srec->term_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Acceptor should not set requirements for outgoing connections */ 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM); 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 651899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 652899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 653899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_AUTHENTICATE) 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_MITM; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_ENCRYPT) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_AUTHENTICATE; 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(BTM_SEC_IN_USE); 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d", 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x", 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_srec->ucd_security_flags); 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : service name [%s] (up to %d chars saved)", 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name, BTM_SEC_SERVICE_NAME_LEN); 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d", 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : sec: 0x%x, service name [%s] (up to %d chars saved)", 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecClrService 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record(s) from the security database. 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified name are removed. 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used only by devices with limited RAM so that it can 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** reuse an old security service record. 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Unpredictable results may occur if a service is cleared 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that is still in use by an application/profile. 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id) 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) && 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!service_id || (service_id == p_srec->service_id))) 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id); 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags = 0; 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clr_service_by_psm 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record from the security database. 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified psm are removed. 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used by L2CAP to free up the service record used 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by dynamic PSM clients when the channel is closed. 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The given psm must be a virtual psm. 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm) 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) ) 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id); 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed); 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_clr_temp_auth_service 783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Removes specified device record's temporary authorization 785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** flag from the security database. 786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters Device address to be cleared 788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void. 790ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda) 793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bda)) == NULL) 797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 7985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB"); 799ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */ 803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service) 804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 8055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]", 806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 807ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID; 809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PINCodeReply 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PIN code request to the UI. 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which PIN was requested 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d", 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res); 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state); 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8425344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr"); 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB"); 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) ) 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */ 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) || 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) ) 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (bd_addr); 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.security_mode_changed == FALSE) ) 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is start of the dedicated bonding if local device is 2.0 */ 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = 0xff ; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection"); 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we change state little bit early so btm_sec_connected() will originate connection */ 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* when existing ACL link is down completely */ 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already accepted incoming connection from pairing device */ 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer"); 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 9167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE); 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 9265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len); 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this was not pre-fetched, save the PIN */ 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len == 0) 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = pin_len; 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_sec_bond_by_transport 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description this is the bond function that will start either SSP or SMP. 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device to bond 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: After 2.1 parameters are not used and preserved here not to change API 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 9497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 9533aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 *p_features; 9543aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 ii; 9557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p= btm_bda_to_acl(bd_addr, transport); 9565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x", 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport); 9607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Other security process is in progress */ 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9696975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL) 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9716975b4d711142b885af479721cada448952c6b41Andre Eisenbach return(BTM_NO_RESOURCES); 9727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags); 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Finished if connection is active and already paired */ 9777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR 9787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 9807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE 9817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) 9827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 9837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SecBond -> Already Paired"); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell controller to get rid of the link key if it has one stored */ 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS) 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the PIN code if we got a valid one */ 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN); 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN); 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD; 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE; 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = TRUE; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10106975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 10117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1013e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_init_pseudo_addr (p_dev_rec, bd_addr); 10147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK; 10157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (SMP_Pair(bd_addr) == SMP_STARTED) 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 10207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags = 0; 10257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(BTM_NO_RESOURCES); 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED 10307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta | BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); 10317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags); 103430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->supports_simple_pairing()) 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The special case when we authenticate keyboard. Set pin type to fixed */ 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It would be probably better to do it from the application, but it is */ 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complicated */ 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = TRUE; 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED); 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10483aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) 10493aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 10503aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features = p_dev_rec->features[ii]; 10515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x", 10523aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach ii, p_features[0], p_features[1], p_features[2], p_features[3]); 10535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x", 10543aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features[4], p_features[5], p_features[6], p_features[7]); 10553aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle); 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN; 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection already exists... */ 10647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark lcb as bonding */ 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (bd_addr, TRUE); 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4); 107730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->supports_simple_pairing() 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->sm4 == BTM_SM4_KNOWN)) 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_sec_check_prefetch_pin (p_dev_rec) ) 1081899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_CMD_STARTED); 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1083899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 1084899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 1085899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) && 1086899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local is 2.1 and peer is unknown */ 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are not accepting connection request from peer 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * -> RNR (to learn if peer is 2.1) 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 10957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We are accepting connection request from peer */ 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d", 11037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state); 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* both local and peer are 2.1 */ 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_dd_create_conn(p_dev_rec); 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 11197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBondByTransport 11217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 11237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 11247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 11257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 11277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - doing SSP over BR/EDR or SMP over LE 11287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 11297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 11307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 11317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 11337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 11357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 11377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE 11387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_DEVICE_TYPE dev_type; 11397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type; 11407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 11427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* LE device, do SMP pairing */ 11437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) || 11447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) 11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 11467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_ILLEGAL_ACTION; 11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBond 11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (BTM_UseLeLink(bd_addr)) 11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BT_TRANSPORT_LE; 11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 11757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecBondCancel 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to cancel ongoing bonding process 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with peer device. 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 11847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - FALSE for BR/EDR link; TRUE for LE link 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SecBondCancel() State: %s flags:0x%x", 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags); 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_UNKNOWN_ADDR; 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 11997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Cancel LE pairing"); 12047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (SMP_PairCancel(bd_addr)) 12057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 12067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_CMD_STARTED; 12077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_WRONG_MODE; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state ); 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-fetching pin for dedicated bonding */ 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_SUCCESS; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this BDA is in a bonding procedure */ 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link is up */ 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If some other thread disconnecting, we do not send second command */ 1230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) || 1231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)) 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link was set up by Bonding process */ 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 12367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(bd_addr, FALSE); 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /*HCI link is not up */ 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link creation was started by Bonding process */ 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_create_conn_cancel(bd_addr)) 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 1253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_CancelRemoteDeviceName(); 1255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD; 1256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return BTM_CMD_STARTED; 1257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_WRONG_MODE; 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecGetDeviceLinkKey 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to obtain link key for the device 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it returns BTM_SUCCESS if link key is available, or 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_UNKNOWN_ADDR if Security Manager does not know about 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the device or device record does not contain link key info 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link_key - Link Key is copied into this array 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key) 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN); 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_UNKNOWN_ADDR); 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function BTM_SecGetDeviceLinkKeyType 1294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to obtain link key type for the 1296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** device. 1297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** it returns BTM_SUCCESS if link key is available, or 1298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** BTM_UNKNOWN_ADDR if Security Manager does not know about 1299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the device or device record does not contain link key info 1300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns BTM_LKEY_TYPE_IGNORE if link key is unknown, link type 1302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** otherwise. 1303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1305444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr) 1306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 1308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 1310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return p_dev_rec->link_key_type; 1312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_LKEY_TYPE_IGNORE; 1314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetEncryption 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to ensure that connection is 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** encrypted. Should be called only on an open connection. 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically only needed for connections that first want to 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bring up unencrypted links, then later encrypt them. 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed. Can be set to NULL 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if status is not desired. 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - pointer to any data the caller wishes to receive 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in the callback function upon completion. 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* can be set to NULL if not used. 1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** transport - TRUE to encryption the link over LE transport 1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** or FALSE for BR/EDR transport 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - already encrypted 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_PENDING - command will be returned in the callback 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_WRONG_MODE- connection not up. 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY - security procedures are currently active 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MODE_UNSUPPORTED - if security manager not linked in. 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback, 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS rc = 0; 13477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 13497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!p_dev_rec || 13507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 13517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 13527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) 13537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 13547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection should be up and runnning */ 13575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected"); 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 13607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE); 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_BR_EDR && 13667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) 13677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 13687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && 13697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)) 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted"); 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 13767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1381444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* enqueue security request if security is active */ 1382444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request"); 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data)) 1387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_CMD_STARTED; 1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1391444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1392444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_callback) 1393444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES); 1394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_NO_RESOURCES; 1395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = FALSE; 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x", 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required); 14067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 14087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tACL_CONN *p = btm_bda_to_acl(bd_addr, transport); 1411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p) 1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role); 1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rc = BTM_WRONG_MODE; 1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__); 1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_sec_execute_procedure (p_dev_rec); 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 14307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc); 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet. 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle) 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 old_state = p_dev_rec->sec_state; 1443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_STATUS status = BTM_CMD_STARTED; 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x", 14467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta conn_handle, reason); 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* send HCI_Disconnect on a transport only once */ 1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (old_state) 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING: 1452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (conn_handle == p_dev_rec->hci_handle) 1453444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 14577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 1459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING_BLE: 1460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (conn_handle == p_dev_rec->ble_hci_handle) 1461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 1462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING_BOTH: 1467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ? 1472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; 1473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */ 1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle) 1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect"); 1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; 1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status = BTM_SUCCESS; 1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Tear down the HCI link */ 1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (!btsnd_hcic_disconnect (conn_handle, reason)) 1486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* could not send disconnect. restore old state */ 1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = old_state; 1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status = BTM_NO_RESOURCES; 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ConfirmReqReply 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to confirm the numeric value for 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_CFM_REQ_EVT 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr) 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s Res: %u", 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) ) 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res == BTM_SUCCESS) 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, TRUE); 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */ 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, FALSE); 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PasskeyReqReply 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the passkey for 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_KEY_REQ_EVT 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey - numeric value in the range of 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey) 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s res:%d", 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) ) 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1568444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 1569444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL) 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 15747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SecBondCancel(bd_addr); 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (passkey > BTM_MAX_PASSKEY_VAL) 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply (bd_addr); 1597444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } else { 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_reply (bd_addr, passkey); 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SendKeypressNotif 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used during the passkey entry model 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by a device with KeyboardOnly IO capabilities 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (very likely to be a HID Device). 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is called by a HID Device to inform the remote device when 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a key has been entered or erased. 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type - notification type 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type) 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This API only make sense between PASSKEY_REQ and SP complete */ 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_send_keypress_notif (bd_addr, type); 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_IoCapRsp 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in response to BTM_SP_IO_REQ_EVT 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the tBTM_SP_CALLBACK implementation, this function is 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** called to provide the actual response 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** io_cap - The IO capability of local device. 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** oob - BTM_OOB_NONE or BTM_OOB_PRESENT. 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** auth_req- MITM protection required or not. 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d", 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = auth_req; 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = io_cap; 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT)); 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req); 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalOobData 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local OOB data from 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** LM 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void) 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_SUCCESS; 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_read_local_oob_data() == FALSE) 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_NO_RESOURCES; 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RemoteOobDataReply 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the remote OOB data for 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_RMT_OOB_EVT 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r) 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1696444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__, 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (bd_addr); 1710444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } else { 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_reply (bd_addr, c, r); 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BuildOobData 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to build the OOB data payload to 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be sent over OOB (non-Bluetooth) link 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** max_len - p_data size. 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name_len- 0, local device name would not be included. 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the local device name is included for 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** up to this specified length 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of bytes in p_data. 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r, UINT8 name_len) 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = 0; 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 name_size; 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mandatory part */ 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 174830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address); 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = BTM_OOB_MANDATORY_SIZE; 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now optional part */ 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Hash C */ 1756444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 delta = BTM_OOB_HASH_C_SIZE + 2; 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_HASH_C_SIZE + 1; 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE; 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE); 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Rand R */ 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_RAND_R_SIZE + 2; 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_RAND_R_SIZE + 1; 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE; 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE); 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add class of device */ 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_COD_SIZE + 2; 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_COD_SIZE + 1; 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_COD_TYPE; 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class); 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = name_len; 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (name_size > strlen(btm_cb.cfg.bd_name)) 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = (UINT16)strlen(btm_cb.cfg.bd_name); 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = name_size + 2; 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_size + 1; 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_type; 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size); 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update len */ 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_data; 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1813899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_BothEndsSupportSecureConnections 1814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1815899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if both the local device and the peer device 1816899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** specified by bd_addr support BR/EDR Secure Connections. 1817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1818899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters: bd_addr - address of the peer 1819899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1820899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if BR/EDR Secure Connections are supported by both local 1821899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** and the remote device. 1822899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** else FALSE. 1823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1825899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr) 1826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1827899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return ((controller_get_interface()->supports_secure_connections()) && 1828899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_PeerSupportsSecureConnections(bd_addr))); 1829899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 1830899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1831899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 1832899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1833899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_PeerSupportsSecureConnections 1834899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1835899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if the peer supports 1836899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** BR/EDR Secure Connections. 1837899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1838899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters: bd_addr - address of the peer 1839899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1840899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if BR/EDR Secure Connections are supported by the peer, 1841899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** else FALSE. 1842899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1843899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 1844899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr) 1845899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 1846899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth tBTM_SEC_DEV_REC *p_dev_rec; 1847899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1848899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL) 1849899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 1850899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__, 1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3], 1852899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (bd_addr[4]<< 8) + bd_addr[5]); 1853899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return FALSE; 1854899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 1855899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1856899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (p_dev_rec->remote_supports_secure_connections); 1857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadOobData 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to parse the OOB data payload 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received over OOB (non-Bluetooth) link 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** eir_tag - The associated EIR tag to read the data. 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *p_len(output) - the length of the data with the given tag. 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the beginning of the data with the given tag. 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NULL, if the tag is not found. 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 max_len; 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len, type; 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_ret = NULL; 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ret_len = 0; 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(max_len, p); 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= BTM_OOB_MANDATORY_SIZE) 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; /* the location for bd_addr */ 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = BTM_OOB_BD_ADDR_SIZE; 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= BTM_OOB_MANDATORY_SIZE; 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now the optional data in EIR format */ 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (max_len > 0) 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = *p++; /* tag data len + 1 */ 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = *p++; 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (eir_tag == type) 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = len - 1; 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the data size of this tag is len + 1 (tag data len + 2) */ 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len > len) 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len--; 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len--; 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len = 0; 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_len) 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = ret_len; 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_ret; 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetOutService 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the service for 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** outgoing connections. 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the profile/application calls BTM_SetSecurityLevel 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before initiating a connection, this function does not 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** need to be called. 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id) 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->service_id == service_id) 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d", 19585738f83aeb59361a0a2eda2460113f6dc919427The 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); 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************ 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** I N T E R N A L F U N C T I O N S 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/ 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1972ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_upgrade_possible 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1974ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function returns TRUE if the existing link key 1975ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** can be upgraded or if the link key does not exist. 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1977ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BOOLEAN 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1980ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM; 1983ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_possible = TRUE; 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1987ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = FALSE; 19887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->p_cur_service) 19897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x", 1991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, 1992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags); 19937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 19947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 19957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x", 1997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); 19987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Already have a link key to the connected peer. Is the link key secure enough? 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Is a link key upgrade even possible? 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2002899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & mtm_check) /* needs MITM */ 2003899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) || 2004899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) 2005899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* has unauthenticated 2006899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth link key */ 2007899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ 2008899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) 2009899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* authenticated 2010899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth link key is possible */ 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* upgrade is possible: check if the application wants the upgrade. 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the application is configured to use a global MITM flag, 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it probably would not want to upgrade the link key based on the security level database */ 2015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = TRUE; 2016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags); 2019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return is_possible; 2020ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2022ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_check_upgrade 2025ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2026ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to check if the existing link key 2027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** needs to be upgraded. 2028ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2029ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 2030ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 2032ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 2033ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s()", __func__); 2036ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Only check if link key already exists */ 2038ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 2039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 2040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE) 2042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 20435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags); 2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* upgrade is possible: check if the application wants the upgrade. 2045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * If the application is configured to use a global MITM flag, 2046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * it probably would not want to upgrade the link key based on the security level database */ 2047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SP_UPGRADE evt_data; 2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 2049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.upgrade = TRUE; 2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.api.p_sp_callback) 2051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 2052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 20535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade); 2054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (evt_data.upgrade) 2055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if the application confirms the upgrade, set the upgrade bit */ 2057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Clear the link key known to go through authentication/pairing again */ 2060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED); 2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED; 20625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags); 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_l2cap_access_req 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to grant permission to 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establish L2CAP connection to or from the peer device. 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are complete. MUST NOT BE NULL. 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tBTM_STATUS 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE) 20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE) 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2088899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_OUT_LEVEL4_FLAGS (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | \ 2089899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_OUT_MITM | BTM_SEC_MODE4_LEVEL4) 2090899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2091899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_IN_LEVEL4_FLAGS (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | \ 2092899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_IN_MITM | BTM_SEC_MODE4_LEVEL4) 2093899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle, 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type, 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 security_required; 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 old_security_required; 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN old_is_originator; 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc = BTM_SUCCESS; 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN chk_acp_auth_done = FALSE; 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 21077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */ 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data); 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data); 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_first_serv (conn_type, psm); 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm); 21347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2138899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Services level0 by default have no security */ 2139899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only)) 21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2147899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 2148899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2149899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags, 2150899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2151899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2152899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2153899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2154899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->ucd_security_flags; 2155899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 21625738f83aeb59361a0a2eda2460113f6dc919427The 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))) || 21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 21725738f83aeb59361a0a2eda2460113f6dc919427The 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))) || 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 21887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 2197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, 2199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->security_flags; 2204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm 0x%04x", 2208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, security_required, is_originator, psm); 2209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) 2211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 2213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */ 2214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 2215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d", 2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__, 2218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, 2219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections); 2220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, (void *)p_ref_data, 2222899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2223899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2224899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2225899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto KRZR) which connects to several services at the same time */ 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x", __func__, 2233ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4); 22345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags); 22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 2236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) 22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 22487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 22497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) || 22507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec))) ) 22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 22587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) || 22597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) || 22607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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)))) 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2269899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2270899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2271899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2272899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2273899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2274899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 22787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = TRUE; 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save pointer to service record */ 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2290899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */ 2291899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2292899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2293899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2295899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2297899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (is_originator) 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT); 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2302899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else /* acceptor */ 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */ 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project chk_acp_auth_done = TRUE; 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 2308899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2309899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2310899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) 2311899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the remote features are not known yet */ 2313899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__, 2314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags); 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2316899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_REQ_PEND; 2317899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_CMD_STARTED); 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__, 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done); 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_security_required = p_dev_rec->security_required; 23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_is_originator = p_dev_rec->is_originator; 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = security_required; 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = TRUE; 23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = FALSE; 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are multiple service records used through the same PSM */ 23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* leave security decision for the multiplexor on the top */ 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_sec_find_next_serv (p_serv_rec)) != NULL) 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */ 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_find_next_serv (p_serv_rec)) != NULL) 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done); 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm); 23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-Lisbon: restore the old settings */ 23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2360899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* if the originator is using dynamic PSM in legacy mode, do not start any security process now 2361899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth * The layer above L2CAP needs to carry out the security requirement after L2CAP connect 2362899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth * response is received */ 2363899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (is_originator && 2364899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2365899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2366899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2367899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001)) 23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm); 23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restore the old settings */ 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (chk_acp_auth_done) 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x", 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4, but we do not know for sure which level of security we need. 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * as long as we have a link key, it's OK */ 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_DELAY_CHECK; 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project because of data path issues. Delay this disconnect a little bit 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2394db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s peer should have initiated security process by now (SM4 to SM4)", __func__); 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC; 23977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, rc); 23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_SUCCESS; 24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 2406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id) 2407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Although authentication and encryption are per connection 2409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** authorization is per access request. For example when serial connection 2410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** is up and authorized and client requests to read file (access to other 2411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** scn), we need to request user's permission again. 2412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 2413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED; 2414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ 2422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) 2423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_AUTHENTICATED); 2428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); 2429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* If we already have a link key to the connected peer, is it secure enough? */ 2433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_check_upgrade(p_dev_rec, is_originator); 2434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d", 2438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 24447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc); 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_mx_access_request 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by all Multiplexing Protocols during 24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establishing connection to or from peer device to grant 24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** permission to establish application connection. 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of the multiplexer 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - multiplexer channel to reach application 24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - Pointer to any reference data needed by the 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the callback function. 24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED 24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator, 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 2480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 security_required; 24817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */ 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator); 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id); 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 24947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d", 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id); 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm))) 2502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, 2504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->security_flags; 2509899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2510899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto phone) which connects to several services at the same time */ 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed state: %s", __func__, 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state)); 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2518ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_CMD_STARTED; 2519899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2520899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2521899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2522899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2523899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2524899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2525899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) 2526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2527ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2528ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 2529ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_originator) 2530ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2531ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 25327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 25337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2534ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_SUCCESS; 2537ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2539ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2540ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2541ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 25427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 25437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2548ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_SUCCESS; 2550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2552899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2553899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2554899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2555899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2557899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2558899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2559899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (rc == BTM_SUCCESS) 2560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__); 2562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */ 2563899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* btm_sec_execute_procedure */ 2564899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) || 2565899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) 2566899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2567899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__); 2568899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2569899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2570899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2571899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2572899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Check whether there is a pending security procedure, if so we should always queue */ 2573899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the new security request */ 2574899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) 2575899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2576899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__); 2577899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (rc == BTM_CMD_STARTED) 2580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2581899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__); 2582899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_queue_mx_request (bd_addr, psm, is_originator, mx_proto_id, 2583899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth mx_chan_id, p_callback, p_ref_data); 2584899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2585899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else /* rc == BTM_SUCCESS */ 2586899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2587899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* access granted */ 2588899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2589899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2590899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc); 2591899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2592899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2593899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2594899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc, 2595899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_pair_state_descr(btm_cb.pairing_state)); 2596899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return rc; 2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) || 2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_cb.security_mode == BTM_SEC_MODE_SC))) 2601899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor receives service connection establishment Request for */ 2604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Secure Connections Only service */ 2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 2606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,", 2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "remote_support_for_sc %d: fail pairing",__FUNCTION__, 2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, p_dev_rec->remote_supports_secure_connections); 2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, (void *)p_ref_data, 2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 2620899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->security_required = security_required; 26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2623899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2624899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ 2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) 2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_AUTHENTICATED); 2639899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); 2640899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2642899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2643899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* If we already have a link key, check if that link key is good enough */ 2644899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_check_upgrade(p_dev_rec, is_originator); 2645899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Although authentication and encryption are per connection */ 26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization is per access request. For example when serial connection */ 26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is up and authorized and client requests to read file (access to other */ 26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* scn, we need to request user's permission again. */ 26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED); 26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2659444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d", 2660444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2661444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 26687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc); 26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rc; 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_conn_req 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when the peer device is requesting 26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc) 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some device may request a connection before we are done with the HCI_Reset sequence */ 269030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26925344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request when device not ready"); 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Security guys wants us not to allow connection from not paired devices */ 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection is allowed for only paired devices */ 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.connect_only_paired) 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device"); 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE 27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If non-discoverable, only allow known devices to connect */ 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) 27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from not paired device"); 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN))) 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device"); 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* incoming connection from bonding device is rejected */ 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT; 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 /* Host is not interested or approved connection. Save BDA and DC and */ 27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pass request to L2CAP */ 27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN); 27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_dc, dc, DEV_CLASS_LEN); 27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2c_link_hci_conn_req (bda)) 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* accept the connection -> allocate a device record */ 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_CONN_PEND; 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_bond_cancel_complete 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to report bond cancel complete 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void) 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) || 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 2770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || 2771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && 2772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for dedicated bonding in legacy mode, authentication happens at "link level" 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * btm_sec_connected is called with failed status. 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * In theory, the code that handles is_pairing_device/TRUE should clean out security related code. 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, this function may clean out the security related flags and btm_sec_connected would not know 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this function also needs to do proper clean up. 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL) 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application that the cancel succeeded */ 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS); 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_create_conn_cancel_complete 27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the command complete message 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is received from the HCI for the create connection cancel 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** command. 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p) 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (status, p); 28065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s status:%d", 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status); 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the create conn cancel cmd was issued by the bond cancel, 28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the application needs to be notified that bond cancel succeeded 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (status) 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_SUCCESS: 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_CONNECTION_EXISTS: 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_NO_CONNECTION: 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application of the error */ 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_check_pending_reqs 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called at the end of the security procedure 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to let L2CAP and RFCOMM know to re-submit any pending requests 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void) 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_QUEUE_ENTRY *p_e; 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BUFFER_Q bq; 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First, resubmit L2CAP requests */ 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.sec_req_pending) 28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = FALSE; 28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (NULL); 28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, re-submit anything in the mux queue */ 28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bq = btm_cb.sec_pending_q; 28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_init_q (&btm_cb.sec_pending_q); 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL) 28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check that the ACL is still up before starting security procedures */ 2859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) 28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_e->psm != 0) 2862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u", 2864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, p_e->psm, p_e->is_orig, 2865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->mx_proto_id, p_e->mx_chan_id); 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig, 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id, p_e->mx_chan_id, 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback, p_e->p_ref_data); 2870444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 2872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2873444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback, 2874444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->p_ref_data); 2875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_e); 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_init 28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is on the SEC startup 28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode) 28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = sec_mode; 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY; 28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_device_down 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called when device is disabled or 29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** turned off 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void) 29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2911444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state)); 29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_reset 29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called after device reset 29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void) 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 292630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (controller_get_interface()->supports_simple_pairing()) 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the default IO capabilities */ 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS; 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mx service to use no security */ 29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX, 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = BTM_SEC_MODE_SERVICE; 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode); 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_abort_access_req 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP or RFCOMM to abort 29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the pending operation. 29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr) 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dd_create_conn 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to create the ACL connection for 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the dedicated boding process 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 Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec) 29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure an L2cap link control block is available */ 29847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL) 29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]", 29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up the control block to indicated dedicated bonding */ 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) 29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]", 29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb(p_lcb); 30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_update_busy_level (BTM_BLI_PAGE_EVT); 30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]", 30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_name_request_complete 30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when remote name was obtained from 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer device 30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status) 30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEV_CLASS dev_class; 30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sec_state; 30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete"); 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) 30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr))) 30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If remote name request failed, p_bd_addr is null and we need to search */ 30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* based on state assuming that we are doing 1 at a time */ 30435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr) 30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_bd_addr); 30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[0]; 30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)) 30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_addr = p_dev_rec->bd_addr; 30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == BTM_SEC_MAX_DEVICE_RECORDS) 30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = NULL; 30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_bd_name) 30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_name = (UINT8 *)""; 30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x ", 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, p_dev_rec->sec_state, p_dev_rec); 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d", 30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status); 30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sec_state = p_dev_rec->sec_state; 30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN); 30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 30915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags); 30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */ 30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 0; 30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) 31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved */ 31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3105831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class, 31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[0] = 0; 31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[1] = 0; 31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[2] = 0; 31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if not found so clients can continue */ 31175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3119831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)""); 31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we were delaying asking UI for a PIN because name was not resolved, ask now */ 31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr 31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) ) 31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback); 31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) && 31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) && 31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_pin_callback) 31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback"); 31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name); 31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the same state again to force the timer to be restarted */ 31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we were delaying bonding because name was not resolved */ 31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) 31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status); 3152ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) 3153ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_sec_bond_cancel_complete(); 3155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 3156ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 31637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 31647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_bd_name, status); 31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */ 31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/ 31727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If it is set, there may be a race condition */ 31735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete IS_SM4_UNKNOWN Flags:0x%04x", 31747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags); 31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) 31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_KNOWN; 31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__, 31827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), 31837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); 31847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 31855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN. 31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed) 31875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 31885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec)) 31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection"); 31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both we and the peer are 2.1 - continue to create connection */ 31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection"); 32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 32045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 32055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32125344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA"); 32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR); 32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if we were delaying link_key_callback because name was not resolved */ 32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HCI connection complete has not arrived, wait for it */ 32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)"); 32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE); 32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) 32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If get name failed, notify the waiting layer */ 32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) 32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("waiting for remote features!!"); 32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remote Name succeeded, execute the next security procedure, if any */ 32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 32767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_host_support_feat_evt 32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the 32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received 32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p) 32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bd_addr; /* peer address */ 32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_FEATURES features; 32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (bd_addr, p); 32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", p_dev_rec->sm4, p[0]); 32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 33033aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE); 33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HCI_SSP_HOST_SUPPORTED(features)) 33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_TRUE; 33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]); 33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_req 33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LM request for the IO 33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capability of the local device and 33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if the OOB data is present for the device in the event 33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p) 33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_REQ evt_data; 33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = 0; 33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_orig = TRUE; 33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 callback_rc = BTM_SUCCESS; 33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* setup the default response according to compile options */ 33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* assume that the local IO capability does not change 33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * loc_io_caps is initialized with the default value */ 33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.io_cap = btm_cb.devcb.loc_io_caps; 33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data = BTM_OOB_NONE; 33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_AUTH_REQ; 33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3340899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state)); 33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 3343899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3344899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__, 3345899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode, p_dev_rec->num_read_pages); 3346899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3347899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0)) 3348899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3349899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Device security mode is SC only.", 3350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "To continue need to know remote features.", __FUNCTION__); 3351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_features_needed = TRUE; 3353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return; 3354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3355899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_TRUE; 33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3358899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s Flags: 0x%04x p_cur_service: 0x%08x", 3359899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), 3360899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.pairing_flags, p_dev_rec->p_cur_service); 33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3362899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->p_cur_service) 33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3364899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x", 3365899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, p_dev_rec->p_cur_service->psm, 3366899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->p_cur_service->security_flags); 3367899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3369899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth switch (btm_cb.pairing_state) 3370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3371899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* initiator connecting */ 3372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_IDLE: 3373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth //TODO: Handle Idle pairing state 3374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth //security_required = p_dev_rec->security_required; 3375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3376899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3377899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* received IO capability response already->acceptor */ 3378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_INCOMING_SSP: 33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig = FALSE; 33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) 3382899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3383899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor in dedicated bonding */ 33845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 3385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3386899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3388899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* initiator, at this point it is expected to be dedicated bonding 3389899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth initiated by local device */ 3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_WAIT_PIN_REQ: 3391899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN)) 33925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 33945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 33965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth err_code = HCI_ERR_HOST_BUSY_PAIRING; 33985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* any other state is unexpected */ 3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth default: 34035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_HOST_BUSY_PAIRING; 3404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__, 3405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.pairing_state); 3406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 34075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_disabled) 3410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* pairing is not allowed */ 3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__); 34135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 3418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* device in Secure Connections Only mode */ 3419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 3420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,", 3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__, 3423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, p_dev_rec->remote_supports_secure_connections); 3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err_code != 0) 34305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 34345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code); 34365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 34375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.is_orig = is_orig; 34405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 34425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local device initiated the pairing non-bonding -> use p_cur_service */ 34445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service && 34465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) 34475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* SC only mode device requires MITM protection */ 3451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = BTM_AUTH_SP_YES; 3452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 3454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3455899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags & 3456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO; 3457899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34685738f83aeb59361a0a2eda2460113f6dc919427The 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); 34695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 34715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 34725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); 34745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = BTM_SUCCESS; 34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) 34775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; 34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */ 34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_AUTH_SPGB_YES; 34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.api.p_sp_callback) 34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the callback function implementation may change the IO capability... */ 34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data)) 34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (callback_rc == BTM_SUCCESS) 34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT)); 34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3500899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* At this moment we know that both sides are SC capable, device in */ 3503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* SC only mode requires MITM for any service so let's set MITM bit */ 3504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req |= BTM_AUTH_YN_BIT; 3505899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x", 3506899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, evt_data.auth_req); 3507899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3508899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3509899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* if the user does not indicate "reply later" by setting the oob_data to unknown */ 3510899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* send the response right now. Save the current IO capability in the control block */ 35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = evt_data.auth_req; 35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = evt_data.io_cap; 35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3514899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s IO_CAP:%d oob_data:%d auth_req:%d", 3515899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap, 3516899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.oob_data, evt_data.auth_req); 35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap, 35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data, evt_data.auth_req); 35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_rsp 35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the IO capability of the 35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified device is received 35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p) 35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_RSP evt_data; 35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.io_cap, p); 35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.oob_data, p); 35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.auth_req, p); 35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no security is in progress, this indicates incoming security */ 35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP); 35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* work around for FW bug */ 35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_stop_on_ssp(); 35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We must have a device record here. 35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use the connecting device's CoD for the connection */ 35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 35675738f83aeb59361a0a2eda2460113f6dc919427The 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); 35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */ 35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */ 35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (evt_data.auth_req & BTM_AUTH_DD_BOND) ) /* and dedicated bonding bit is set */ 35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD; 35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the IO capability in the device record */ 35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = evt_data.io_cap; 35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_auth_req = evt_data.auth_req; 35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_proc_sp_req_evt 35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_USER_CONFIRMATION_REQUEST_EVT 35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_REQUEST_EVT 35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_NOTIFY_EVT 35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p) 36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ERR_PROCESSING; 36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_EVT_DATA evt_data; 36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda = evt_data.cfm_req.bd_addr; 36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All events start with bd_addr */ 36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s", 36105738f83aeb59361a0a2eda2460113f6dc919427The 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], 36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, btm_pair_state_descr(btm_cb.pairing_state)); 36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL) 36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)evt_data.cfm_req.bd_name, sizeof(evt_data.cfm_req.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN); 36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_CFM_REQ_EVT: 36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Numeric confirmation. Need user to conf the passkey */ 36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); 36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The device record must be allocated in the "IO cap exchange" step */ 36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p); 36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = TRUE; 36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process user confirm req in association with the auth_req param */ 36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO) 36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) 36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) 36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) ) 36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both devices are DisplayYesNo and one or both devices want to authenticate 36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project -> use authenticated link key */ 36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = FALSE; 36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d", 36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps, 36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req); 36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; 36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; 36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; 36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; 36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_NOTIF_EVT: 36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Passkey notification (other side is a keyboard) */ 36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.key_notif.passkey, p); 36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey); 36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_REQ_EVT: 36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HCI_USER_PASSKEY_REQUEST_EVT */ 36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY); 36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data); 36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_NOT_AUTHORIZED) 36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */ 36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) ) 36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* automatically reply with just works if no sp_cback */ 36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_SUCCESS; 36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_SP_CFM_REQ_EVT) 36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status); 36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfirmReqReply (status, p_bda); 36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_SP_KEY_REQ_EVT) 36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PasskeyReqReply(status, p_bda, 0); 36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Something bad. we can only fail this connection */ 37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SP_CFM_REQ_EVT == event) 37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_bda, FALSE); 37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTM_SP_KEY_NOTIF_EVT == event) 37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do nothing -> it very unlikely to happen. 37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project This event is most likely to be received by a HID host when it first connects to a HID device. 37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Usually the Host initiated the connection in this case. 37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project On Mobile platforms, if there's a security process happening, 37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the host probably can not initiate another connection. 37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTW (PC) is another story. */ 37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL != (p_dev_rec = btm_find_dev (p_bda)) ) 37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE); 37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_bda); 37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_keypress_notif_evt 37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a key press notification is 37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received 37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_keypress_notif_evt (UINT8 *p) 37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_KEYPRESS evt_data; 37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse & report BTM_SP_KEYPRESS_EVT */ 37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.notif_type = *p; 37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_simple_pair_complete 37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when simple pairing process is 37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** complete 37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p) 37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_COMPLT evt_data; 37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN disc = FALSE; 37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = *p++; 37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL) 37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x", 37785738f83aeb59361a0a2eda2460113f6dc919427The 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], 37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]); 37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u", 37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); 37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_PAIRING_NOT_ALLOWED) 37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The test spec wants the peer device to get this failure code. */ 37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT); 37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the timer to 1 second */ 38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); 38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0) 38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop the timer */ 38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.pairing_tle); 38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the initiating side: will receive auth complete event. disconnect ACL at that time */ 38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let the pairing state stay active, p_auth_complete_callback will report the failure */ 38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc) 38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed */ 3827db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta /* Avoid sending disconnect on HCI_ERR_PEER_USER */ 3828db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) 3829db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 3830db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 3831db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_rem_oob_req 38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_REMOTE_OOB_DATA_REQUEST_EVT 38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p) 38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_RMT_OOB evt_data; 38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 c; 38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r; 38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) && 38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_sp_callback) 38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN+1); 3867ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0; 38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); 38705738f83aeb59361a0a2eda2460113f6dc919427The 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) 38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoteOobDataReply(TRUE, p_bda, c, r); 38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 38755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* something bad. we can only fail this connection */ 38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_bda); 38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_local_oob_complete 38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when read local oob data is 38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p) 38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_LOC_OOB evt_data; 38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = *p++; 38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status); 38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.c, p); 39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.r, p); 39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */ 39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_collision 39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when authentication or encryption 39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** needs to be retried at a later time. 39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle) 39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.collision_start_time) 3927c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btm_cb.collision_start_time = GKI_get_os_tick_count(); 39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3929c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay) 39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle == BTM_SEC_INVALID_HANDLE) 39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL) 39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING); 39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev_by_handle (handle); 39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec != NULL) 39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state); 39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will restart authentication after timeout */ 39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 39445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = 0; 39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 3947bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray btm_cb.sec_collision_tle.param = UINT_TO_PTR(btm_sec_collision_timeout); 39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); 39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_complete 39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when authentication of the connection is 39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status) 39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sm4; 39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN are_bonding = FALSE; 39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s", 39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status, 39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state, 39795738f83aeb59361a0a2eda2460113f6dc919427The 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], 39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d", 39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status); 39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection was made just to do bonding. If we authenticate 40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the connection that is up, this is the last event received. 40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec 40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) 40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* keep the old sm4 flag and clear the retry bit in control block */ 40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sm4 = p_dev_rec->sm4; 40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_RETRY; 40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project are_bonding = TRUE; 40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4025065a3e209f5dae24bc7c21bf2659e9ccef23ebf1Srinu Jella if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 4026065a3e209f5dae24bc7c21bf2659e9ccef23ebf1Srinu Jella && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 4027065a3e209f5dae24bc7c21bf2659e9ccef23ebf1Srinu Jella btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) 40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (old_state != BTM_PAIR_STATE_IDLE) ) 40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be a race condition, when we are starting authentication and 40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the peer device is doing encryption. 40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If first we receive encryption change up, then initiated authentication 40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** can not be performed. According to the spec we can not do authentication 40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** on the encrypted link, so device is correct. 40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_COMMAND_DISALLOWED) 40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == 40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) 40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = HCI_SUCCESS; 40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Currently we do not notify user if it is a keyboard which connects */ 40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* User probably Disabled the keyboard while it was asleap. Let her try */ 40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report the suthentication status */ 40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state != BTM_PAIR_STATE_IDLE) 40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (are_bonding) 40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 4072db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 4073db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) 4074db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 4075db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL"); 4079e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec)) 4080e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* no LE keys are available, do deriving */ 4081e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || 4082e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* or BR key is higher security than existing LE keys */ 4083e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && 4084e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) 4085444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL"); 40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_is_master(p_dev_rec)) 4089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4090e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // Encryption is required to start SM over BR/EDR 4091e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // indicate that this is encryption after authentication 4092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL); 4093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 4096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4097e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If authentication failed, notify the waiting layer */ 41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((old_sm4 & BTM_SM4_RETRY) == 0) 41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow retry only once */ 41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION) 41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 41115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this retry for missing key is for Lisbon or later only. 41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Legacy device do not need this. the controller will drive the retry automatically */ 41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4)) 41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 41205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* With BRCM controller, we do not need to delete the stored link key in controller. 41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If the stack may sit on top of other controller, we may need this 41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DeleteStoredLinkKey (bd_addr, NULL); */ 41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_RETRY) 41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_execute_procedure (p_dev_rec); 41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Authentication succeeded, execute the next security procedure, if any */ 41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_execute_procedure (p_dev_rec); 41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 41507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_encrypt_change 41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when encryption of the connection is 41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) 41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 4166ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 41677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p_acl = NULL; 41687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 acl_idx = btm_handle_to_acl_index(handle); 4169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 41705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d", 41715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); 41725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 ); 41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 4176e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || 4177e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && encr_enable) 41887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 41897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->hci_handle == handle) 41907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED); 41917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 41927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); 41937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 41945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It is possible that we decrypted the link to perform role switch */ 41965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mark link not to be encrypted, so that when we execute security next time it will kick in again */ 41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && !encr_enable) 41987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 41997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->hci_handle == handle) 42007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED; 42017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 42027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED; 42037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags ); 4206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 4208e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (acl_idx != MAX_L2CAP_LINKS) 42097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl = &btm_cb.acl_db[acl_idx]; 4210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_check_pending_enc_req (p_dev_rec, p_acl->transport, encr_enable); 4212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 42137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_acl && p_acl->transport == BT_TRANSPORT_LE) 42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4215e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE || 4216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) 4217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4218d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN); 4219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 4220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 42210b469db5e4991a1de0250fbeaca16ebd82f9470bSatya Calloji btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable); 42225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4225e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BR/EDR connection, update the encryption key size to be 16 as always */ 42275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 16; 4228e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4230e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d", 4231e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, p_dev_rec->new_encryption_key_is_p256); 4232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle)) 4234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->new_encryption_key_is_p256) 4236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_use_smp_br_chnl(p_dev_rec) && 4238e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_sec_is_master(p_dev_rec) && 4239e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* if LE key is not known, do deriving */ 4240e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || 4241e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* or BR key is higher security than existing LE keys */ 4242e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) 4243e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) 4244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* BR/EDR is encrypted with LK that can be used to derive LE LTK */ 4246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->new_encryption_key_is_p256 = FALSE; 4247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4248e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec->no_smp_on_br) 4249e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4250e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__); 4251e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4252e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 4253e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4254e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__); 4255e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_BR_PairWith(p_dev_rec->bd_addr); 4256e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4260e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4261e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // BR/EDR is successfully encrypted. Correct LK type if needed 4262e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // (BR/EDR LK derived from LE LTK was used for encryption) 4263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((encr_enable == 1) && /* encryption is ON for SSP */ 4264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* LK type is for BR/EDR SC */ 4265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || 4266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) 4269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; 4270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ 4271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; 4272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type); 4274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_send_link_key_notif(p_dev_rec); 4275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else 4279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable); 4280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */ 42815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this encryption was started by peer do not need to do anything */ 42835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) 42845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) 42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 42885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 42895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); 42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 42955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If encryption setup failed, notify the waiting layer */ 42965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 42975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 42995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Encryption setup succeeded, execute the next security procedure, if any */ 43035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 43045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 43055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 43067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 43075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 43085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 43105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connect_after_reject_timeout 43125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connection for bonding could not start because of the collision 43145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Initiate outgoing connection 43155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 43175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle) 43205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec; 43225cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()"); 43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = 0; 43265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = 0; 43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection"); 43315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 43365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 43395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connected 43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establsihed 43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) 43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res; 43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_pairing_device = FALSE; 43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p_acl_cb; 43567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 bit_shift = 0; 43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 43615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s", 43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5], 43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x ", 43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]); 43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record for new connection. Allocate one */ 43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* can not find the device record and the status is error, 43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * just ignore it */ 43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Update the timestamp for this device */ 43935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 43957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 43967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0; 43977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell L2CAP it's a bonding connection. */ 44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming connection failed while pairing, then try to connect and continue */ 44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Motorola S9 disconnects without asking pin code */ 44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) 44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN"); 44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 4418bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray btm_cb.sec_collision_tle.param = UINT_TO_PTR(btm_sec_connect_after_reject_timeout); 44195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); 44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 44247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR); 44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE); 44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always clear the pending flag */ 44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 44427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; 44437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 44447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) ) 44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection from bonding device */ 44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_HOST_REJECT_DEVICE) 44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) 44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x", 44595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags, p_dev_rec->sm4); 44605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; 44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 44667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR); 44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already have pin code */ 44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 4476bb95452741bfd65723ea417c25dbd326c7568ab7Arman Uguray btm_cb.sec_collision_tle.param = UINT_TO_PTR(btm_sec_connect_after_reject_timeout); 44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); 44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait for incoming connection without resetting pairing state */ 44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (status == HCI_ERR_CONNECTION_EXISTS) 44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection"); 44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_pairing_device = TRUE; 44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if connection fails during pin request, notify application */ 44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection failed because of during pairing, need to tell user */ 44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_pairing_device) 45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift); 45035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required ); 45045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* 45167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta Do not send authentication failure, if following conditions hold good 45177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1. BTM Sec Pairing state is idle 45187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2. Link key for the remote device is present. 45197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3. Remote is SSP capable. 45207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta */ 45217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) && 45227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((status == HCI_ERR_AUTH_FAILURE) || 45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_KEY_MISSING) || 45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_HOST_REJECT_SECURITY) || 45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_NOT_ALLOWED) || 45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_UNIT_KEY_USED) || 45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || 45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || 45297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (status == HCI_ERR_REPEATED_ATTEMPTS)))) 45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift); 45337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 45347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 45357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE 45367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If we rejected pairing, pass this special result code */ 45377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) 45387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 45397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta status = HCI_ERR_HOST_REJECT_SECURITY; 45407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 45417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT || 45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) 45547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE); 45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 45567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If initiated dedicated bonding, return the link key now, and initiate disconnect */ 45625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If dedicated bonding, and we now have a link key, we are all done */ 45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_pairing_device 45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) ) 45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remember flag before it is initialized */ 45755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 45765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = TRUE; 45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 45785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = FALSE; 45795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 45845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( res ) 45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let l2cap start bond timer */ 45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE); 45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 45975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role may not be correct here, it will be updated by l2cap, but we need to */ 45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* notify btm_acl that link is up, so starting of rmt name request will not */ 46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set paging flag up */ 46017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR); 46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_acl_cb) 46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */ 46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) 46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now there are a some devices that do not like sending */ 46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* commands events and data at the same time. */ 46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the packet types to the default allowed by the device */ 46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); 46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_def_link_policy) 46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); 46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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); 46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize security flags. We need to do that because some */ 46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization complete could have come after the connection is dropped */ 46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* and that would set wrong flag that link has been authorized already */ 46207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | 46217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift); 46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) 46247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift); 46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_LINK) 46277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift); 46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_changed = FALSE; 46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* After connection is established we perform security if we do not know */ 46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the name, or if we are originator because some procedure can have */ 46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* been scheduled while connection was down */ 46345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator); 46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator) 46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 46387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnect 46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to disconnect HCI link 46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns btm status 46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason) 46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In some weird race condition we may not have a record */ 46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_disconnect (handle, reason); 46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are currently doing bonding. Link will be disconnected when done */ 46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_BUSY); 46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); 46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnected 46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dropped 46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 46865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason) 46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_pairing_flags = btm_cb.pairing_flags; 46905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result = HCI_ERR_AUTH_FAILURE; 4691ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach tBTM_SEC_CALLBACK *p_callback = NULL; 46927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If page was delayed for disc complete, can do it now */ 46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.discing = FALSE; 46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 47015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE; 47037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 4707db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s clearing pending flag handle:%d reason:%d", __func__, handle, reason); 47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear unused flags */ 47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= BTM_SM4_TRUE; 47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4714f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr; 4715f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x" 4716f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton " remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), 4717f8027005333c88a2f097cfd70d15c3d54c7764aeChris 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); 47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4719f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags); 47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)) 47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the disconnection reason is REPEATED_ATTEMPTS, 47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project send this error message to complete callback function 47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project to display the error message of Repeated attempts. 47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project All others, send HCI_ERR_AUTH_FAILURE. */ 47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == HCI_ERR_REPEATED_ATTEMPTS) 47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_REPEATED_ATTEMPTS; 47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_HOST_REJECT_SECURITY; 47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, result); 47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 0; 474824adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS); 47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* see sec_flags processing in btm_acl_removed */ 47507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 47517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 47527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 47537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE; 47547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED); 47557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 47567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 47575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 47587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 47597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE; 47607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED); 47617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 47625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 4764444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) 4765444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4766444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ? 4767444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; 4768444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 4769444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4770444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 47717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 4773ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4774ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_callback = p_dev_rec->p_callback; 4775ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4776ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach /* if security is pending, send callback to clean up the security state */ 4777ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach if(p_callback) 4778ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach { 4779ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before 4780ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach we do, this call back must be reset here */ 47817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING); 4782ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach } 4783ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4784f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags); 47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 47865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_notification 47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a new connection link key is 47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generated 47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type) 47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 4800444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN we_are_bonding = FALSE; 4801444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ltk_derived_lk = FALSE; 48025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d", 48045738f83aeb59361a0a2eda2460113f6dc919427The 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], 48055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type); 48065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) && 4808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ltk_derived_lk = TRUE; 4811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key_type -= BTM_LTK_DERIVED_LKEY_OFFSET; 4812444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) 48175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 4820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 4821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* BR/EDR connection, update the encryption key size to be 16 as always */ 4822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->enc_key_size = 16; 4823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 48245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN); 48255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 48275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 48285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 48305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we_are_bonding = TRUE; 48315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 48325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 48335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* save LTK derived LK no matter what */ 4836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (ltk_derived_lk) 4837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.api.p_link_key_callback) 4839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)", 4841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, p_dev_rec->link_key_type); 4842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, 4843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_bd_name, 4844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_link_key, p_dev_rec->link_key_type); 4845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) || 4850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4852e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->new_encryption_key_is_p256 = TRUE; 4853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d", 4854e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, p_dev_rec->new_encryption_key_is_p256); 4855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 48585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If name is not known at this point delay calling callback until the name is */ 48595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* resolved. Unless it is a HID Device and we really need to send all link keys. */ 48605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 4861e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) 4862e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && !ltk_derived_lk) 48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d", 4865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], 4866444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_bda[4] << 8) + p_bda[5], key_type); 48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = TRUE; 48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it is for bonding nothing else will follow, so we need to start name resolution */ 48715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (we_are_bonding) 48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0))) 48745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_rmt_name_failed(); 48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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]) 48785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 48795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 48825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 4884e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE) 4885e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* for derived key, always send authentication callback for BR channel */ 4886e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun || ltk_derived_lk) 48875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will save link key only if the user authorized it - BTE report link key in all cases */ 48945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE 48955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) 48965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 48975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 48995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4900e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (ltk_derived_lk) 4901e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4902e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("btm_sec_link_key_notification() LTK derived LK is saved already" 4903e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun " (key_type = %d)", p_dev_rec->link_key_type); 4904e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4905e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 4906e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4907e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, 4908e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->sec_bd_name, 4909e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_link_key, p_dev_rec->link_key_type); 4910e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 49115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 49165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 49185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 49205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 49245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda) 49255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 49265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 49295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 49305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4931b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && 4932b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (btm_cb.collision_start_time != 0) && 4933b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) ) 4934b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta { 4935b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req " 4936b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta "State: %d START_TIMEOUT : %d", 4937b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btm_cb.pairing_state, btm_cb.collision_start_time); 4938b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btsnd_hcic_link_key_neg_reply (p_bda); 4939b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta return; 4940b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta } 49415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 49425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key); 49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 49455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (p_bda); 49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The link key is not in the database and it is not known to the manager */ 49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_neg_reply (p_bda); 49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pairing_timeout 49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when host does not provide PIN 49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** within requested time 49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle) 49655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 49665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 49675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE) 49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_YES; 49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name[2]; 49765cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_tle.param = 0; 49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */ 49805738f83aeb59361a0a2eda2460113f6dc919427The 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. 49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_cb->pairing_bda); 49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pairing_timeout() State: %s Flags: %u", 49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags); 49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->pairing_state) 49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: 49905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 49915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: 49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) 49955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda); 49965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 49975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that no longer need the PIN */ 49985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 49995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: 50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE); 50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: 50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); 50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */ 50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: 50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req |= BTM_AUTH_DD_BOND; 50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, 50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_OOB_NONE, auth_req); 50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: 50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda); 50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */ 50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: 50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed. Started a 1-sec timer at simple pairing complete. 50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * now it's time to tear down the ACL link*/ 50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x", 50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3], 50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]); 50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: 50578fb547c7313644044c3d4ce38d68a2ad80f2d6c8Srinu Jella case BTM_PAIR_STATE_GET_REM_NAME: 50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that timeout has happened while waiting for authentication*/ 50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 50775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pin_code_request 50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests PIN code 50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda) 50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 509757bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT 509857bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath UINT8 default_pin_code_len = 4; 509957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30}; 510057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif 51015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x", 51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), 51035738f83aeb59361a0a2eda2460113f6dc919427The 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] ); 51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) && 51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) ) 51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fake this out - porshe carkit issue - */ 51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; 51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(! btm_cb.pin_code_len_saved) 51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); 51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) 51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s", 51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state)); 51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reply pin code again due to counter in_rand when local initiates pairing */ 51315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing"); 51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(! btm_cb.pin_code_len_saved) 51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 513457bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 513557bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code); 51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); 51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (p_bda); 51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* received PIN code request. must be non-sm4 */ 51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN); 51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD; 51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) 51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying"); 51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); 51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the connecting device's CoD for the connection */ 51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN)) 51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) ) 51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN); 51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We could have started connection after asking user for the PIN code */ 51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len != 0) 51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply"); 51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code); 51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = btm_cb.pin_code_len; 51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark that we forwarded received from the user PIN code */ 51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We can change mode back right away, that other connection being established */ 51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is not forced to be secure - found a FW issue, so we can not do this 51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); */ 51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If pairing disabled OR (no PIN callback and not bonding) */ 51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR we could not allocate entry in the database reject pairing request */ 51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cb->pairing_disabled 51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_cb->api.p_pin_callback == NULL) 51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR Microsoft keyboard can for some reason try to establish connection */ 52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the only thing we can do here is to shut it up. Normally we will be originator */ 52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for keyboard bonding */ 52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator 52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) ) 52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!", 52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); 52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify upper layer of PIN request and start expiration timer */ 52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = 0; 52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pin code request can not come at the same time as connection request */ 52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN); 52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); 52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the name is known */ 52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Even if name is not known we might not be able to get one */ 52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is the case when we are already getting something from the */ 52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* device, so HCI level is flow controlled */ 52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Also cannot send remote name request while paging, i.e. connection is not completed */ 52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback"); 52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->api.p_pin_callback) 52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name"); 52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We received PIN code request for the device with unknown name */ 52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* it is not user friendly just to ask for the PIN without name */ 52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try to get name at first */ 52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr, 52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_PAGE_SCAN_REP_MODE_R1, 52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_MANDATARY_PAGE_SCAN_MODE, 0)) 52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 'f'; 52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[1] = '0'; 52485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback"); 52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->api.p_pin_callback) 52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_update_clock_offset 52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to update clock offset 52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset) 52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL) 52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL) 52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************** 52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C F U N C T I O N S 52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/ 52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_execute_procedure 52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start required security 52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedure. There is a case when multiplexing protocol 52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calls this function on the originating side, connection to 52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer will not be established. This function in this 52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** case performs only authorization. 52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - permission is granted 53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED - in process 53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES - permission declined 53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) 53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 53075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d", 53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); 53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is a chance that we are getting name. Wait until done. */ 53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != 0) 53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any security is required, get the name first */ 53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start get name"); 53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_get_name (p_dev_rec)) 53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authenticated and authentication is required */ 53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authentication and return PENDING to the caller */ 53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE))) 53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 53375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authentication"); 53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not encrypted and encryption is required */ 53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start encryption and return PENDING to the caller */ 53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) 53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) 53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 53545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 53585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 53595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start encryption"); 53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_encryption (p_dev_rec)) 53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 5371899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 5372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 5373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -", 5374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "security failure", __FUNCTION__, p_dev_rec->link_key_type); 5375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_FAILED_ON_SECURITY); 5376899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 5377899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authorized and authorization is required */ 53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authorization and return PENDING to the caller */ 53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) 53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) 53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("service id:%d, is trusted:%d", 53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id, 53865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 53875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id))); 53885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) && 53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && 53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id) == FALSE)) 53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authorization"); 53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_start_authorization (p_dev_rec)); 53955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All required security procedures already established */ 53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE | 54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE | 54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT | 54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | 54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]); 54065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: access granted"); 54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_get_name 54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start get name procedure 54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec) 54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tempstate = p_dev_rec->sec_state; 54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME; 54265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Device should be connected, no need to provide correct page params */ 54285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 0 and NULL are as timeout and callback params because they are not used in security get name case */ 54295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC, 54305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != BTM_CMD_STARTED) 54315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = tempstate; 54335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authentication 54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authentication 54445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec) 54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 54515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btsnd_hcic_auth_request (p_dev_rec->hci_handle)); 54535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_encryption 54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start encryption 54605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec) 54655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE)) 54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authorization 54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authorization 54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec) 54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result; 54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_service_name = NULL; 54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 service_id; 54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 54905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) 54915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.api.p_authorize_callback) 54935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 54945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_cur_service) 54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->is_originator) 54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->orig_service_name; 55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 55015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->term_service_name; 55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = p_dev_rec->p_cur_service->service_id; 55045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = 0; 55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send authorization request if not already sent during this service connection */ 5509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 5510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != service_id) 5511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 5512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING; 5513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr, 55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 55155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, 55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name, 55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, 55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator); 5519ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else /* Already authorized once for this L2CAP bringup */ 5522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 55235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id); 5524ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BTM_SUCCESS); 5525ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BTM_SUCCESS) 55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; 5530ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5531ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Save the currently authorized service in case we are asked again by another multiplexer layer */ 5532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_dev_rec->is_originator) 5533ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = service_id; 5534ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 55365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(result); 55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_start_get_name (p_dev_rec); 55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_are_all_trusted 55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called check if all services are trusted 55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if all are trusted, otherwise FALSE 55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]) 55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT32 trusted_inx; 55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++) 55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) 55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_first_serv 55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the first record in the service database 55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm) 55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_ORIG_MASK ) 55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) 55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the PSM matches p_out_serv, 55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, just find the first record with the specified PSM */ 55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) ) 56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_next_serv 56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the next record in the service database 56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur) 56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == p_cur->psm) ) 56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cur != p_serv_rec) 56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_mx_serv 56405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the service database with specified 56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PSM and multiplexor channel information 56435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 56485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id) 56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv; 56515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5654444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s()", __func__); 56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && p_out_serv && p_out_serv->psm == psm 56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->mx_proto_id == mx_proto_id 56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->orig_mx_chan_id == mx_chan_id) 56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the parameters match p_out_serv, 56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 56615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 56625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, the old way */ 56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == psm) 56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->mx_proto_id == mx_proto_id) 56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) 56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_collision_timeout 56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Encryption could not start because of the collision 56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** try to do it again 56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle) 56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56925cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5694444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s()", __func__); 56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = 0; 56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5697444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec); 56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 57037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE); 57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec) 57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, p_dev_rec->link_key, 57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type); 57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadTrustedMask 57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get trusted mask for the peer device 57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL, if the device record is not found. 57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the trusted mask 57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr) 57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5738444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 5739444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL) 57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec->trusted_mask); 5741444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return NULL; 57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_restore_mode 57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the security mode to previous setting 57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if it was changed during bonding. 57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void) 57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed) 57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = FALSE; 5760444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK)); 57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK)); 57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_type_changed) 57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = FALSE; 57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type); 57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_dev_by_sec_state 57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the device 57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** which is being authenticated or encrypted 57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state) 57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5786444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state == state)) 57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_change_pairing_state 57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to change pairing state 58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) 58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state)); 5807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() New: %s pairing_flags:0x%x", __func__, 5808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_pair_state_descr(new_state), btm_cb.pairing_flags); 58095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_state = new_state; 58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_state == BTM_PAIR_STATE_IDLE) 58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.pairing_tle); 58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = 0; 58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the the lcb shows we are not bonding */ 58205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE); 58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 58235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_clear_ssp(); 58255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN); 58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If transitionng out of idle, mark the lcb as bonding */ 58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state == BTM_PAIR_STATE_IDLE) 58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE); 58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout; 58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BTM_SEC_TIMEOUT_VALUE); 58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_pair_state_descr 58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state) 58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_IDLE: return("IDLE"); 58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_GET_REM_NAME: return("GET_REM_NAME"); 58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: return("WAIT_PIN_REQ"); 58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: return("WAIT_LOCAL_PIN"); 58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: return("WAIT_NUM_CONFIRM"); 58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: return("KEY_ENTRY"); 58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: return("WAIT_LOCAL_OOB_RSP"); 58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: return("WAIT_LOCAL_IOCAPS"); 58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_INCOMING_SSP: return("INCOMING_SSP"); 58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: return("WAIT_AUTH_COMPLETE"); 58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: return("WAIT_DISCONNECT"); 58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return("???"); 58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5869104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer sprintf(btm_cb.state_temp_buffer,"%hhu",state); 58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_cb.state_temp_buffer); 58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_rec_cback_event 58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function calls the callback function with the given 58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** result and clear the callback function. 58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 588632429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport) 58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback = p_dev_rec->p_callback; 58895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_callback) 58915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 5893e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 589491fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach#if BLE_INCLUDED == TRUE 5895e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (is_le_transport) 5896e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res); 5897e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 589891fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach#endif 5899e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res); 59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_queue_mx_request 59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY)); 59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_e) 59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->psm = psm; 59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->is_orig = is_orig; 59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback = p_callback; 59235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_ref_data = p_ref_data; 59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id = mx_proto_id; 59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_chan_id = mx_chan_id; 5926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->transport = BT_TRANSPORT_BR_EDR; 59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN); 59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u", 5931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, psm, is_orig, mx_proto_id, mx_chan_id); 59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&btm_cb.sec_pending_q, p_e); 59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec) 59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK); 59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK); 59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN rv = FALSE; 59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((major == BTM_COD_MAJOR_AUDIO) 59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) ) 59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", 5951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, major, minor); 59525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed == FALSE) 59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we got a PIN, use that, else try to get one */ 59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len) 59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59695738f83aeb59361a0a2eda2460113f6dc919427The 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); 59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pin was not supplied - pre-fetch pin code now */ 59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) 59755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s() PIN code callback called", __func__); 59777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) 59785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 59795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_dev_rec->sec_bd_name); 59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rv = TRUE; 59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rv; 59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 5990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 5991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_auth_payload_tout 5992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 5993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description Processes the HCI Autheniticated Payload Timeout Event 5994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** indicating that a packet containing a valid MIC on the 5995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** connection handle was not received within the programmed 5996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** timeout value. (Spec Default is 30 secs, but can be 5997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** changed via the BTM_SecSetAuthPayloadTimeout() function. 5998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 5999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len) 6001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 handle; 6003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16 (handle, p); 6005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji handle = HCID_GET_HANDLE (handle); 6006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Will be exposed to upper layers in the future if/when determined necessary */ 6008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle); 6009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_queue_encrypt_request 6014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description encqueue encryption request when device has active security 6016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** process pending. 6017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, 6020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 6021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e; 6023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1); 6024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_e) 6026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->psm = 0; /* if PSM 0, encryption request */ 6028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->p_callback = p_callback; 6029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->p_ref_data = (void *)(p_e + 1); 6030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *(UINT8 *)p_e->p_ref_data = *(UINT8 *)(p_ref_data); 6031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->transport = transport; 6032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN); 6033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji GKI_enqueue(&btm_cb.sec_pending_q, p_e); 6034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 6035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6037444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6038444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6042899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_set_peer_sec_caps 6043899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6044899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to set sm4 and rmt_sec_caps fields 6045899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** based on the available peer device features. 6046899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6047899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns void 6048899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6049899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6050899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec) 6051899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6052899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BD_ADDR rem_bd_addr; 6053899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth UINT8 *p_rem_bd_addr; 6054899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6055899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 6056899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 6057899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) && 6058899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])) 6059899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6060899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 = BTM_SM4_TRUE; 6061899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections = 6062899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])); 6063899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6064899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 6065899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6066899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 = BTM_SM4_KNOWN; 6067899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections = FALSE; 6068899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6069899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6070899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__, 6071899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections); 6072899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6073899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6074899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->remote_features_needed) 6075899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6076899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!", 6077899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__); 6078899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_rem_bd_addr = (UINT8*) rem_bd_addr; 6079899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr); 6080899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_rem_bd_addr = (UINT8*) rem_bd_addr; 6081899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_io_capabilities_req(p_rem_bd_addr); 6082899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_features_needed = FALSE; 6083899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6084899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6085899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6086899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6087899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6088899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_is_serv_level0 6089899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6090899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if the service corresponding 6091899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** to PSM is security mode 4 level 0 service. 6092899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6093899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if the service is security mode 4 level 0 service 6094899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6095899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6096899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm) 6097899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6098899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (psm == BT_PSM_SDP) 6099899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6100899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm); 6101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return TRUE; 6102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6103899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return FALSE; 6104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_check_pending_enc_req 6109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to send pending encryption callback if 6111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** waiting 6112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 6114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, 6117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 encr_enable) 6118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e; 6120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BUFFER_Q *bq = &btm_cb.sec_pending_q; 6121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING; 6122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq); 6124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji while (p_e != NULL) 6126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0 6128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji && p_e->transport == transport 6130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 613391fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach#if BLE_INCLUDED == TRUE 613491fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach UINT8 sec_act = *(UINT8 *)(p_e->p_ref_data); 613591fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach#endif 6136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR 6138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) 6140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags 6141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji & BTM_SEC_LE_AUTHENTICATED) 6142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res); 6146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji GKI_remove_from_queue(bq, (void *)p_e); 6147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e); 6150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6151899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6152899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6153899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6154899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6155899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_set_serv_level4_flags 6156899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6157899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to set security mode 4 level 4 flags. 6158899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6159899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns service security requirements updated to include secure 6160899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** connections only mode. 6161899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6162899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6163899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator) 6164899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6165899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth UINT16 sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS; 6166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return cur_security | sec_level4_flags; 6168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 61705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 61715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clear_ble_keys 61735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to clear out the BLE keys. 61755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically when devices are removed in BTM_SecDeleteDevice, 61765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or when a new BT Link key is generated. 61775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 61795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 61815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec) 61825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 61835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__); 61855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 6186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 61875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS)); 6188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 6190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_resolving_list_remove_dev(p_dev_rec); 6191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 61925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 61935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 61945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 61955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 61965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_is_a_bonded_dev 61985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 61995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Is the specified device is a bonded device 62005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - dev is bonded 62025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 62045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda) 62055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 62065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 62085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_bonded= FALSE; 62095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec && 621191fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach#if (SMP_INCLUDED == TRUE) 62127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))|| 621391fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach#else 621491fbc7e560bb9c9f344980a18983d32e51f0360aAndre Eisenbach ( 62157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 62167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) 62175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_bonded = TRUE; 62195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded); 62215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(is_bonded); 62225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 62235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 62255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_le_capable_dev 6227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Is the specified device is dual mode or LE only device 6229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE - dev is a dual mode 6231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6232ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 6233ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda) 6234ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 6235ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 6236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN le_capable = FALSE; 6237ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE) 6239e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE) 6240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta le_capable = TRUE; 6241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 6242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return le_capable; 6243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 6244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 6246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 62475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_bonded_dev 62485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find a bonded device starting from the specified index 62505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - found a bonded device 62525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6254e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. ChenBOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec) 62555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 62565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found= FALSE; 62575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 62595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 62605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 62615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS) 62625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("LE bonded device not found"); 62645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return found; 62655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 62665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[start_idx]; 62685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 62695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 62715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_found_idx = i; 6273e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. Chen *p_rec = p_dev_rec; 62745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 62755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 62765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() found=%d", __func__, found); 62785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 62795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(found); 62805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_use_smp_br_chnl 6285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function checks if SMP BR connection can be used with 6287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the peer. 6288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Is called when authentication for dedicated bonding is 6289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** successfully completed. 6290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE - if SMP BR connection can be used (the link key is 6292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** generated from P-256 and the peer supports Security 6293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Manager over BR). 6294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec) 6297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT32 ext_feat; 6299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE]; 6300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__, 6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type); 6303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) && 6305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 6306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask)) 6309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) 6312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 6315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_is_master 6320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function checks if the device is BR/EDR master after 6322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** pairing is completed. 6323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE - if the device is master. 6325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec) 6328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); 6330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return (p && (p->link_role == BTM_ROLE_MASTER)); 6331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6333