15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions for the Bluetooth Security Manager 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#define LOG_TAG "bt_btm_sec" 2644802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati 27899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#include <stdarg.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 2930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 30d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "device/include/controller.h" 31d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/log.h" 32d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/time.h" 33d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 3549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bt_utils.h" 3649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btm_int.h" 3749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btu.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE) 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */ 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gatt_int.h" 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY (5000) 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue; 5378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr); 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 586975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************** 596975b4d711142b885af479721cada448952c6b41Andre Eisenbach** L O C A L F U N C T I O N P R O T O T Y P E S * 606975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/ 61ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin KochartBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec); 7178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_collision_timeout(void *data); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void); 7378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_pairing_timeout(void *data); 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_check_pending_reqs(void); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec); 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec); 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle); 937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8 btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec); 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state); 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec); 1017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec); 1027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec); 1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec); 104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm); 105899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator); 1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, 108f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach tBTM_SEC_CALLBACK *p_callback, void *p_ref_data, 109f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach tBTM_BLE_SEC_ACT sec_act); 110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, 111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 encr_enable); 112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec); 114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec); 1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OUT, IO, IN, NONE */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT */ {FALSE, FALSE, TRUE, FALSE}, 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO */ {FALSE, TRUE, TRUE, FALSE}, 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN */ {TRUE, TRUE, TRUE, FALSE}, 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE, FALSE, FALSE, FALSE} 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_OUT 0 DisplayOnly */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IO 1 DisplayYesNo */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IN 2 KeyboardOnly */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_NONE 3 NoInputNoOutput */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authenticated 1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authenticated 1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec) 1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) 1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_encrypted 1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is encrypted 1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec) 1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authorized 1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authorized 1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec) 1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Function btm_dev_16_digit_authenticated 187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Description check device is authenticated by using 16 digit pin or MITM 189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Returns BOOLEAN TRUE or FALSE 191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde*******************************************************************************/ 193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bondestatic BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec) 194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde{ 195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used 196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) 197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde { 198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde return(TRUE); 199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 200818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde return(FALSE); 201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde} 202818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 203818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde/******************************************************************************* 204818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_serv_trusted 2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check service is trusted 2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec) 2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id)) 2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 2227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecRegister 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Application manager calls this function to register for 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security services. There can be one and only one application 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** saving link keys. BTM allows only first registration. 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 232f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 temp_value = {0}; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 238f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s application registered", __func__); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 241db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb_info->p_le_callback) 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 244f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE 245f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__); 246f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton SMP_Register(btm_proc_smp_cback); 247f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif 248f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton /* if no IR is loaded, need to regenerate all the keys */ 249f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) 250f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton { 251f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton btm_ble_reset_id(); 252f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton } 253f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton } 254f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton else 255f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton { 256db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_WARN(LOG_TAG, "%s p_cb_info->p_le_callback == NULL", __func__); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api = *p_cb_info; 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 262db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 264f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s application registered", __func__); 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 270877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function BTM_SecRegisterLinkKeyNotificationCallback 271877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 272877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description Application manager calls this function to register for 273877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** link key notification. When there is nobody registered 274877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** we should avoid changing link key 275877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 276877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns TRUE if registered OK, else FALSE 277877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 278877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 279877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback) 280877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 281877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.api.p_link_key_callback = p_callback; 282877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 283877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 284877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 285877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 286877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddRmtNameNotifyCallback 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can register to be notified when name of the 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** remote device is resolved. 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == NULL) 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = p_callback; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteRmtNameNotifyCallback 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can deregister notification when a new Link Key 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is generated per connection. 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if OK, else FALSE 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == p_callback) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = NULL; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetSecurityFlags 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get security flags for the device 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE or FALSE is device found 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 3547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 3555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 3587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 3607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_GetSecurityFlagsByTransport 3627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description Get security flags for the device on a particular transport 3647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE is device found 3667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 3687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags, 3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport) 3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 3717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 3727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 3757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_BR_EDR) 3767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 3787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8); 3797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPinType 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set PIN type for the device. 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len) 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d", 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pin_type, (char *) pin_code, pin_code_len); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If device is not up security mode will be set as a part of startup */ 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.cfg.pin_type != pin_type) 40230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson && controller_get_interface()->get_is_ready() ) 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (pin_type); 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_type = pin_type; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_code_len = pin_code_len; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPairableMode 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enable or disable pairing 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters allow_pairing - (TRUE or FALSE) whether or not the device 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allows pairing. 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connect_only_paired - (TRUE or FALSE) whether or not to 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** only allow paired devices to connect. 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired) 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", allow_pairing, connect_only_paired); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_disabled = !allow_pairing; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.connect_only_paired = connect_only_paired; 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_SetSecureConnectionsOnly 437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description Enable or disable default treatment for Mode 4 Level 0 services 439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter secure_connections_only_mode - (TRUE or FALSE) whether or not the device 441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** TRUE means that the device should treat Mode 4 Level 0 services as 442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** services of other levels. (Secure_connections_only_mode) 443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** FALSE means that the device should provide default treatment for 444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Mode 4 Level 0 services. 445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns void 447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode) 450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_API("%s: Mode : %u", __FUNCTION__, 452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth secure_connections_only_mode); 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.devcb.secure_connections_only = secure_connections_only_mode; 455c5c741075fbc36e373f0bec4c3520188d2ba9a38Srinu Jella btm_cb.security_mode = BTM_SEC_MODE_SC; 456899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES ((UINT16) 0xffff) 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetSecurityLevel 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: is_originator - TRUE if originating the connection, FALSE if not 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id, 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type; 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_ORIG; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_TERM; 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (conn_type, p_name, service_id, 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (is_originator, p_name, service_id, 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_set_security_level 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: conn_type - TRUE if originating the connection, FALSE if not 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 index; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 first_unused_record = BTM_NO_AVAIL_SEC_SERVICES; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN record_allocated = FALSE; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_ucd; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = TRUE; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = FALSE; 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 546818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level); 547818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if the record can be reused (same service name, psm, mx_proto_id, 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, and mx_chan_id), or obtain the next unused record */ 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[0]; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if there is already a record for this service */ 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->security_flags & BTM_SEC_IN_USE) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id && 5620e888661a5dc23e516429b3e80f1f6a1aac12015Andre Eisenbach p_name && 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!strncmp (p_name, (char *) p_srec->orig_service_name, 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN) || 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !strncmp (p_name, (char *) p_srec->term_service_name, 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN))) 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id) 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark the first available service record */ 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!record_allocated) 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC)); 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project first_unused_record = index; 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!record_allocated) 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)", BTM_SEC_MAX_SERVICE_RECORDS); 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process the request if service record is valid */ 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If a duplicate service wasn't found, use the first available */ 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (index >= BTM_SEC_MAX_SERVICE_RECORDS) 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = first_unused_record; 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[index]; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->psm = psm; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->service_id = service_id; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id = mx_proto_id; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->orig_mx_chan_id = mx_chan_id; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 60866209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy ((char *)p_srec->orig_service_name, p_name, BTM_SEC_SERVICE_NAME_LEN); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Originator should not set requirements for incoming connections */ 627818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE 628818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN ); 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_AUTHENTICATE) 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_MITM; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_ENCRYPT) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_AUTHENTICATE; 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connections usually set the security level right before 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection is initiated. 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set it to be the outgoing service */ 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd == FALSE ) 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_srec; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->term_mx_chan_id = mx_chan_id; 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 65666209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy ((char *)p_srec->term_service_name, p_name, BTM_SEC_SERVICE_NAME_LEN); 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 664818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE 665818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_IN_MIN_16_DIGIT_PIN); 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 672818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE 673818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_IN_MIN_16_DIGIT_PIN); 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Acceptor should not set requirements for outgoing connections */ 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 681899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_AUTHENTICATE) 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_MITM; 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_ENCRYPT) 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_AUTHENTICATE; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(BTM_SEC_IN_USE); 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d", 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x", 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_srec->ucd_security_flags); 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 7105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : service name [%s] (up to %d chars saved)", 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name, BTM_SEC_SERVICE_NAME_LEN); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d", 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 7205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : sec: 0x%x, service name [%s] (up to %d chars saved)", 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecClrService 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record(s) from the security database. 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified name are removed. 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used only by devices with limited RAM so that it can 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** reuse an old security service record. 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Unpredictable results may occur if a service is cleared 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that is still in use by an application/profile. 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id) 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) && 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!service_id || (service_id == p_srec->service_id))) 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id); 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags = 0; 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clr_service_by_psm 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record from the security database. 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified psm are removed. 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used by L2CAP to free up the service record used 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by dynamic PSM clients when the channel is closed. 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The given psm must be a virtual psm. 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm) 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) ) 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed); 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_clr_temp_auth_service 810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Removes specified device record's temporary authorization 812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** flag from the security database. 813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters Device address to be cleared 815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void. 817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda) 820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bda)) == NULL) 824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 8255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB"); 826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */ 830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service) 831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 8325344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]", 833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID; 836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PINCodeReply 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PIN code request to the UI. 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which PIN was requested 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d", 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res); 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr"); 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB"); 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) ) 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */ 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) || 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) ) 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (bd_addr); 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (pin_len >= 16) { 906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 907818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.security_mode_changed == FALSE) ) 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is start of the dedicated bonding if local device is 2.0 */ 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 915818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->pin_code_length = pin_len; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = 0xff ; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection"); 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we change state little bit early so btm_sec_connected() will originate connection */ 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* when existing ACL link is down completely */ 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already accepted incoming connection from pairing device */ 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer"); 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 9477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE); 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin); 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_sec_bond_by_transport 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description this is the bond function that will start either SSP or SMP. 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device to bond 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: After 2.1 parameters are not used and preserved here not to change API 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 9737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 9773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 *p_features; 9783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 ii; 9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p= btm_bda_to_acl(bd_addr, transport); 9805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x", 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9835344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport); 9847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Other security process is in progress */ 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9926975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL) 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9946975b4d711142b885af479721cada448952c6b41Andre Eisenbach return(BTM_NO_RESOURCES); 9957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags); 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Finished if connection is active and already paired */ 10007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR 10017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 10027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 10037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE 10047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) 10057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 10067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SecBond -> Already Paired"); 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell controller to get rid of the link key if it has one stored */ 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS) 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the PIN code if we got a valid one */ 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 1021818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->pin_code_length = pin_len; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN); 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN); 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE; 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = TRUE; 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10346975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 10357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1037e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_init_pseudo_addr (p_dev_rec, bd_addr); 10387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK; 10397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (SMP_Pair(bd_addr) == SMP_STARTED) 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 10447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags = 0; 10497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(BTM_NO_RESOURCES); 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED 10547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta | BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); 10557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags); 105730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->supports_simple_pairing()) 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The special case when we authenticate keyboard. Set pin type to fixed */ 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It would be probably better to do it from the application, but it is */ 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complicated */ 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = TRUE; 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED); 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10713aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) 10723aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 10733aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features = p_dev_rec->features[ii]; 10745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x", 10753aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach ii, p_features[0], p_features[1], p_features[2], p_features[3]); 10765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x", 10773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features[4], p_features[5], p_features[6], p_features[7]); 10783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle); 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN; 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection already exists... */ 10877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark lcb as bonding */ 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (bd_addr, TRUE); 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4); 110030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->supports_simple_pairing() 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->sm4 == BTM_SM4_KNOWN)) 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_sec_check_prefetch_pin (p_dev_rec) ) 1104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_CMD_STARTED); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1106899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 1107899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 1108899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) && 1109899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local is 2.1 and peer is unknown */ 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are not accepting connection request from peer 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * -> RNR (to learn if peer is 2.1) 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 11187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We are accepting connection request from peer */ 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d", 11267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state); 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* both local and peer are 2.1 */ 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_dd_create_conn(p_dev_rec); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 11427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBondByTransport 11447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 11467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - doing SSP over BR/EDR or SMP over LE 11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE 11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_DEVICE_TYPE dev_type; 11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type; 11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* LE device, do SMP pairing */ 11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) || 11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) 11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_ILLEGAL_ACTION; 11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBond 11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 11807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 11817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 11827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 11847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 11857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 11877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 11937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (BTM_UseLeLink(bd_addr)) 11957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BT_TRANSPORT_LE; 11967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 11987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 12007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecBondCancel 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to cancel ongoing bonding process 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with peer device. 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 12077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - FALSE for BR/EDR link; TRUE for LE link 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SecBondCancel() State: %s flags:0x%x", 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags); 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_UNKNOWN_ADDR; 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 12227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12265344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Cancel LE pairing"); 12277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (SMP_PairCancel(bd_addr)) 12287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 12297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_CMD_STARTED; 12307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_WRONG_MODE; 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state ); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-fetching pin for dedicated bonding */ 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_SUCCESS; 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this BDA is in a bonding procedure */ 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link is up */ 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If some other thread disconnecting, we do not send second command */ 1253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) || 1254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)) 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link was set up by Bonding process */ 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 12597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(bd_addr, FALSE); 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /*HCI link is not up */ 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link creation was started by Bonding process */ 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_create_conn_cancel(bd_addr)) 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 1276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_CancelRemoteDeviceName(); 1278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD; 1279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return BTM_CMD_STARTED; 1280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_WRONG_MODE; 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecGetDeviceLinkKey 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to obtain link key for the device 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it returns BTM_SUCCESS if link key is available, or 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_UNKNOWN_ADDR if Security Manager does not know about 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the device or device record does not contain link key info 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link_key - Link Key is copied into this array 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key) 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN); 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_UNKNOWN_ADDR); 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function BTM_SecGetDeviceLinkKeyType 1317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to obtain link key type for the 1319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** device. 1320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** it returns BTM_SUCCESS if link key is available, or 1321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** BTM_UNKNOWN_ADDR if Security Manager does not know about 1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the device or device record does not contain link key info 1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns BTM_LKEY_TYPE_IGNORE if link key is unknown, link type 1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** otherwise. 1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr) 1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return p_dev_rec->link_key_type; 1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_LKEY_TYPE_IGNORE; 1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetEncryption 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to ensure that connection is 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** encrypted. Should be called only on an open connection. 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically only needed for connections that first want to 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bring up unencrypted links, then later encrypt them. 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 1349f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach** transport - Link transport 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed. Can be set to NULL 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if status is not desired. 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - pointer to any data the caller wishes to receive 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in the callback function upon completion. 1356f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach** can be set to NULL if not used. 1357f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach** sec_act - LE security action, unused for BR/EDR 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - already encrypted 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_PENDING - command will be returned in the callback 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_WRONG_MODE- connection not up. 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY - security procedures are currently active 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MODE_UNSUPPORTED - if security manager not linked in. 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback, 1367f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach void *p_ref_data, tBTM_BLE_SEC_ACT sec_act) 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS rc = 0; 13707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 13727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!p_dev_rec || 13737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 13747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 13757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) 13767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 13777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection should be up and runnning */ 13805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected"); 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE); 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13883e2ab979958a851fdf8b623b552525da9dac88b6Nitin Arora if (transport == BT_TRANSPORT_BR_EDR && 13897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted"); 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 13947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* enqueue security request if security is active */ 1400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request"); 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1404f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data, sec_act)) 1405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_CMD_STARTED; 1407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1408444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1409444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_callback) 1411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES); 1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_NO_RESOURCES; 1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = FALSE; 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x", 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required); 14247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 14267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1428444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tACL_CONN *p = btm_bda_to_acl(bd_addr, transport); 1429444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p) 1430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1431f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach rc = btm_ble_set_encryption(bd_addr, sec_act, p->link_role); 1432444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rc = BTM_WRONG_MODE; 1436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__); 1437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_sec_execute_procedure (p_dev_rec); 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 14487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc); 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet. 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle) 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1460ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 old_state = p_dev_rec->sec_state; 1461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_STATUS status = BTM_CMD_STARTED; 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x", 14647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta conn_handle, reason); 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* send HCI_Disconnect on a transport only once */ 1467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (old_state) 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING: 1470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (conn_handle == p_dev_rec->hci_handle) 1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 14757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 1477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING_BLE: 1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (conn_handle == p_dev_rec->ble_hci_handle) 1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING_BOTH: 1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ? 1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; 1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */ 1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle) 1497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect"); 1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; 1500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status = BTM_SUCCESS; 1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Tear down the HCI link */ 1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (!btsnd_hcic_disconnect (conn_handle, reason)) 1504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* could not send disconnect. restore old state */ 1506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = old_state; 1507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status = BTM_NO_RESOURCES; 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ConfirmReqReply 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to confirm the numeric value for 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_CFM_REQ_EVT 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr) 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s Res: %u", 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) ) 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res == BTM_SUCCESS) 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 1546818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, TRUE); 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */ 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, FALSE); 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PasskeyReqReply 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the passkey for 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_KEY_REQ_EVT 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey - numeric value in the range of 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey) 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s res:%d", 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) ) 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1587444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 1588444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL) 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 15937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SecBondCancel(bd_addr); 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (passkey > BTM_MAX_PASSKEY_VAL) 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply (bd_addr); 1616444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } else { 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_reply (bd_addr, passkey); 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SendKeypressNotif 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used during the passkey entry model 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by a device with KeyboardOnly IO capabilities 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (very likely to be a HID Device). 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is called by a HID Device to inform the remote device when 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a key has been entered or erased. 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type - notification type 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type) 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This API only make sense between PASSKEY_REQ and SP complete */ 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_send_keypress_notif (bd_addr, type); 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_IoCapRsp 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in response to BTM_SP_IO_REQ_EVT 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the tBTM_SP_CALLBACK implementation, this function is 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** called to provide the actual response 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** io_cap - The IO capability of local device. 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** oob - BTM_OOB_NONE or BTM_OOB_PRESENT. 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** auth_req- MITM protection required or not. 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d", 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = auth_req; 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = io_cap; 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT)); 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req); 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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_ReadLocalOobData 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local OOB data from 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** LM 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void) 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_SUCCESS; 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_read_local_oob_data() == FALSE) 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_NO_RESOURCES; 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RemoteOobDataReply 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the remote OOB data for 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_RMT_OOB_EVT 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r) 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1714444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__, 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (bd_addr); 1728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } else { 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_reply (bd_addr, c, r); 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BuildOobData 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to build the OOB data payload to 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be sent over OOB (non-Bluetooth) link 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** max_len - p_data size. 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name_len- 0, local device name would not be included. 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the local device name is included for 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** up to this specified length 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of bytes in p_data. 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r, UINT8 name_len) 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = 0; 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 name_size; 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mandatory part */ 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 176630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address); 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = BTM_OOB_MANDATORY_SIZE; 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now optional part */ 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Hash C */ 1774444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 delta = BTM_OOB_HASH_C_SIZE + 2; 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_HASH_C_SIZE + 1; 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE; 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE); 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Rand R */ 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_RAND_R_SIZE + 2; 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_RAND_R_SIZE + 1; 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE; 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE); 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add class of device */ 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_COD_SIZE + 2; 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_COD_SIZE + 1; 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_COD_TYPE; 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class); 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = name_len; 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (name_size > strlen(btm_cb.cfg.bd_name)) 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = (UINT16)strlen(btm_cb.cfg.bd_name); 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = name_size + 2; 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_size + 1; 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_type; 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size); 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update len */ 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_data; 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1831899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_BothEndsSupportSecureConnections 1832444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1833899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if both the local device and the peer device 1834899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** specified by bd_addr support BR/EDR Secure Connections. 1835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1836899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters: bd_addr - address of the peer 1837899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1838899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if BR/EDR Secure Connections are supported by both local 1839899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** and the remote device. 1840899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** else FALSE. 1841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1843899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr) 1844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1845899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return ((controller_get_interface()->supports_secure_connections()) && 1846899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_PeerSupportsSecureConnections(bd_addr))); 1847899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 1848899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1849899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 1850899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_PeerSupportsSecureConnections 1852899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1853899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if the peer supports 1854899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** BR/EDR Secure Connections. 1855899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1856899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters: bd_addr - address of the peer 1857899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1858899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if BR/EDR Secure Connections are supported by the peer, 1859899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** else FALSE. 1860899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1861899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 1862899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr) 1863899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 1864899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth tBTM_SEC_DEV_REC *p_dev_rec; 1865899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1866899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL) 1867899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 1868899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__, 1869899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3], 1870899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (bd_addr[4]<< 8) + bd_addr[5]); 1871899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return FALSE; 1872899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 1873899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1874899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (p_dev_rec->remote_supports_secure_connections); 1875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1876444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadOobData 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to parse the OOB data payload 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received over OOB (non-Bluetooth) link 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** eir_tag - The associated EIR tag to read the data. 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *p_len(output) - the length of the data with the given tag. 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the beginning of the data with the given tag. 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NULL, if the tag is not found. 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 max_len; 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len, type; 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_ret = NULL; 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ret_len = 0; 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(max_len, p); 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= BTM_OOB_MANDATORY_SIZE) 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; /* the location for bd_addr */ 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = BTM_OOB_BD_ADDR_SIZE; 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= BTM_OOB_MANDATORY_SIZE; 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now the optional data in EIR format */ 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (max_len > 0) 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = *p++; /* tag data len + 1 */ 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = *p++; 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (eir_tag == type) 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = len - 1; 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the data size of this tag is len + 1 (tag data len + 2) */ 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len > len) 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len--; 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len--; 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len = 0; 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_len) 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = ret_len; 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_ret; 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetOutService 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the service for 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** outgoing connections. 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the profile/application calls BTM_SetSecurityLevel 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before initiating a connection, this function does not 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** need to be called. 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id) 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1968444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->service_id == service_id) 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d", 19755738f83aeb59361a0a2eda2460113f6dc919427The 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); 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************ 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** I N T E R N A L F U N C T I O N S 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/ 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_upgrade_possible 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1991ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function returns TRUE if the existing link key 1992ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** can be upgraded or if the link key does not exist. 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1994ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BOOLEAN 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1997ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM; 2000ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_possible = TRUE; 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = FALSE; 20057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->p_cur_service) 20067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x", 2008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, 2009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags); 20107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 20117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 20127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x", 2014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); 20157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Already have a link key to the connected peer. Is the link key secure enough? 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Is a link key upgrade even possible? 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2019899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & mtm_check) /* needs MITM */ 2020899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) || 2021899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) 2022899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* has unauthenticated 2023899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth link key */ 2024899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ 2025899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) 2026899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* authenticated 2027899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth link key is possible */ 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* upgrade is possible: check if the application wants the upgrade. 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the application is configured to use a global MITM flag, 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it probably would not want to upgrade the link key based on the security level database */ 2032ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = TRUE; 2033ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2034ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags); 2036ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return is_possible; 2037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_check_upgrade 2042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to check if the existing link key 2044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** needs to be upgraded. 2045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 2047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 2049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 2050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s()", __func__); 2053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Only check if link key already exists */ 2055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 2056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 2057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE) 2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 20605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags); 2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* upgrade is possible: check if the application wants the upgrade. 2062ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * If the application is configured to use a global MITM flag, 2063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * it probably would not want to upgrade the link key based on the security level database */ 2064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SP_UPGRADE evt_data; 2065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 2066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.upgrade = TRUE; 2067ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.api.p_sp_callback) 2068ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 2069ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 20705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade); 2071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (evt_data.upgrade) 2072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if the application confirms the upgrade, set the upgrade bit */ 2074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2075ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Clear the link key known to go through authentication/pairing again */ 2077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED); 2078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED; 20795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags); 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_l2cap_access_req 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to grant permission to 20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establish L2CAP connection to or from the peer device. 20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are complete. MUST NOT BE NULL. 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tBTM_STATUS 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle, 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type, 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 security_required; 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 old_security_required; 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN old_is_originator; 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc = BTM_SUCCESS; 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN chk_acp_auth_done = FALSE; 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 2115ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; /* should check PSM range in LE connection oriented L2CAP connection */ 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data); 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data); 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_first_serv (conn_type, psm); 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm); 21427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2146899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Services level0 by default have no security */ 2147899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only)) 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2155899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 2156899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2157899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags, 2158899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2159899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2160899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2161899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2162899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->ucd_security_flags; 2163899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 21705738f83aeb59361a0a2eda2460113f6dc919427The 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))) || 21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 21805738f83aeb59361a0a2eda2460113f6dc919427The 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))) || 21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2183818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // Check for 16 digits (or MITM) 2184818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2185818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && 2186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde btm_dev_16_digit_authenticated(p_dev_rec))) { 2187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde rc = BTM_SUCCESS; 2188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2192899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2193899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2194899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2195899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 22017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 2210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, 2212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2215899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->security_flags; 2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm 0x%04x", 2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, security_required, is_originator, psm); 2222899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2223899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) 2224899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2225899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 2226899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */ 2227899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 2228899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2229899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d", 2230899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__, 2231899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, 2232899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections); 2233899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2234899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, (void *)p_ref_data, 2235899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto KRZR) which connects to several services at the same time */ 22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x", __func__, 2246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4); 22475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags); 22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 2249899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2250899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2251899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2252899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2253899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 22617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 22627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) || 22637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_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 else 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 22717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) || 22727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) || 22737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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)))) 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2278818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // Check for 16 digits (or MITM) 2279818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2280818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) { 2281818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde rc = BTM_SUCCESS; 2282818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2286899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2287899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2288899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2289899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2290899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2291899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 22957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = TRUE; 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save pointer to service record */ 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2307899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */ 2308899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2309899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2310899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (is_originator) 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT); 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2319899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else /* acceptor */ 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */ 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project chk_acp_auth_done = TRUE; 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 2325899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2326899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2327899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) 2328899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2329899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the remote features are not known yet */ 2330899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__, 2331899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags); 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2333899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_REQ_PEND; 2334899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_CMD_STARTED); 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__, 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done); 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_security_required = p_dev_rec->security_required; 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_is_originator = p_dev_rec->is_originator; 23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = security_required; 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = TRUE; 23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = FALSE; 23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are multiple service records used through the same PSM */ 23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* leave security decision for the multiplexor on the top */ 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_sec_find_next_serv (p_serv_rec)) != NULL) 23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */ 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_find_next_serv (p_serv_rec)) != NULL) 23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23635344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done); 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm); 23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-Lisbon: restore the old settings */ 23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2377899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* if the originator is using dynamic PSM in legacy mode, do not start any security process now 2378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth * The layer above L2CAP needs to carry out the security requirement after L2CAP connect 2379899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth * response is received */ 2380899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (is_originator && 2381899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2382899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2383899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2384899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001)) 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm); 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restore the old settings */ 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (chk_acp_auth_done) 23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x", 24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); 24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4, but we do not know for sure which level of security we need. 24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * as long as we have a link key, it's OK */ 24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_DELAY_CHECK; 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence 24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project because of data path issues. Delay this disconnect a little bit 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2411db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s peer should have initiated security process by now (SM4 to SM4)", __func__); 24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC; 24147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, rc); 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_SUCCESS; 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 2423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id) 2424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Although authentication and encryption are per connection 2426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** authorization is per access request. For example when serial connection 2427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** is up and authorized and client requests to read file (access to other 2428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** scn), we need to request user's permission again. 2429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 2430ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED; 2431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ 2439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) 2440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_AUTHENTICATED); 2445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); 2446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* If we already have a link key to the connected peer, is it secure enough? */ 2450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_check_upgrade(p_dev_rec, is_originator); 2451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d", 2455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 24617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc); 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_mx_access_request 24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by all Multiplexing Protocols during 24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establishing connection to or from peer device to grant 24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** permission to establish application connection. 24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of the multiplexer 24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - multiplexer channel to reach application 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - Pointer to any reference data needed by the 24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the callback function. 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator, 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 2497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 security_required; 24987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */ 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator); 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id); 25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 25117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d", 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id); 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2518899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm))) 2519899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2520899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, 2521899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2522899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2523899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2524899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2525899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->security_flags; 2526899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2527899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto phone) which connects to several services at the same time */ 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2532444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed state: %s", __func__, 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state)); 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_CMD_STARTED; 2536899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2537899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2538899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2539899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2540899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2541899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2542899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) 2543ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2544ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 2546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_originator) 2547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2548ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 25497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 25507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_SUCCESS; 2554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 25597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 25607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2566818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // Check for 16 digits (or MITM) 2567818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2568818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && btm_dev_16_digit_authenticated(p_dev_rec))) { 2569818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde rc = BTM_SUCCESS; 2570818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2573899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2574899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2575899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2576899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2577899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2578899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2579899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2580899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (rc == BTM_SUCCESS) 2581899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2582899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__); 2583899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */ 2584899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* btm_sec_execute_procedure */ 2585899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) || 2586899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) 2587899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2588899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__); 2589899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2590899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2591899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2592899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2593899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Check whether there is a pending security procedure, if so we should always queue */ 2594899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the new security request */ 2595899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) 2596899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__); 2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (rc == BTM_CMD_STARTED) 2601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__); 2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_queue_mx_request (bd_addr, psm, is_originator, mx_proto_id, 2604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth mx_chan_id, p_callback, p_ref_data); 2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else /* rc == BTM_SUCCESS */ 2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* access granted */ 2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc); 2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc, 2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_pair_state_descr(btm_cb.pairing_state)); 2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return rc; 2618899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2619899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2620899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) || 2621899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_cb.security_mode == BTM_SEC_MODE_SC))) 2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2623899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 2624899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor receives service connection establishment Request for */ 2625899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Secure Connections Only service */ 2626899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 2627899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,", 2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "remote_support_for_sc %d: fail pairing",__FUNCTION__, 2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, p_dev_rec->remote_supports_secure_connections); 2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, (void *)p_ref_data, 2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->security_required = security_required; 26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2643899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2644899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2645899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2649899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2650899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2651899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2652899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ 2653899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) 2654899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2655899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2656899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2657899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2658899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2659899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_AUTHENTICATED); 2660899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); 2661899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2662899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2663899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2664899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* If we already have a link key, check if that link key is good enough */ 2665899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_check_upgrade(p_dev_rec, is_originator); 2666899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Although authentication and encryption are per connection */ 26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization is per access request. For example when serial connection */ 26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is up and authorized and client requests to read file (access to other */ 26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* scn, we need to request user's permission again. */ 26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED); 26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2680444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d", 2681444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2682444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 26897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc); 26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rc; 26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_conn_req 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when the peer device is requesting 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc) 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some device may request a connection before we are done with the HCI_Reset sequence */ 271130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request when device not ready"); 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Security guys wants us not to allow connection from not paired devices */ 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection is allowed for only paired devices */ 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.connect_only_paired) 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device"); 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE 27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If non-discoverable, only allow known devices to connect */ 27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) 27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from not paired device"); 27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN))) 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device"); 27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* incoming connection from bonding device is rejected */ 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT; 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Host is not interested or approved connection. Save BDA and DC and */ 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pass request to L2CAP */ 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN); 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_dc, dc, DEV_CLASS_LEN); 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2c_link_hci_conn_req (bda)) 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* accept the connection -> allocate a device record */ 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_CONN_PEND; 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_bond_cancel_complete 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to report bond cancel complete 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void) 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) || 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 2791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || 2792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && 2793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for dedicated bonding in legacy mode, authentication happens at "link level" 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * btm_sec_connected is called with failed status. 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * In theory, the code that handles is_pairing_device/TRUE should clean out security related code. 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, this function may clean out the security related flags and btm_sec_connected would not know 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this function also needs to do proper clean up. 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL) 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application that the cancel succeeded */ 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS); 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_create_conn_cancel_complete 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the command complete message 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is received from the HCI for the create connection cancel 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** command. 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p) 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (status, p); 28275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s status:%d", 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status); 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the create conn cancel cmd was issued by the bond cancel, 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the application needs to be notified that bond cancel succeeded 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (status) 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_SUCCESS: 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_CONNECTION_EXISTS: 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_NO_CONNECTION: 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application of the error */ 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_check_pending_reqs 28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called at the end of the security procedure 28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to let L2CAP and RFCOMM know to re-submit any pending requests 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void) 28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First, resubmit L2CAP requests */ 28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.sec_req_pending) 28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = FALSE; 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (NULL); 28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, re-submit anything in the mux queue */ 28701a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_t *bq = btm_cb.sec_pending_q; 28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28721a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btm_cb.sec_pending_q = fixed_queue_new(SIZE_MAX); 28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28741a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov tBTM_SEC_QUEUE_ENTRY *p_e; 28751a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)fixed_queue_try_dequeue(bq)) != NULL) 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check that the ACL is still up before starting security procedures */ 2878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_e->psm != 0) 2881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2882444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u", 2883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, p_e->psm, p_e->is_orig, 2884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->mx_proto_id, p_e->mx_chan_id); 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig, 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id, p_e->mx_chan_id, 28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback, p_e->p_ref_data); 2889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 2891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback, 2893f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach p_e->p_ref_data, p_e->sec_act); 2894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2897abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_e); 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28991a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_free(bq, NULL); 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_init 29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is on the SEC startup 29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode) 29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = sec_mode; 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); 29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY; 29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_device_down 29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called when device is disabled or 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** turned off 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void) 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state)); 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_reset 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called after device reset 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void) 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 294630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (controller_get_interface()->supports_simple_pairing()) 29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the default IO capabilities */ 29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS; 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mx service to use no security */ 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX, 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = BTM_SEC_MODE_SERVICE; 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode); 29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_abort_access_req 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP or RFCOMM to abort 29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the pending operation. 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr) 29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) 29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 29845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dd_create_conn 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to create the ACL connection for 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the dedicated boding process 29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec) 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3001ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); 3002ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella if (p_lcb && (p_lcb->link_state == LST_CONNECTED || p_lcb->link_state == LST_CONNECTING)) 3003ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella { 3004ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella BTM_TRACE_WARNING("%s Connection already exists", __func__); 3005ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella return BTM_CMD_STARTED; 3006ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella } 30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure an L2cap link control block is available */ 3009ca7e0b1bd428ffa60cc8e49514421be94151f828Srinu Jella if (!p_lcb && (p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL) 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]", 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up the control block to indicated dedicated bonding */ 30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]", 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb(p_lcb); 30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_update_busy_level (BTM_BLI_PAGE_EVT); 30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]", 30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3042cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 3043cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_state_getting_name(void *data, void *context) 3044cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 3045cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = data; 3046cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 3047cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) { 3048cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 3049cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } 3050cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 3051cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 3052cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 30535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_name_request_complete 3056cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski* 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when remote name was obtained from 30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer device 30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status) 30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEV_CLASS dev_class; 30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sec_state; 30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30705344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete"); 30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) 30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr))) 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If remote name request failed, p_bd_addr is null and we need to search */ 30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* based on state assuming that we are doing 1 at a time */ 30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr) 30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_bd_addr); 30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3083cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *node = list_foreach(btm_cb.sec_dev_rec, is_state_getting_name, NULL); 3084cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (node != NULL) { 3085cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_dev_rec = list_node(node); 3086cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski p_bd_addr = p_dev_rec->bd_addr; 3087cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } else { 30887db2548c0346c1d33a46cc35b250e71fd24adae4Andre Eisenbach p_dev_rec = NULL; 3089cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski } 30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_bd_name) 30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_name = (UINT8 *)""; 30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3100c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_EVENT ("%s PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x ", __func__, 31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, p_dev_rec->sec_state, p_dev_rec); 3103c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach } else { 3104c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_EVENT ("%s PairState: %s RemName: %s status: %d", __func__, 31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status); 31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sec_state = p_dev_rec->sec_state; 31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 311566209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy((char *)p_dev_rec->sec_bd_name, (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN); 31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 31175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags); 31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */ 31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 0; 31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) 31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved */ 31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3131831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class, 31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach } else { 31365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[0] = 0; 31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[1] = 0; 31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[2] = 0; 31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if not found so clients can continue */ 31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3143831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)""); 31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we were delaying asking UI for a PIN because name was not resolved, ask now */ 31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr 31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) ) 31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3154c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_EVENT ("%s() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", 3155c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach __func__, btm_cb.pairing_flags, btm_cb.api.p_pin_callback); 31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3157c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0 && btm_cb.api.p_pin_callback) 31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3159c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_EVENT ("%s() calling pin_callback", __func__); 31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 3161818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name, 3162818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (p_dev_rec->p_cur_service==NULL) ? FALSE 3163818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the same state again to force the timer to be restarted */ 31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we were delaying bonding because name was not resolved */ 31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) 31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3176c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_EVENT ("%s() continue bonding sm4: 0x%04x, status:0x%x", __func__, p_dev_rec->sm4, status); 3177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) 3178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_sec_bond_cancel_complete(); 3180ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 3181ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 31835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 31845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 31887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 31897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_bd_name, status); 31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */ 31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/ 31977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If it is set, there may be a race condition */ 3198c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_DEBUG ("%s IS_SM4_UNKNOWN Flags:0x%04x", __func__, 31997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags); 32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) 32015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_KNOWN; 32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__, 32057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), 32067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); 32077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN. 32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed) 32105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec)) 32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 32145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3217c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_WARNING ("%s: waiting HCI_Connection_Complete after rejecting connection", __func__); 32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both we and the peer are 2.1 - continue to create connection */ 32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 32215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3222c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_WARNING ("%s: failed to start connection", __func__); 32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 32285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 32295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3232c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach } else { 3233c8a78e445a8f789a1fc682acd144053363f04c93Andre Eisenbach BTM_TRACE_WARNING ("%s: wrong BDA, retry with pairing BDA", __func__); 32347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR); 32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if we were delaying link_key_callback because name was not resolved */ 32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 32415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HCI connection complete has not arrived, wait for it */ 32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 32505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)"); 32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE); 32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) 32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If get name failed, notify the waiting layer */ 32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) 32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("waiting for remote features!!"); 32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remote Name succeeded, execute the next security procedure, if any */ 32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 32935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 32967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_host_support_feat_evt 33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the 33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received 33055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p) 33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bd_addr; /* peer address */ 33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_FEATURES features; 33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (bd_addr, p); 33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", p_dev_rec->sm4, p[0]); 33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 33233aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE); 33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HCI_SSP_HOST_SUPPORTED(features)) 33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_TRUE; 33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]); 33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_req 33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LM request for the IO 33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capability of the local device and 33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if the OOB data is present for the device in the event 33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p) 33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_REQ evt_data; 33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = 0; 33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_orig = TRUE; 33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 callback_rc = BTM_SUCCESS; 33505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* setup the default response according to compile options */ 33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* assume that the local IO capability does not change 33555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * loc_io_caps is initialized with the default value */ 33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.io_cap = btm_cb.devcb.loc_io_caps; 33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data = BTM_OOB_NONE; 33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_AUTH_REQ; 33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3360899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state)); 33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 3363899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3364899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__, 3365899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode, p_dev_rec->num_read_pages); 3366899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3367899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0)) 3368899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3369899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Device security mode is SC only.", 3370899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "To continue need to know remote features.", __FUNCTION__); 3371899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3372899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_features_needed = TRUE; 3373899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return; 3374899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3375899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 33765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_TRUE; 33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3378899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s Flags: 0x%04x p_cur_service: 0x%08x", 3379899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), 3380899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.pairing_flags, p_dev_rec->p_cur_service); 33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3382899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->p_cur_service) 33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3384899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x", 3385899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, p_dev_rec->p_cur_service->psm, 3386899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->p_cur_service->security_flags); 3387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3388899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3389899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth switch (btm_cb.pairing_state) 3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3391899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* initiator connecting */ 3392899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_IDLE: 3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth //TODO: Handle Idle pairing state 3394899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth //security_required = p_dev_rec->security_required; 3395899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3396899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* received IO capability response already->acceptor */ 3398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_INCOMING_SSP: 33995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig = FALSE; 34005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) 3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor in dedicated bonding */ 34045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 3405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* initiator, at this point it is expected to be dedicated bonding 3409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth initiated by local device */ 3410899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_WAIT_PIN_REQ: 3411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN)) 34125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 34145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 34165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth err_code = HCI_ERR_HOST_BUSY_PAIRING; 34185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* any other state is unexpected */ 3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth default: 34235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_HOST_BUSY_PAIRING; 3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__, 3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.pairing_state); 3426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 34275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_disabled) 3430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* pairing is not allowed */ 3432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__); 34335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 3438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* device in Secure Connections Only mode */ 3439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 3440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,", 3442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__, 3443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, p_dev_rec->remote_supports_secure_connections); 3444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 34485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err_code != 0) 34505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 34545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code); 34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 34575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.is_orig = is_orig; 34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 34625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local device initiated the pairing non-bonding -> use p_cur_service */ 34645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 34655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service && 34665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) 34675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* SC only mode device requires MITM protection */ 3471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = BTM_AUTH_SP_YES; 3472899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 3474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3475899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags & 3476899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO; 3477899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34885738f83aeb59361a0a2eda2460113f6dc919427The 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); 34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); 34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = BTM_SUCCESS; 34965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) 34975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; 34995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */ 35015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_AUTH_SPGB_YES; 35025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.api.p_sp_callback) 35045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the callback function implementation may change the IO capability... */ 35065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data)) 35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT)); 35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3516899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3517899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3518899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* At this moment we know that both sides are SC capable, device in */ 3519899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* SC only mode requires MITM for any service so let's set MITM bit */ 3520899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req |= BTM_AUTH_YN_BIT; 3521899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x", 3522899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, evt_data.auth_req); 3523899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3524899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3525899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* if the user does not indicate "reply later" by setting the oob_data to unknown */ 3526899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* send the response right now. Save the current IO capability in the control block */ 35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = evt_data.auth_req; 35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = evt_data.io_cap; 35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3530899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s IO_CAP:%d oob_data:%d auth_req:%d", 3531899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap, 3532899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.oob_data, evt_data.auth_req); 35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap, 35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data, evt_data.auth_req); 35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_rsp 35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the IO capability of the 35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified device is received 35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 35475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p) 35505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 35515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 35525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_RSP evt_data; 35535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 35555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.io_cap, p); 35565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.oob_data, p); 35575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.auth_req, p); 35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 35615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no security is in progress, this indicates incoming security */ 35635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP); 35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* work around for FW bug */ 35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_stop_on_ssp(); 35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We must have a device record here. 35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use the connecting device's CoD for the connection */ 35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 35835738f83aeb59361a0a2eda2460113f6dc919427The 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); 35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */ 35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */ 35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (evt_data.auth_req & BTM_AUTH_DD_BOND) ) /* and dedicated bonding bit is set */ 35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD; 35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the IO capability in the device record */ 35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = evt_data.io_cap; 35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_auth_req = evt_data.auth_req; 35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_proc_sp_req_evt 36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_USER_CONFIRMATION_REQUEST_EVT 36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_REQUEST_EVT 36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_NOTIFY_EVT 36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p) 36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ERR_PROCESSING; 36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_EVT_DATA evt_data; 36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda = evt_data.cfm_req.bd_addr; 36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All events start with bd_addr */ 36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s", 36265738f83aeb59361a0a2eda2460113f6dc919427The 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], 36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, btm_pair_state_descr(btm_cb.pairing_state)); 36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL) 36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 363666209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy((char *)evt_data.cfm_req.bd_name, (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN); 36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_CFM_REQ_EVT: 36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Numeric confirmation. Need user to conf the passkey */ 36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); 36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The device record must be allocated in the "IO cap exchange" step */ 36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p); 36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = TRUE; 36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process user confirm req in association with the auth_req param */ 36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO) 36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) 36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) 36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) ) 36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both devices are DisplayYesNo and one or both devices want to authenticate 36565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project -> use authenticated link key */ 36575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = FALSE; 36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d", 36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps, 36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req); 36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; 36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; 36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; 36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; 36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_NOTIF_EVT: 36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Passkey notification (other side is a keyboard) */ 36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.key_notif.passkey, p); 36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey); 36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_REQ_EVT: 36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HCI_USER_PASSKEY_REQUEST_EVT */ 36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY); 36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data); 36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_NOT_AUTHORIZED) 36915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */ 36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) ) 36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* automatically reply with just works if no sp_cback */ 36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_SUCCESS; 37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_SP_CFM_REQ_EVT) 37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status); 37055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfirmReqReply (status, p_bda); 37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_SP_KEY_REQ_EVT) 37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PasskeyReqReply(status, p_bda, 0); 37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Something bad. we can only fail this connection */ 37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SP_CFM_REQ_EVT == event) 37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_bda, FALSE); 37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTM_SP_KEY_NOTIF_EVT == event) 37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do nothing -> it very unlikely to happen. 37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project This event is most likely to be received by a HID host when it first connects to a HID device. 37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Usually the Host initiated the connection in this case. 37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project On Mobile platforms, if there's a security process happening, 37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the host probably can not initiate another connection. 37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTW (PC) is another story. */ 37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL != (p_dev_rec = btm_find_dev (p_bda)) ) 37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE); 37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_bda); 37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_keypress_notif_evt 37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a key press notification is 37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received 37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_keypress_notif_evt (UINT8 *p) 37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_KEYPRESS evt_data; 37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse & report BTM_SP_KEYPRESS_EVT */ 37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.notif_type = *p; 37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_simple_pair_complete 37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when simple pairing process is 37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** complete 37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p) 37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_COMPLT evt_data; 37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN disc = FALSE; 37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = *p++; 37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL) 37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x", 37945738f83aeb59361a0a2eda2460113f6dc919427The 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], 37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]); 37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u", 38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); 38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_PAIRING_NOT_ALLOWED) 38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The test spec wants the peer device to get this failure code. */ 38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT); 38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the timer to 1 second */ 381678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(btm_cb.pairing_timer, BT_1SEC_TIMEOUT_MS, 381778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btm_sec_pairing_timeout, NULL, 381878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0) 38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop the timer */ 382378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(btm_cb.pairing_timer); 38245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the initiating side: will receive auth complete event. disconnect ACL at that time */ 38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let the pairing state stay active, p_auth_complete_callback will report the failure */ 38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc) 38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed */ 3845db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta /* Avoid sending disconnect on HCI_ERR_PEER_USER */ 3846db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) 3847db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 3848db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 3849db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_rem_oob_req 38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_REMOTE_OOB_DATA_REQUEST_EVT 38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p) 38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_RMT_OOB evt_data; 38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 c; 38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r; 38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 38745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 38765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 38775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) && 38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_sp_callback) 38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 388366209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach strlcpy((char *)evt_data.bd_name, (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN); 38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); 38865738f83aeb59361a0a2eda2460113f6dc919427The 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) 38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoteOobDataReply(TRUE, p_bda, c, r); 38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* something bad. we can only fail this connection */ 38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_bda); 38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_local_oob_complete 39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when read local oob data is 39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p) 39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_LOC_OOB evt_data; 39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = *p++; 39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39135344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status); 39145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 39175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.c, p); 39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.r, p); 39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_collision 39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when authentication or encryption 39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** needs to be retried at a later time. 39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle) 39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.collision_start_time) 3942c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov btm_cb.collision_start_time = time_get_os_boottime_ms(); 39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3944c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov if ((time_get_os_boottime_ms() - btm_cb.collision_start_time) < btm_cb.max_collision_delay) 39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle == BTM_SEC_INVALID_HANDLE) 39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL) 39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING); 39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev_by_handle (handle); 39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec != NULL) 39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state); 39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will restart authentication after timeout */ 39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = 0; 39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 396278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(btm_cb.sec_collision_timer, BT_1SEC_TIMEOUT_MS, 396378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btm_sec_collision_timeout, NULL, 396478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_complete 39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when authentication of the connection is 39745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status) 39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sm4; 39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN are_bonding = FALSE; 39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 39885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s", 39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status, 39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state, 39955738f83aeb59361a0a2eda2460113f6dc919427The 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], 39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d", 40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status); 40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection was made just to do bonding. If we authenticate 40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the connection that is up, this is the last event received. 40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec 40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 40225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) 40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* keep the old sm4 flag and clear the retry bit in control block */ 40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sm4 = p_dev_rec->sm4; 40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_RETRY; 40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project are_bonding = TRUE; 40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4041e11f228d1a18486cd00c36487812a763487a236fSrinu Jella if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 4042e11f228d1a18486cd00c36487812a763487a236fSrinu Jella && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 4043e11f228d1a18486cd00c36487812a763487a236fSrinu Jella btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) 40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (old_state != BTM_PAIR_STATE_IDLE) ) 40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be a race condition, when we are starting authentication and 40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the peer device is doing encryption. 40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If first we receive encryption change up, then initiated authentication 40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** can not be performed. According to the spec we can not do authentication 40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** on the encrypted link, so device is correct. 40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_COMMAND_DISALLOWED) 40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == 40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) 40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = HCI_SUCCESS; 40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Currently we do not notify user if it is a keyboard which connects */ 40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* User probably Disabled the keyboard while it was asleap. Let her try */ 40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 40725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report the suthentication status */ 40745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state != BTM_PAIR_STATE_IDLE) 40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (are_bonding) 40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 4088db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 4089db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) 4090db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 4091db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL"); 4095e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec)) 4096e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* no LE keys are available, do deriving */ 4097e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || 4098e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* or BR key is higher security than existing LE keys */ 4099e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && 4100e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) 4101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL"); 41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_is_master(p_dev_rec)) 4105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4106e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // Encryption is required to start SM over BR/EDR 4107e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // indicate that this is encryption after authentication 4108f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL, 0); 4109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 4112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4113e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If authentication failed, notify the waiting layer */ 41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 41195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((old_sm4 & BTM_SM4_RETRY) == 0) 41215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow retry only once */ 41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION) 41245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 41265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 41275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 41285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this retry for missing key is for Lisbon or later only. 41305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Legacy device do not need this. the controller will drive the retry automatically */ 41315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4)) 41325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 41355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 41365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 41375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* With BRCM controller, we do not need to delete the stored link key in controller. 41395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If the stack may sit on top of other controller, we may need this 41405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DeleteStoredLinkKey (bd_addr, NULL); */ 41415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_RETRY) 41445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_execute_procedure (p_dev_rec); 41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4161818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4162818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4163818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4164818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // If we have MITM protection we have a higher level of security than 4165818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // provided by 16 digits PIN 4166818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4167818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4168818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 41695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Authentication succeeded, execute the next security procedure, if any */ 41705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_execute_procedure (p_dev_rec); 41715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 41747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_encrypt_change 41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when encryption of the connection is 41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 41855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) 41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 4190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 41917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p_acl = NULL; 41927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 acl_idx = btm_handle_to_acl_index(handle); 4193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 41945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d", 41955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); 41965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 ); 41975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 41995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 4200e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || 4201e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 42025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && encr_enable) 42127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 4213818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->hci_handle == handle) { 42147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED); 4215818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4216818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4217818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4218818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4219818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4220818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 42217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 4222818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde { 42237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); 4224818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 42257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It is possible that we decrypted the link to perform role switch */ 42285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mark link not to be encrypted, so that when we execute security next time it will kick in again */ 42295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && !encr_enable) 42307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 42317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->hci_handle == handle) 42327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED; 42337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 42347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED; 42357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 42365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags ); 4238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 4240e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (acl_idx != MAX_L2CAP_LINKS) 42417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl = &btm_cb.acl_db[acl_idx]; 4242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4243efa5991fc7dc3b9b74b73966a4bf5cd5aad9f06aPavlin Radoslavov if (p_acl != NULL) 4244efa5991fc7dc3b9b74b73966a4bf5cd5aad9f06aPavlin Radoslavov btm_sec_check_pending_enc_req(p_dev_rec, p_acl->transport, encr_enable); 4245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 42467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_acl && p_acl->transport == BT_TRANSPORT_LE) 42475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4248e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE || 4249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) 4250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4251d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN); 4252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 4253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4254dea4f9b42fd373d8a46565d933ec49a6583a9117Satya Calloji btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable); 42555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4258e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 42595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BR/EDR connection, update the encryption key size to be 16 as always */ 42605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 16; 4261e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4263e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d", 4264e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, p_dev_rec->new_encryption_key_is_p256); 4265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle)) 4267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->new_encryption_key_is_p256) 4269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_use_smp_br_chnl(p_dev_rec) && 4271e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_sec_is_master(p_dev_rec) && 4272e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* if LE key is not known, do deriving */ 4273e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || 4274e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* or BR key is higher security than existing LE keys */ 4275e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) 4276e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) 4277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* BR/EDR is encrypted with LK that can be used to derive LE LTK */ 4279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->new_encryption_key_is_p256 = FALSE; 4280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4281e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec->no_smp_on_br) 4282e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4283e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__); 4284e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4285e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 4286e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4287e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__); 4288e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_BR_PairWith(p_dev_rec->bd_addr); 4289e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4293e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4294e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // BR/EDR is successfully encrypted. Correct LK type if needed 4295e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // (BR/EDR LK derived from LE LTK was used for encryption) 4296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((encr_enable == 1) && /* encryption is ON for SSP */ 4297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* LK type is for BR/EDR SC */ 4298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || 4299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) 4302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; 4303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ 4304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; 4305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type); 4307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_send_link_key_notif(p_dev_rec); 4308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else 4312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable); 4313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */ 43145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this encryption was started by peer do not need to do anything */ 43165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) 43175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) 43195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 43215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 43225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); 43235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 43285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If encryption setup failed, notify the waiting layer */ 43295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 43305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 43325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Encryption setup succeeded, execute the next security procedure, if any */ 43365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 43375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 43385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 43397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 43405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 43415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 43435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connect_after_reject_timeout 43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connection for bonding could not start because of the collision 43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Initiate outgoing connection 43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 435278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_connect_after_reject_timeout(UNUSED_ATTR void *data) 43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec; 43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTM_TRACE_EVENT("%s", __func__); 43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = 0; 43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 436178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTM_TRACE_WARNING("Security Manager: %s: failed to start connection", 436278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov __func__); 43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 43695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 43715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 43735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connected 43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establsihed 43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) 43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 43855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res; 43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_pairing_device = FALSE; 43875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p_acl_cb; 43887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 bit_shift = 0; 43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 43935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 43965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s", 43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5], 44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x ", 44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]); 44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record for new connection. Allocate one */ 44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4419bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella /* If the device matches with stored paring address 4420bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella * reset the paring state to idle */ 4421bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) && 4422bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0)) 4423bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella { 4424bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); 4425bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella } 4426bf3e67e76aa2e7eced6b28669f10b599c08ab931Srinu Jella 44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* can not find the device record and the status is error, 44285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * just ignore it */ 44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Update the timestamp for this device */ 44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 44367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0; 44377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell L2CAP it's a bonding connection. */ 44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming connection failed while pairing, then try to connect and continue */ 44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Motorola S9 disconnects without asking pin code */ 44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) 44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44505344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN"); 44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 44575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 445878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(btm_cb.sec_collision_timer, 0, 445978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btm_sec_connect_after_reject_timeout, 446078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov NULL, btu_general_alarm_queue); 44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 44657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR); 44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE); 44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always clear the pending flag */ 44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 44837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; 44847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 44857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 44875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) ) 44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection from bonding device */ 44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_HOST_REJECT_DEVICE) 44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) 44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x", 45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags, p_dev_rec->sm4); 45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; 45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 45045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 45065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 45077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR); 45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already have pin code */ 45125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 45135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 451778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(btm_cb.sec_collision_timer, 0, 451878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btm_sec_connect_after_reject_timeout, 451978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov NULL, btu_general_alarm_queue); 45205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait for incoming connection without resetting pairing state */ 45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (status == HCI_ERR_CONNECTION_EXISTS) 45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection"); 45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_pairing_device = TRUE; 45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 45355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if connection fails during pin request, notify application */ 45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection failed because of during pairing, need to tell user */ 45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_pairing_device) 45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift); 45455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required ); 45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 45485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* 45587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta Do not send authentication failure, if following conditions hold good 45597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1. BTM Sec Pairing state is idle 45607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2. Link key for the remote device is present. 45617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3. Remote is SSP capable. 45627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta */ 45637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) && 45647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((status == HCI_ERR_AUTH_FAILURE) || 45655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_KEY_MISSING) || 45665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_HOST_REJECT_SECURITY) || 45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_NOT_ALLOWED) || 45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_UNIT_KEY_USED) || 45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || 45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || 45717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (status == HCI_ERR_REPEATED_ATTEMPTS)))) 45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift); 45757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 45767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE 45777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If we rejected pairing, pass this special result code */ 45787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) 45797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 45807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta status = HCI_ERR_HOST_REJECT_SECURITY; 45817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 45827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 45835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 45855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT || 45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) 45957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE); 45965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 45977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 45985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If initiated dedicated bonding, return the link key now, and initiate disconnect */ 46035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If dedicated bonding, and we now have a link key, we are all done */ 46045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_pairing_device 46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) ) 46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remember flag before it is initialized */ 46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 46175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = TRUE; 46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 46195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = FALSE; 46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( res ) 46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let l2cap start bond timer */ 46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE); 46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role may not be correct here, it will be updated by l2cap, but we need to */ 46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* notify btm_acl that link is up, so starting of rmt name request will not */ 46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set paging flag up */ 46427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR); 46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_acl_cb) 46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */ 46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) 46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now there are a some devices that do not like sending */ 46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* commands events and data at the same time. */ 46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the packet types to the default allowed by the device */ 46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); 46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_def_link_policy) 46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); 46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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); 46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize security flags. We need to do that because some */ 46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization complete could have come after the connection is dropped */ 46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* and that would set wrong flag that link has been authorized already */ 46617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | 46627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift); 46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) 46657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift); 46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_LINK) 46687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift); 46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4670818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4671818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4672818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4673818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift); 4674818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4675818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_changed = FALSE; 46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* After connection is established we perform security if we do not know */ 46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the name, or if we are originator because some procedure can have */ 46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* been scheduled while connection was down */ 46815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator); 46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator) 46835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 46857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 46865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnect 46935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to disconnect HCI link 46955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns btm status 46975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason) 47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 47015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 47025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In some weird race condition we may not have a record */ 47045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 47055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_disconnect (handle, reason); 47075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are currently doing bonding. Link will be disconnected when done */ 47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_BUSY); 47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); 47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnected 47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dropped 47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason) 47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_pairing_flags = btm_cb.pairing_flags; 47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result = HCI_ERR_AUTH_FAILURE; 4738ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach tBTM_SEC_CALLBACK *p_callback = NULL; 47397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If page was delayed for disc complete, can do it now */ 47425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.discing = FALSE; 47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE; 47507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 4754db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_INFO(LOG_TAG, "%s clearing pending flag handle:%d reason:%d", __func__, handle, reason); 47555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 47565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 47575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear unused flags */ 47595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= BTM_SM4_TRUE; 47605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4761f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr; 4762f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x" 4763f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton " remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), 4764f8027005333c88a2f097cfd70d15c3d54c7764aeChris 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); 47655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4766f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags); 47675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 47695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)) 47715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 47735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 47745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the disconnection reason is REPEATED_ATTEMPTS, 47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project send this error message to complete callback function 47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project to display the error message of Repeated attempts. 47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project All others, send HCI_ERR_AUTH_FAILURE. */ 47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == HCI_ERR_REPEATED_ATTEMPTS) 47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_REPEATED_ATTEMPTS; 47835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 47855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_HOST_REJECT_SECURITY; 47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, result); 47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 479424adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS); 47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* see sec_flags processing in btm_acl_removed */ 47967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 47977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 47987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 47997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE; 48007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED); 480182c8b9270ba962d5f271a833a3454baddbc063aaNitin Arora p_dev_rec->enc_key_size = 0; 48027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 48037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 48045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 48057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 48067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE; 4807818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED 4808818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED); 48097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 4812444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) 4813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ? 4815444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; 4816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 4817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 48197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 48205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 4821ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4822ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_callback = p_dev_rec->p_callback; 4823ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4824ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach /* if security is pending, send callback to clean up the security state */ 4825ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach if(p_callback) 4826ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach { 4827ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before 4828ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach we do, this call back must be reset here */ 48297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING); 4830ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach } 4831ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4832f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags); 48335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 48345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 48365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_notification 48385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a new connection link key is 48405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generated 48415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 48435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 48455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type) 48465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 48475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 4848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN we_are_bonding = FALSE; 4849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ltk_derived_lk = FALSE; 48505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d", 48525738f83aeb59361a0a2eda2460113f6dc919427The 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], 48535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type); 48545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) && 4856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ltk_derived_lk = TRUE; 4859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key_type -= BTM_LTK_DERIVED_LKEY_OFFSET; 4860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 48615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 48625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) 48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 4868818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 4869818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde /* 4870818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * Until this point in time, we do not know if MITM was enabled, hence we 4871818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * add the extended security flag here. 4872818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde */ 4873818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4874818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4875818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4876818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4877818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4878818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 4879ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 4880ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* BR/EDR connection, update the encryption key size to be 16 as always */ 4881ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->enc_key_size = 16; 4882ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN); 48845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 48865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 48875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we_are_bonding = TRUE; 48905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 48915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 48925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* save LTK derived LK no matter what */ 4895444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (ltk_derived_lk) 4896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.api.p_link_key_callback) 4898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4899444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)", 4900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, p_dev_rec->link_key_type); 4901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, 4902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_bd_name, 4903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_link_key, p_dev_rec->link_key_type); 4904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) || 4909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4911e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->new_encryption_key_is_p256 = TRUE; 4912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d", 4913e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, p_dev_rec->new_encryption_key_is_p256); 4914444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4915444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 49175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If name is not known at this point delay calling callback until the name is */ 49185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* resolved. Unless it is a HID Device and we really need to send all link keys. */ 49195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 4920e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) 4921e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && !ltk_derived_lk) 49225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d", 4924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], 4925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_bda[4] << 8) + p_bda[5], key_type); 49265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = TRUE; 49285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it is for bonding nothing else will follow, so we need to start name resolution */ 49305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (we_are_bonding) 49315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0))) 49335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_rmt_name_failed(); 49345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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]) 49375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 49385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 49415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 49425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 4943e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE) 4944e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* for derived key, always send authentication callback for BR channel */ 4945e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun || ltk_derived_lk) 49465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will save link key only if the user authorized it - BTE report link key in all cases */ 49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE 49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) 49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 49585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4959e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (ltk_derived_lk) 4960e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4961e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("btm_sec_link_key_notification() LTK derived LK is saved already" 4962e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun " (key_type = %d)", p_dev_rec->link_key_type); 4963e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4964e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 4965e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4966e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, 4967e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->sec_bd_name, 4968e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_link_key, p_dev_rec->link_key_type); 4969e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 49815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 49835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda) 49845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 49855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 49865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 49885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 49895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4990b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && 4991b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (btm_cb.collision_start_time != 0) && 4992b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) ) 4993b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta { 4994b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req " 4995b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta "State: %d START_TIMEOUT : %d", 4996b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btm_cb.pairing_state, btm_cb.collision_start_time); 4997b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btsnd_hcic_link_key_neg_reply (p_bda); 4998b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta return; 4999b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta } 50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key); 50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (p_bda); 50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The link key is not in the database and it is not known to the manager */ 50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_neg_reply (p_bda); 50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 50125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 50145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pairing_timeout 50165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when host does not provide PIN 50185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** within requested time 50195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 50215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 502378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_pairing_timeout(UNUSED_ATTR void *data) 50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE) 50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_YES; 50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name[2]; 50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */ 50355738f83aeb59361a0a2eda2460113f6dc919427The 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. 50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_cb->pairing_bda); 50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 503978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTM_TRACE_EVENT ("%s State: %s Flags: %u", __func__, 50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags); 50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->pairing_state) 50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: 50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: 50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) 50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_cb->pairing_bda); 50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that no longer need the PIN */ 50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 50615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 50655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: 50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE); 50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: 50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); 50775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 50785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */ 50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: 50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req |= BTM_AUTH_DD_BOND; 50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, 50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_OOB_NONE, auth_req); 50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: 50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda); 50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: 50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed. Started a 1-sec timer at simple pairing complete. 50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * now it's time to tear down the ACL link*/ 50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 510078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTM_TRACE_ERROR("%s BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x", 510178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov __func__, 510278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3], 510378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]); 51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: 511105bb84c66dc4813b5da13a7d2db27e80fb613293Srinu Jella case BTM_PAIR_STATE_GET_REM_NAME: 51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that timeout has happened while waiting for authentication*/ 51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 513178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTM_TRACE_WARNING("%s not processed state: %s", __func__, 513278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btm_pair_state_descr(btm_cb.pairing_state)); 51335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pin_code_request 51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests PIN code 51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda) 51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x", 51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), 51545738f83aeb59361a0a2eda2460113f6dc919427The 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] ); 51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) && 51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) ) 51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51618ee098cd6bca17fc016dd3cc519dc5990be22429Andre Eisenbach btsnd_hcic_pin_code_neg_reply (p_bda); 51628ee098cd6bca17fc016dd3cc519dc5990be22429Andre Eisenbach return; 51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) 51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s", 51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state)); 51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (p_bda); 51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* received PIN code request. must be non-sm4 */ 51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 51795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN); 51815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD; 51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 51845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) 51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying"); 51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); 51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the connecting device's CoD for the connection */ 51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN)) 51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) ) 51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN); 51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We could have started connection after asking user for the PIN code */ 52015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len != 0) 52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply"); 52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code); 52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark that we forwarded received from the user PIN code */ 52075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We can change mode back right away, that other connection being established */ 52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is not forced to be secure - found a FW issue, so we can not do this 52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); */ 52125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If pairing disabled OR (no PIN callback and not bonding) */ 52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR we could not allocate entry in the database reject pairing request */ 52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cb->pairing_disabled 52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_cb->api.p_pin_callback == NULL) 52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR Microsoft keyboard can for some reason try to establish connection */ 52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the only thing we can do here is to shut it up. Normally we will be originator */ 52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for keyboard bonding */ 52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator 52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) ) 52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!", 52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); 52305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify upper layer of PIN request and start expiration timer */ 52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pin code request can not come at the same time as connection request */ 52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN); 52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); 52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the name is known */ 52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Even if name is not known we might not be able to get one */ 52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is the case when we are already getting something from the */ 52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* device, so HCI level is flow controlled */ 52455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Also cannot send remote name request while paging, i.e. connection is not completed */ 52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback"); 52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 5251818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_cb->api.p_pin_callback) { 5252818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 5253818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (p_dev_rec->p_cur_service == NULL) ? FALSE 5254818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags 5255818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 5256818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 52595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name"); 52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We received PIN code request for the device with unknown name */ 52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* it is not user friendly just to ask for the PIN without name */ 52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try to get name at first */ 52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr, 52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_PAGE_SCAN_REP_MODE_R1, 52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_MANDATARY_PAGE_SCAN_MODE, 0)) 52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 'f'; 52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[1] = '0'; 52725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback"); 52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->api.p_pin_callback) 5276818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, 5277818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE 5278818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags 5279818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 52885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_update_clock_offset 52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to update clock offset 52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset) 52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL) 53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL) 53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************** 53135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C F U N C T I O N S 53145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/ 53155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 53175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_execute_procedure 53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start required security 53215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedure. There is a case when multiplexing protocol 53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calls this function on the originating side, connection to 53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer will not be established. This function in this 53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** case performs only authorization. 53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - permission is granted 53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED - in process 53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES - permission declined 53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) 53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 53335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d", 53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); 53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is a chance that we are getting name. Wait until done. */ 53375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != 0) 53385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any security is required, get the name first */ 53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start get name"); 53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_get_name (p_dev_rec)) 53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authenticated and authentication is required */ 53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authentication and return PENDING to the caller */ 5354818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 5356818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))) 5357818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) 5358818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (!p_dev_rec->is_originator 5359818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) 53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5362818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde /* 5363818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use, 5364818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the 5365818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM 5366818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * authenticated connections, hence we cannot distinguish here. 5367818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde */ 5368818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 53725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 53735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authentication"); 53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5377818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde /* 5378818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * If we do have a link-key, but we end up here because we need an 5379818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * upgrade, then clear the link-key known and authenticated flag before 5380818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * restarting authentication. 5381818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * WARNING: If the controller has link-key, it is optional and 5382818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * recommended for the controller to send a Link_Key_Request. 5383818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * In case we need an upgrade, the only alternative would be to delete 5384818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * the existing link-key. That could lead to very bad user experience 5385818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * or even IOP issues, if a reconnect causes a new connection that 5386818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * requires an upgrade. 5387818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde */ 5388818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 5389818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) 5390818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (!p_dev_rec->is_originator && (p_dev_rec->security_required 5391818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) { 5392818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED 5393818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_AUTHENTICATED); 5394818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 5395818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not encrypted and encryption is required */ 54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start encryption and return PENDING to the caller */ 54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 54065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) 54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) 54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start encryption"); 54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_encryption (p_dev_rec)) 54195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 54215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 5426899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 5427899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 5428899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -", 5429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "security failure", __FUNCTION__, p_dev_rec->link_key_type); 5430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_FAILED_ON_SECURITY); 5431899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 5432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 54335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authorized and authorization is required */ 54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authorization and return PENDING to the caller */ 54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) 54375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) 54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("service id:%d, is trusted:%d", 54405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id, 54415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 54425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id))); 54435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) && 54445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && 54455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 54465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id) == FALSE)) 54475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authorization"); 54495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_start_authorization (p_dev_rec)); 54505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All required security procedures already established */ 54545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE | 54555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE | 54565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT | 54575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | 54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]); 54615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: access granted"); 54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_get_name 54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start get name procedure 54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec) 54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tempstate = p_dev_rec->sec_state; 54785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME; 54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Device should be connected, no need to provide correct page params */ 54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 0 and NULL are as timeout and callback params because they are not used in security get name case */ 54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC, 54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != BTM_CMD_STARTED) 54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = tempstate; 54875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 54885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 54915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 54925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 54945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authentication 54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authentication 54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec) 55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btsnd_hcic_auth_request (p_dev_rec->hci_handle)); 55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_encryption 55125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start encryption 55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec) 55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE)) 55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 55225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 55245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 55255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authorization 55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authorization 55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec) 55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result; 55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_service_name = NULL; 55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 service_id; 55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) 55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.api.p_authorize_callback) 55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_cur_service) 55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->is_originator) 55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->orig_service_name; 55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->term_service_name; 55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = p_dev_rec->p_cur_service->service_id; 55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = 0; 55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send authorization request if not already sent during this service connection */ 5562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 5563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != service_id) 5564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 5565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING; 5566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr, 55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, 55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name, 55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, 55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator); 5572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else /* Already authorized once for this L2CAP bringup */ 5575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 55765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id); 5577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BTM_SUCCESS); 5578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BTM_SUCCESS) 55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; 5583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Save the currently authorized service in case we are asked again by another multiplexer layer */ 5585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_dev_rec->is_originator) 5586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = service_id; 5587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(result); 55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_start_get_name (p_dev_rec); 55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_are_all_trusted 55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called check if all services are trusted 56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if all are trusted, otherwise FALSE 56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]) 56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT32 trusted_inx; 56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++) 56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) 56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_first_serv 56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the first record in the service database 56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5627ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin KochartBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm) 56285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 56305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_ORIG_MASK ) 56365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 56375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 56385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 56395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 56405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 56415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 56425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) 56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the PSM matches p_out_serv, 56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 56475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 56485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, just find the first record with the specified PSM */ 56515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) ) 56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_next_serv 56625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the next record in the service database 56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur) 56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == p_cur->psm) ) 56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cur != p_serv_rec) 56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_mx_serv 56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the service database with specified 56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PSM and multiplexor channel information 56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id) 57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv; 57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5705444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s()", __func__); 57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && p_out_serv && p_out_serv->psm == psm 57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->mx_proto_id == mx_proto_id 57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->orig_mx_chan_id == mx_chan_id) 57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the parameters match p_out_serv, 57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, the old way */ 57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == psm) 57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->mx_proto_id == mx_proto_id) 57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) 57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_collision_timeout 57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Encryption could not start because of the collision 57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** try to do it again 57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 574078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btm_sec_collision_timeout(UNUSED_ATTR void *data) 57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5742444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s()", __func__); 57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5744444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec); 57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 57507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE); 57515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec) 57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, p_dev_rec->link_key, 57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type); 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** Function BTM_ReadTrustedMask 57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get trusted mask for the peer device 57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL, if the device record is not found. 57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the trusted mask 57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr) 57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5785444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 5786444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL) 57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec->trusted_mask); 5788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return NULL; 57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_restore_mode 57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the security mode to previous setting 57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if it was changed during bonding. 57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void) 58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed) 58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = FALSE; 5807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK)); 58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK)); 58095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_type_changed) 58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = FALSE; 58145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type); 58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5818cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 5819cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowskibool is_sec_state_equal(void *data, void *context) 5820cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski{ 5821cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = data; 5822cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski UINT8 *state = context; 5823cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 5824cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (p_dev_rec->sec_state == *state) 5825cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return false; 5826cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 5827cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return true; 5828cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski} 5829cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski 58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_dev_by_sec_state 58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the device 58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** which is being authenticated or encrypted 58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state) 58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5842cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski list_node_t *n = list_foreach(btm_cb.sec_dev_rec, is_sec_state_equal, &state); 5843cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski if (n) 5844cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return list_node(n); 58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5846cac784d772db7f42dc93acafb18e5d71617c04f3Jakub Pawlowski return NULL; 58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_change_pairing_state 58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to change pairing state 58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) 58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state)); 5861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() New: %s pairing_flags:0x%x", __func__, 5862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_pair_state_descr(new_state), btm_cb.pairing_flags); 58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_state = new_state; 58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_state == BTM_PAIR_STATE_IDLE) 58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 586878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(btm_cb.pairing_timer); 58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = 0; 58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the the lcb shows we are not bonding */ 58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE); 58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 58775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_clear_ssp(); 58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN); 58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 588478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* If transitioning out of idle, mark the lcb as bonding */ 58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state == BTM_PAIR_STATE_IDLE) 58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE); 58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 588878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(btm_cb.pairing_timer, 588978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTM_SEC_TIMEOUT_VALUE * 1000, 589078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btm_sec_pairing_timeout, NULL, 589178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_pair_state_descr 58985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 59035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state) 59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_IDLE: return("IDLE"); 59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_GET_REM_NAME: return("GET_REM_NAME"); 59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: return("WAIT_PIN_REQ"); 59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: return("WAIT_LOCAL_PIN"); 59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: return("WAIT_NUM_CONFIRM"); 59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: return("KEY_ENTRY"); 59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: return("WAIT_LOCAL_OOB_RSP"); 59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: return("WAIT_LOCAL_IOCAPS"); 59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_INCOMING_SSP: return("INCOMING_SSP"); 59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: return("WAIT_AUTH_COMPLETE"); 59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: return("WAIT_DISCONNECT"); 59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return("???"); 59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5923104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer sprintf(btm_cb.state_temp_buffer,"%hhu",state); 59245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_cb.state_temp_buffer); 59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_rec_cback_event 59335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function calls the callback function with the given 59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** result and clear the callback function. 59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 594032429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport) 59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback = p_dev_rec->p_callback; 59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_callback) 59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 5947e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 59481287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE 5949e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (is_le_transport) 5950e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res); 5951e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 59521287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif 5953e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res); 59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_queue_mx_request 59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5970abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY)); 59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59725fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->psm = psm; 59735fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->is_orig = is_orig; 59745fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->p_callback = p_callback; 59755fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->p_ref_data = p_ref_data; 59765fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->mx_proto_id = mx_proto_id; 59775fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->mx_chan_id = mx_chan_id; 59785fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->transport = BT_TRANSPORT_BR_EDR; 59795fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->sec_act = 0; 59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN); 59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59835fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BTM_TRACE_EVENT("%s() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u", 59845fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov __func__, psm, is_orig, mx_proto_id, mx_chan_id); 59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59865fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov fixed_queue_enqueue(btm_cb.sec_pending_q, p_e); 59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59885fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov return TRUE; 59895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec) 59925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK); 59945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK); 59955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN rv = FALSE; 59965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((major == BTM_COD_MAJOR_AUDIO) 59985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) ) 59995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", 6001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, major, minor); 60025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed == FALSE) 60045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 60065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 60095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 60105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 60135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 60155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we got a PIN, use that, else try to get one */ 60175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len) 60185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60195738f83aeb59361a0a2eda2460113f6dc919427The 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); 60205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 60225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pin was not supplied - pre-fetch pin code now */ 60245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) 60255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s() PIN code callback called", __func__); 60277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) 60285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 6029818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 6030818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE 6031818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags 6032818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 60335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rv = TRUE; 60375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rv; 60405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6043444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_auth_payload_tout 6045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description Processes the HCI Autheniticated Payload Timeout Event 6047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** indicating that a packet containing a valid MIC on the 6048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** connection handle was not received within the programmed 6049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** timeout value. (Spec Default is 30 secs, but can be 6050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** changed via the BTM_SecSetAuthPayloadTimeout() function. 6051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6053444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len) 6054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6055444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 handle; 6056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16 (handle, p); 6058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji handle = HCID_GET_HANDLE (handle); 6059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Will be exposed to upper layers in the future if/when determined necessary */ 6061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle); 6062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_queue_encrypt_request 6067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description encqueue encryption request when device has active security 6069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** process pending. 6070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, 6073f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach tBTM_SEC_CALLBACK *p_callback, void *p_ref_data, 6074f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach tBTM_BLE_SEC_ACT sec_act) 6075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 60765fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTM_SEC_QUEUE_ENTRY *p_e = 60775fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBTM_SEC_QUEUE_ENTRY *)osi_malloc(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1); 6078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 60795fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->psm = 0; /* if PSM 0, encryption request */ 60805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->p_callback = p_callback; 60815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->p_ref_data = p_ref_data; 60825fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->transport = transport; 60835fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_e->sec_act = sec_act; 60845fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN); 60855fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov fixed_queue_enqueue(btm_cb.sec_pending_q, p_e); 6086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 60875fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov return TRUE; 6088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6092899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_set_peer_sec_caps 6093899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6094899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to set sm4 and rmt_sec_caps fields 6095899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** based on the available peer device features. 6096899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6097899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns void 6098899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6099899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6100899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec) 6101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BD_ADDR rem_bd_addr; 6103899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth UINT8 *p_rem_bd_addr; 6104899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6105899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 6106899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 6107899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) && 6108899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])) 6109899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6110899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 = BTM_SM4_TRUE; 6111899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections = 6112899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])); 6113899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6114899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 6115899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6116899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 = BTM_SM4_KNOWN; 6117899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections = FALSE; 6118899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6119899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6120899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__, 6121899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections); 6122899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6123899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->remote_features_needed) 6124899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6125899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!", 6126899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__); 6127899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_rem_bd_addr = (UINT8*) rem_bd_addr; 6128899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr); 6129899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_rem_bd_addr = (UINT8*) rem_bd_addr; 6130899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_io_capabilities_req(p_rem_bd_addr); 6131899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_features_needed = FALSE; 6132899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6133899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6134899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6135899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6136899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6137899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_is_serv_level0 6138899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6139899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if the service corresponding 6140899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** to PSM is security mode 4 level 0 service. 6141899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6142899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if the service is security mode 4 level 0 service 6143899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6144899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6145899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm) 6146899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6147899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (psm == BT_PSM_SDP) 6148899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6149899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm); 6150899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return TRUE; 6151899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6152899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return FALSE; 6153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_check_pending_enc_req 6158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to send pending encryption callback if 6160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** waiting 6161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 6163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, 6166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 encr_enable) 6167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6168577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov if (fixed_queue_is_empty(btm_cb.sec_pending_q)) 6169577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov return; 6170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6171577862e0d87891164a469afcecd1135bf04d1f6ePavlin Radoslavov UINT8 res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING; 61721a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov list_t *list = fixed_queue_get_list(btm_cb.sec_pending_q); 61731a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov for (const list_node_t *node = list_begin(list); node != list_end(list); ) { 61741a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)list_node(node); 61751a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov node = list_next(node); 6176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0 6178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji && p_e->transport == transport 6180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR 6184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6185f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach || p_e->sec_act == BTM_BLE_SEC_ENCRYPT 6186f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach || p_e->sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM 6187f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach || (p_e->sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags 6188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji & BTM_SEC_LE_AUTHENTICATED) 6189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6192f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach if (p_e->p_callback) 6193f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res); 6194f40b136e7b943d7e25224817fc47bb5b171479d5Andre Eisenbach fixed_queue_try_remove_from_queue(btm_cb.sec_pending_q, (void *)p_e); 6195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_set_serv_level4_flags 6203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to set security mode 4 level 4 flags. 6205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns service security requirements updated to include secure 6207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** connections only mode. 6208899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6209899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6210899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator) 6211899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6212899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth UINT16 sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS; 6213899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6214899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return cur_security | sec_level4_flags; 6215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 62175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 62185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clear_ble_keys 62205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to clear out the BLE keys. 62225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically when devices are removed in BTM_SecDeleteDevice, 62235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or when a new BT Link key is generated. 62245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 62265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 62285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec) 62295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 62305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__); 62325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 6233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 62345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS)); 6235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 6237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_resolving_list_remove_dev(p_dev_rec); 6238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 62395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 62405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 62415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 62435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_is_a_bonded_dev 62455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Is the specified device is a bonded device 62475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - dev is bonded 62495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 62505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 62515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda) 62525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 62535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 62555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_bonded= FALSE; 62565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec && 62581287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE) 62597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))|| 62601287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else 62611287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach ( 62627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 62637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) 62645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_bonded = TRUE; 62665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded); 62685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(is_bonded); 62695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 62705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 62725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6273ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_le_capable_dev 6274ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Is the specified device is dual mode or LE only device 6276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE - dev is a dual mode 6278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 6280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda) 6281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 6282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 6283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN le_capable = FALSE; 6284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE) 6286e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE) 6287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta le_capable = TRUE; 6288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 6289ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return le_capable; 6290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 6291ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6292ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 6293ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_use_smp_br_chnl 6295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function checks if SMP BR connection can be used with 6297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the peer. 6298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Is called when authentication for dedicated bonding is 6299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** successfully completed. 6300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE - if SMP BR connection can be used (the link key is 6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** generated from P-256 and the peer supports Security 6303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Manager over BR). 6304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec) 6307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT32 ext_feat; 6309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE]; 6310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__, 6312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type); 6313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) && 6315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 6316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask)) 6319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) 6322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 6325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_is_master 6330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function checks if the device is BR/EDR master after 6332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** pairing is completed. 6333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE - if the device is master. 6335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec) 6338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); 6340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return (p && (p->link_role == BTM_ROLE_MASTER)); 6341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6343