btm_sec.c revision 818d0f2afb10c75125b0df9ea2bce6108268a269
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions for the Bluetooth Security Manager 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#define LOG_TAG "bt_btm_sec" 2644802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati 27899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#include <stdarg.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 2930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h" 3179ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 365cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 3744802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE && BT_TRACE_VERBOSE == FALSE) 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* needed for sprintf() */ 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "gatt_int.h" 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#define BTM_SEC_MAX_COLLISION_DELAY (5000) 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN (APPL_AUTH_WRITE_EXCEPTION)(BD_ADDR bd_addr); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 546975b4d711142b885af479721cada448952c6b41Andre Eisenbach 556975b4d711142b885af479721cada448952c6b41Andre Eisenbach/******************************************************************************** 566975b4d711142b885af479721cada448952c6b41Andre Eisenbach** L O C A L F U N C T I O N P R O T O T Y P E S * 576975b4d711142b885af479721cada448952c6b41Andre Eisenbach*********************************************************************************/ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (BOOLEAN is_originator, UINT16 psm); 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle); 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void); 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state); 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_check_pending_reqs(void); 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec); 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle); 907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT8 btm_sec_start_role_switch (tBTM_SEC_DEV_REC *p_dev_rec); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level ( CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id); 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated(tBTM_SEC_DEV_REC *p_dev_rec); 987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted(tBTM_SEC_DEV_REC *p_dev_rec); 997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized(tBTM_SEC_DEV_REC *p_dev_rec); 1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec); 101899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0 (UINT16 psm); 102899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags (UINT16 cur_security, BOOLEAN is_originator); 1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, 105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_CALLBACK *p_callback, void *p_ref_data); 106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport) ; 107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, 108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 encr_enable); 109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_acceptor_rejects_bonding (tBTM_SEC_DEV_REC *p_dev_rec); 110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec); 112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec); 1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE - authenticated link key is possible */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const BOOLEAN btm_sec_io_map [BTM_IO_CAP_MAX][BTM_IO_CAP_MAX] = 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OUT, IO, IN, NONE */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* OUT */ {FALSE, FALSE, TRUE, FALSE}, 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IO */ {FALSE, TRUE, TRUE, FALSE}, 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* IN */ {TRUE, TRUE, TRUE, FALSE}, 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* NONE */ {FALSE, FALSE, FALSE, FALSE} 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_OUT 0 DisplayOnly */ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IO 1 DisplayYesNo */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_IN 2 KeyboardOnly */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTM_IO_CAP_NONE 3 NoInputNoOutput */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authenticated 1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authenticated 1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authenticated (tBTM_SEC_DEV_REC *p_dev_rec) 1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED) 1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_encrypted 1497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is encrypted 1517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_encrypted (tBTM_SEC_DEV_REC *p_dev_rec) 1567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_dev_authorized 1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check device is authorized 1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_dev_authorized (tBTM_SEC_DEV_REC *p_dev_rec) 1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 184818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Function btm_dev_16_digit_authenticated 185818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 186818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Description check device is authenticated by using 16 digit pin or MITM 187818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 188818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** Returns BOOLEAN TRUE or FALSE 189818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 190818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde*******************************************************************************/ 191818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bondestatic BOOLEAN btm_dev_16_digit_authenticated(tBTM_SEC_DEV_REC *p_dev_rec) 192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde{ 193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // BTM_SEC_16_DIGIT_PIN_AUTHED is set if MITM or 16 digit pin is used 194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) 195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde { 196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde return(TRUE); 197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde return(FALSE); 199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde} 200818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde/******************************************************************************* 202818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde** 2037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_serv_trusted 2047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description check service is trusted 2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE 2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic BOOLEAN btm_serv_trusted(tBTM_SEC_DEV_REC *p_dev_rec, tBTM_SEC_SERV_REC *p_serv_rec) 2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, p_serv_rec->service_id)) 2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecRegister 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Application manager calls this function to register for 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security services. There can be one and only one application 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** saving link keys. BTM allows only first registration. 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 230f8027005333c88a2f097cfd70d15c3d54c7764aeChris MantonBOOLEAN BTM_SecRegister(tBTM_APPL_INFO *p_cb_info) 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 temp_value = {0}; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 236f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s application registered", __func__); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 239f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton LOG_INFO("%s p_cb_info->p_le_callback == 0x%p", __func__, p_cb_info->p_le_callback); 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb_info->p_le_callback) 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 242f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#if SMP_INCLUDED == TRUE 243f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s SMP_Register( btm_proc_smp_cback )", __func__); 244f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton SMP_Register(btm_proc_smp_cback); 245f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton#endif 246f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton /* if no IR is loaded, need to regenerate all the keys */ 247f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton if (memcmp(btm_cb.devcb.id_keys.ir, &temp_value, sizeof(BT_OCTET16)) == 0) 248f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton { 249f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton btm_ble_reset_id(); 250f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton } 251f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton } 252f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton else 253f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton { 254f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton LOG_WARN("%s p_cb_info->p_le_callback == NULL", __func__); 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api = *p_cb_info; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 260f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton LOG_INFO("%s btm_cb.api.p_le_callback = 0x%p ", __func__, btm_cb.api.p_le_callback); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 262f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s application registered", __func__); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 268877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Function BTM_SecRegisterLinkKeyNotificationCallback 269877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 270877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Description Application manager calls this function to register for 271877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** link key notification. When there is nobody registered 272877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** we should avoid changing link key 273877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 274877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** Returns TRUE if registered OK, else FALSE 275877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 276877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji*******************************************************************************/ 277877123f5b9df90e7a71ea7b15997c521229decc1Satya CallojiBOOLEAN BTM_SecRegisterLinkKeyNotificationCallback (tBTM_LINK_KEY_CALLBACK *p_callback) 278877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji{ 279877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji btm_cb.api.p_link_key_callback = p_callback; 280877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji return TRUE; 281877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji} 282877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji 283877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji/******************************************************************************* 284877123f5b9df90e7a71ea7b15997c521229decc1Satya Calloji** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecAddRmtNameNotifyCallback 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can register to be notified when name of the 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** remote device is resolved. 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecAddRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == NULL) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = p_callback; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecDeleteRmtNameNotifyCallback 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Any profile can deregister notification when a new Link Key 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is generated per connection. 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if OK, else FALSE 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SecDeleteRmtNameNotifyCallback (tBTM_RMT_NAME_CALLBACK *p_callback) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.p_rmt_name_callback[i] == p_callback) 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_rmt_name_callback[i] = NULL; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_GetSecurityFlags 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get security flags for the device 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN TRUE or FALSE is device found 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_GetSecurityFlags (BD_ADDR bd_addr, UINT8 * p_sec_flags) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(TRUE); 3537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 3545344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(FALSE); 3567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 3597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_GetSecurityFlagsByTransport 3617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description Get security flags for the device on a particular transport 3637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns BOOLEAN TRUE or FALSE is device found 3657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 3667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 3677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN BTM_GetSecurityFlagsByTransport (BD_ADDR bd_addr, UINT8 * p_sec_flags, 3687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport) 3697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 3707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 3717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 3737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 3747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_BR_EDR) 3757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) p_dev_rec->sec_flags; 3767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 3777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta *p_sec_flags = (UINT8) (p_dev_rec->sec_flags >> 8); 3787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_GetSecurityFlags false"); 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPinType 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set PIN type for the device. 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPinType (UINT8 pin_type, PIN_CODE pin_code, UINT8 pin_code_len) 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPinType: pin type %d [variable-0, fixed-1], code %s, length %d", 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pin_type, (char *) pin_code, pin_code_len); 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If device is not up security mode will be set as a part of startup */ 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.cfg.pin_type != pin_type) 40130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson && controller_get_interface()->get_is_ready() ) 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (pin_type); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_type = pin_type; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.cfg.pin_code_len = pin_code_len; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.cfg.pin_code, pin_code, pin_code_len); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetPairableMode 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enable or disable pairing 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters allow_pairing - (TRUE or FALSE) whether or not the device 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allows pairing. 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connect_only_paired - (TRUE or FALSE) whether or not to 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** only allow paired devices to connect. 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetPairableMode (BOOLEAN allow_pairing, BOOLEAN connect_only_paired) 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SetPairableMode() allow_pairing: %u connect_only_paired: %u", allow_pairing, connect_only_paired); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_disabled = !allow_pairing; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.connect_only_paired = connect_only_paired; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_SetSecureConnectionsOnly 436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description Enable or disable default treatment for Mode 4 Level 0 services 438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 439899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameter secure_connections_only_mode - (TRUE or FALSE) whether or not the device 440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** TRUE means that the device should treat Mode 4 Level 0 services as 441899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** services of other levels. (Secure_connections_only_mode) 442899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** FALSE means that the device should provide default treatment for 443899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Mode 4 Level 0 services. 444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 445899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns void 446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid BTM_SetSecureConnectionsOnly (BOOLEAN secure_connections_only_mode) 449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 450899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_API("%s: Mode : %u", __FUNCTION__, 451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth secure_connections_only_mode); 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.devcb.secure_connections_only = secure_connections_only_mode; 454899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_NO_AVAIL_SEC_SERVICES ((UINT16) 0xffff) 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetSecurityLevel 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: is_originator - TRUE if originating the connection, FALSE if not 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_SetSecurityLevel (BOOLEAN is_originator, char *p_name, UINT8 service_id, 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type; 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_ORIG; 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project conn_type = CONN_ORIENT_TERM; 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (conn_type, p_name, service_id, 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_set_security_level (is_originator, p_name, service_id, 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level, psm, mx_proto_id, mx_chan_id)); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_set_security_level 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Register service security level with Security Manager 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: conn_type - TRUE if originating the connection, FALSE if not 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_name - Name of the service relevant only if 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** authorization will show this name to user. ignored 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if BTM_SEC_SERVICE_NAME_LEN is 0. 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_id - service ID for the service passed to authorization callback 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sec_level - bit mask of the security features 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of multiplexing proto below 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - channel ID of multiplexing proto below 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if registered OK, else FALSE 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_set_security_level (CONNECTION_TYPE conn_type, char *p_name, UINT8 service_id, 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sec_level, UINT16 psm, UINT32 mx_proto_id, 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_chan_id) 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec; 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 index; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 first_unused_record = BTM_NO_AVAIL_SEC_SERVICES; 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN record_allocated = FALSE; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_ucd; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = TRUE; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_ucd = FALSE; 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 544818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde BTM_TRACE_API("%s : sec: 0x%x", __func__, sec_level); 545818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if the record can be reused (same service name, psm, mx_proto_id, 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, and mx_chan_id), or obtain the next unused record */ 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[0]; 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < BTM_SEC_MAX_SERVICE_RECORDS; index++, p_srec++) 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if there is already a record for this service */ 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->security_flags & BTM_SEC_IN_USE) 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id && 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!strncmp (p_name, (char *) p_srec->orig_service_name, 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN) || 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !strncmp (p_name, (char *) p_srec->term_service_name, 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_SERVICE_NAME_LEN))) 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_srec->psm == psm && 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id == mx_proto_id && 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id == p_srec->service_id) 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark the first available service record */ 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!record_allocated) 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (p_srec, 0, sizeof(tBTM_SEC_SERV_REC)); 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project record_allocated = TRUE; 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project first_unused_record = index; 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!record_allocated) 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SEC_REG: Out of Service Records (%d)", BTM_SEC_MAX_SERVICE_RECORDS); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process the request if service record is valid */ 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If a duplicate service wasn't found, use the first available */ 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (index >= BTM_SEC_MAX_SERVICE_RECORDS) 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = first_unused_record; 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec = &btm_cb.sec_serv_rec[index]; 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->psm = psm; 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->service_id = service_id; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->mx_proto_id = mx_proto_id; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->orig_mx_chan_id = mx_chan_id; 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_srec->orig_service_name, sizeof(p_srec->orig_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM | 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Originator should not set requirements for incoming connections */ 625818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde sec_level &= ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE 626818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_IN_MITM | BTM_SEC_IN_MIN_16_DIGIT_PIN ); 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_AUTHENTICATE) 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_MITM; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_OUT_ENCRYPT) 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_OUT_AUTHENTICATE; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* outgoing connections usually set the security level right before 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the connection is initiated. 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * set it to be the outgoing service */ 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd == FALSE ) 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_srec; 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->term_mx_chan_id = mx_chan_id; 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_srec->term_service_name, sizeof(p_srec->term_service_name), p_name, BTM_SEC_SERVICE_NAME_LEN); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear out the old setting, just in case it exists */ 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags &= 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 662818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE 663818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_IN_MIN_16_DIGIT_PIN); 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags &= 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ~(BTM_SEC_IN_AUTHORIZE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_MITM | 670818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE 671818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_IN_MIN_16_DIGIT_PIN); 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Parameter validation. Acceptor should not set requirements for outgoing connections */ 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_MITM); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 677899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 678899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_AUTHENTICATE) 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_MITM; 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the authenticate bit is set, when encrypt bit is set */ 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sec_level & BTM_SEC_IN_ENCRYPT) 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sec_level |= BTM_SEC_IN_AUTHENTICATE; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_ucd ) 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(BTM_SEC_IN_USE); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, conn_type 0x%x, psm 0x%04x, proto_id %d, chan_id %d", 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, conn_type, psm, mx_proto_id, mx_chan_id); 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : security_flags: 0x%04x, ucd_security_flags: 0x%04x", 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_srec->ucd_security_flags); 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 7085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : service name [%s] (up to %d chars saved)", 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_name, BTM_SEC_SERVICE_NAME_LEN); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags |= (UINT16)(sec_level | BTM_SEC_IN_USE); 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_REG[%d]: id %d, is_orig %d, psm 0x%04x, proto_id %d, chan_id %d", 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index, service_id, is_originator, psm, mx_proto_id, mx_chan_id); 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 7185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API(" : sec: 0x%x, service name [%s] (up to %d chars saved)", 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags, p_name, BTM_SEC_SERVICE_NAME_LEN); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(record_allocated); 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecClrService 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record(s) from the security database. 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified name are removed. 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used only by devices with limited RAM so that it can 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** reuse an old security service record. 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: Unpredictable results may occur if a service is cleared 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that is still in use by an application/profile. 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_SecClrService (UINT8 service_id) 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm != BT_PSM_SDP) && 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (!service_id || (service_id == p_srec->service_id))) 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7575344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d", i, service_id); 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->ucd_security_flags = 0; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clr_service_by_psm 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Removes specified service record from the security database. 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** All service records with the specified psm are removed. 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically used by L2CAP to free up the service record used 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by dynamic PSM clients when the channel is closed. 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The given psm must be a virtual psm. 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters Service ID - Id of the service to remove. ('0' removes all service 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** records (except SDP). 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of records that were freed. 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 btm_sec_clr_service_by_psm (UINT16 psm) 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_srec = &btm_cb.sec_serv_rec[0]; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_freed = 0; 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_srec++) 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Delete services with specified name (if in use and not SDP) */ 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_srec->security_flags & BTM_SEC_IN_USE) && (p_srec->psm == psm) ) 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SEC_CLR[%d]: id %d ", i, p_srec->service_id); 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srec->security_flags = 0; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_freed++; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("btm_sec_clr_service_by_psm psm:0x%x num_freed:%d", psm, num_freed); 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(num_freed); 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_clr_temp_auth_service 809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Removes specified device record's temporary authorization 811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** flag from the security database. 812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters Device address to be cleared 814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void. 816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_sec_clr_temp_auth_service (BD_ADDR bda) 819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec; 821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_dev_rec = btm_find_dev (bda)) == NULL) 823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 8245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_clr_temp_auth_service() - no dev CB"); 825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Reset the temporary authorized flag so that next time (untrusted) service is accessed autorization will take place */ 829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id != BTM_SEC_NO_LAST_SERVICE_ID && p_dev_rec->p_cur_service) 830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 8315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_clr_auth_service_by_psm [clearing device: %02x:%02x:%02x:%02x:%02x:%02x]", 832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]); 833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = BTM_SEC_NO_LAST_SERVICE_ID; 835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PINCodeReply 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called after Security Manager submitted 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PIN code request to the UI. 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device for which PIN was requested 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** res - result of the operation BTM_SUCCESS if success 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PINCodeReply (BD_ADDR bd_addr, UINT8 res, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PINCodeReply(): PairState: %s PairFlags: 0x%02x PinLen:%d Result:%d", 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), btm_cb.pairing_flags, pin_len, res); 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8625344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply() - Wrong State: %d", btm_cb.pairing_state); 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - Wrong BD Addr"); 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8745344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_PINCodeReply() - no dev CB"); 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (pin_len > PIN_CODE_LEN) || (pin_len == 0) || (p_pin == NULL) ) 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer started dd OR we started dd and pre-fetch pin was not used send negative reply */ 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) || 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) ) 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (bd_addr); 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 904818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (pin_len >= 16) { 905818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 906818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.security_mode_changed == FALSE) ) 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is start of the dedicated bonding if local device is 2.0 */ 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 914818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->pin_code_length = pin_len; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = 0xff ; 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): waiting HCI_Connection_Complete after rejected incoming connection"); 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we change state little bit early so btm_sec_connected() will originate connection */ 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* when existing ACL link is down completely */ 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already accepted incoming connection from pairing device */ 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("BTM_PINCodeReply(): link is connecting so wait pin code request from peer"); 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_AUTH_FAILURE); 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 9565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT("BTM_PINCodeReply(): Saving pin_len: %d btm_cb.pin_code_len: %d", pin_len, btm_cb.pin_code_len); 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if this was not pre-fetched, save the PIN */ 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len == 0) 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, pin_len); 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = pin_len; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (bd_addr, pin_len, p_pin); 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function btm_sec_bond_by_transport 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description this is the bond function that will start either SSP or SMP. 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device to bond 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** pin_len - length in bytes of the PIN Code 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_pin - pointer to array with the PIN Code 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** trusted_mask - bitwise OR of trusted services (array of UINT32) 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Note: After 2.1 parameters are not used and preserved here not to change API 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS btm_sec_bond_by_transport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 9797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 9833aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 *p_features; 9843aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach UINT8 ii; 9857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p= btm_bda_to_acl(bd_addr, transport); 9865344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("btm_sec_bond_by_transport BDA: %02x:%02x:%02x:%02x:%02x:%02x", 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]); 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("btm_sec_bond_by_transport: Transport used %d" , transport); 9907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Other security process is in progress */ 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9955344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("BTM_SecBond: already busy in state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9996975b4d711142b885af479721cada448952c6b41Andre Eisenbach if ((p_dev_rec = btm_find_or_alloc_dev (bd_addr)) == NULL) 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10016975b4d711142b885af479721cada448952c6b41Andre Eisenbach return(BTM_NO_RESOURCES); 10027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update sec_flags=0x%x", p_dev_rec->sec_flags); 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Finished if connection is active and already paired */ 10077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ( ((p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_BR_EDR 10087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 10097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 10107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ||((p_dev_rec->ble_hci_handle != BTM_SEC_INVALID_HANDLE) && transport == BT_TRANSPORT_LE 10117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta && (p_dev_rec->sec_flags & BTM_SEC_LE_AUTHENTICATED)) 10127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 10137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("BTM_SecBond -> Already Paired"); 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell controller to get rid of the link key if it has one stored */ 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((BTM_DeleteStoredLinkKey (bd_addr, NULL)) != BTM_SUCCESS) 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the PIN code if we got a valid one */ 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_pin && (pin_len <= PIN_CODE_LEN) && (pin_len != 0)) 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = pin_len; 1028818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->pin_code_length = pin_len; 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pin_code, p_pin, PIN_CODE_LEN); 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN); 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_WE_STARTED_DD; 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_OUT_AUTHENTICATE; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = TRUE; 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (trusted_mask) 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_COPY_TRUSTED_DEVICE(trusted_mask, p_dev_rec->trusted_mask); 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10416975b4d711142b885af479721cada448952c6b41Andre Eisenbach#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 10427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1044e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_ble_init_pseudo_addr (p_dev_rec, bd_addr); 10457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ BTM_SEC_LE_MASK; 10467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (SMP_Pair(bd_addr) == SMP_STARTED) 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 10517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags = 0; 10567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(BTM_NO_RESOURCES); 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED 10617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta | BTM_SEC_ROLE_SWITCHED | BTM_SEC_LINK_KEY_AUTHED); 10627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 10645344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update sec_flags=0x%x", p_dev_rec->sec_flags); 106530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->supports_simple_pairing()) 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The special case when we authenticate keyboard. Set pin type to fixed */ 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It would be probably better to do it from the application, but it is */ 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* complicated */ 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD) 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.cfg.pin_type != HCI_PIN_TYPE_FIXED)) 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = TRUE; 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (HCI_PIN_TYPE_FIXED); 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10793aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach for (ii = 0; ii <= HCI_EXT_FEATURES_PAGE_MAX; ii++) 10803aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach { 10813aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features = p_dev_rec->features[ii]; 10825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" remote_features page[%1d] = %02x-%02x-%02x-%02x", 10833aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach ii, p_features[0], p_features[1], p_features[2], p_features[3]); 10845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT(" %02x-%02x-%02x-%02x", 10853aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach p_features[4], p_features[5], p_features[6], p_features[7]); 10863aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach } 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_SecBond: Remote sm4: 0x%x HCI Handle: 0x%04x", p_dev_rec->sm4, p_dev_rec->hci_handle); 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_FORCE_RNR_FOR_DBOND == TRUE 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_NAME_KNOWN; 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection already exists... */ 10957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p && p->hci_handle != BTM_SEC_INVALID_HANDLE) 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark lcb as bonding */ 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (bd_addr, TRUE); 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec mode: %d sm4:x%x", btm_cb.security_mode, p_dev_rec->sm4); 110830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->supports_simple_pairing() 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->sm4 == BTM_SM4_KNOWN)) 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_sec_check_prefetch_pin (p_dev_rec) ) 1112899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_CMD_STARTED); 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1114899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 1115899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 1116899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) && 1117899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local is 2.1 and peer is unknown */ 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 & BTM_SM4_CONN_PEND) == 0) 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are not accepting connection request from peer 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * -> RNR (to learn if peer is 2.1) 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 11267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We are accepting connection request from peer */ 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("State:%s sm4: 0x%x sec_state:%d", 11347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_pair_state_descr (btm_cb.pairing_state), p_dev_rec->sm4, p_dev_rec->sec_state); 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* both local and peer are 2.1 */ 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_dd_create_conn(p_dev_rec); 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBondByTransport 11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - doing SSP over BR/EDR or SMP over LE 11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBondByTransport (BD_ADDR bd_addr, tBT_TRANSPORT transport, 11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 11687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if SMP_INCLUDED == TRUE 11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_DEVICE_TYPE dev_type; 11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type; 11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type); 11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* LE device, do SMP pairing */ 11747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_LE && (dev_type & BT_DEVICE_TYPE_BLE) == 0) || 11757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && (dev_type & BT_DEVICE_TYPE_BREDR) == 0)) 11767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_ILLEGAL_ACTION; 11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 11817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function BTM_SecBond 11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description This function is called to perform bonding with peer device. 11887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** If the connection is already up, but not secure, pairing 11897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** is attempted. If already paired BTM_SUCCESS is returned. 11907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Parameters: bd_addr - Address of the device to bond 11927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** pin_len - length in bytes of the PIN Code 11937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** p_pin - pointer to array with the PIN Code 11947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** trusted_mask - bitwise OR of trusted services (array of UINT32) 11957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Note: After 2.1 parameters are not used and preserved here not to change API 11977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SecBond (BD_ADDR bd_addr, UINT8 pin_len, UINT8 *p_pin, UINT32 trusted_mask[]) 11997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 12007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 12017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 12027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (BTM_UseLeLink(bd_addr)) 12037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BT_TRANSPORT_LE; 12047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 12057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_bond_by_transport(bd_addr, transport, pin_len, p_pin, trusted_mask); 12067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 12077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 12087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecBondCancel 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to cancel ongoing bonding process 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with peer device. 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 12157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** transport - FALSE for BR/EDR link; TRUE for LE link 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecBondCancel (BD_ADDR bd_addr) 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_SecBondCancel() State: %s flags:0x%x", 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), btm_cb.pairing_flags); 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) == NULL) 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_UNKNOWN_ADDR; 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 12307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_LE_ACTIVE) 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING) 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Cancel LE pairing"); 12357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (SMP_PairCancel(bd_addr)) 12367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 12377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_CMD_STARTED; 12387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return BTM_WRONG_MODE; 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("hci_handle:0x%x sec_state:%d", p_dev_rec->hci_handle, p_dev_rec->sec_state ); 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-fetching pin for dedicated bonding */ 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_SUCCESS; 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this BDA is in a bonding procedure */ 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link is up */ 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If some other thread disconnecting, we do not send second command */ 1261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING) || 1262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH)) 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link was set up by Bonding process */ 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 12677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return btm_sec_send_hci_disconnect(p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(bd_addr, FALSE); 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /*HCI link is not up */ 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the HCI link creation was started by Bonding process */ 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_create_conn_cancel(bd_addr)) 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_CMD_STARTED; 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 1284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_CancelRemoteDeviceName(); 1286ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_cb.pairing_flags |= BTM_PAIR_FLAGS_WE_CANCEL_DD; 1287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return BTM_CMD_STARTED; 1288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NOT_AUTHORIZED; 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_WRONG_MODE; 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SecGetDeviceLinkKey 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to obtain link key for the device 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** it returns BTM_SUCCESS if link key is available, or 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_UNKNOWN_ADDR if Security Manager does not know about 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the device or device record does not contain link key info 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** link_key - Link Key is copied into this array 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SecGetDeviceLinkKey (BD_ADDR bd_addr, LINK_KEY link_key) 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (link_key, p_dev_rec->link_key, LINK_KEY_LEN); 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_UNKNOWN_ADDR); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function BTM_SecGetDeviceLinkKeyType 1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to obtain link key type for the 1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** device. 1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** it returns BTM_SUCCESS if link key is available, or 1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** BTM_UNKNOWN_ADDR if Security Manager does not know about 1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the device or device record does not contain link key info 1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns BTM_LKEY_TYPE_IGNORE if link key is unknown, link type 1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** otherwise. 1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojitBTM_LINK_KEY_TYPE BTM_SecGetDeviceLinkKeyType (BD_ADDR bd_addr) 1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 1339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec != NULL) && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return p_dev_rec->link_key_type; 1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_LKEY_TYPE_IGNORE; 1345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetEncryption 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to ensure that connection is 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** encrypted. Should be called only on an open connection. 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically only needed for connections that first want to 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bring up unencrypted links, then later encrypt them. 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed. Can be set to NULL 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if status is not desired. 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - pointer to any data the caller wishes to receive 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** in the callback function upon completion. 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project* can be set to NULL if not used. 1364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** transport - TRUE to encryption the link over LE transport 1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** or FALSE for BR/EDR transport 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - already encrypted 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_PENDING - command will be returned in the callback 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_WRONG_MODE- connection not up. 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_BUSY - security procedures are currently active 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MODE_UNSUPPORTED - if security manager not linked in. 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS BTM_SetEncryption (BD_ADDR bd_addr, tBT_TRANSPORT transport, tBTM_SEC_CBACK *p_callback, 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS rc = 0; 13787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 13807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!p_dev_rec || 13817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (transport == BT_TRANSPORT_BR_EDR && p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 13827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 13837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && p_dev_rec->ble_hci_handle == BTM_SEC_INVALID_HANDLE) 13847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 13857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connection should be up and runnning */ 13885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption not connected"); 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 13917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_WRONG_MODE); 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_WRONG_MODE); 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((transport == BT_TRANSPORT_BR_EDR && 13977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)) 13987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 13997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta || (transport == BT_TRANSPORT_LE && 14007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LE_ENCRYPTED)) 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ) 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14045344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: BTM_SetEncryption already encrypted"); 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 14077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* enqueue security request if security is active */ 1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->p_callback || (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE)) 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING ("Security Manager: BTM_SetEncryption busy, enqueue request"); 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_queue_encrypt_request(bd_addr, transport, p_callback, p_ref_data)) 1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_CMD_STARTED; 1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_callback) 1424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*p_callback) (bd_addr, transport, p_ref_data, BTM_NO_RESOURCES); 1425444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_NO_RESOURCES; 1426444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = FALSE; 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("Security Manager: BTM_SetEncryption Handle:%d State:%d Flags:0x%x Required:0x%x", 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required); 14377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 14397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tACL_CONN *p = btm_bda_to_acl(bd_addr, transport); 1442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p) 1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rc = btm_ble_set_encryption(bd_addr, p_ref_data, p->link_role); 1445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji rc = BTM_WRONG_MODE; 1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING("%s: cannot call btm_ble_set_encryption, p is NULL", __FUNCTION__); 1450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = btm_sec_execute_procedure (p_dev_rec); 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (rc != BTM_CMD_STARTED && rc != BTM_BUSY) 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 14617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, rc); 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * disconnect the ACL link, if it's not done yet. 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic tBTM_STATUS btm_sec_send_hci_disconnect (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 reason, UINT16 conn_handle) 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 old_state = p_dev_rec->sec_state; 1474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_STATUS status = BTM_CMD_STARTED; 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14765344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_send_hci_disconnect: handle:0x%x, reason=0x%x", 14777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta conn_handle, reason); 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* send HCI_Disconnect on a transport only once */ 1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (old_state) 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING: 1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (conn_handle == p_dev_rec->hci_handle) 1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 14887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING_BLE: 1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (conn_handle == p_dev_rec->ble_hci_handle) 1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = BTM_SEC_STATE_DISCONNECTING_BOTH; 1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case BTM_SEC_STATE_DISCONNECTING_BOTH: 1498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = (conn_handle == p_dev_rec->hci_handle) ? 1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; 1504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* If a role switch is in progress, delay the HCI Disconnect to avoid controller problem */ 1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->rs_disc_pending == BTM_SEC_RS_PENDING && p_dev_rec->hci_handle == conn_handle) 1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("RS in progress - Set DISC Pending flag in btm_sec_send_hci_disconnect to delay disconnect"); 1512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->rs_disc_pending = BTM_SEC_DISC_PENDING; 1513444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status = BTM_SUCCESS; 1514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Tear down the HCI link */ 1516444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (!btsnd_hcic_disconnect (conn_handle, reason)) 1517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1518444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* could not send disconnect. restore old state */ 1519444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = old_state; 1520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status = BTM_NO_RESOURCES; 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1522444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1523444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return status; 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ConfirmReqReply 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to confirm the numeric value for 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_CFM_REQ_EVT 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_ConfirmReqReply(tBTM_STATUS res, BD_ADDR bd_addr) 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_ConfirmReqReply() State: %s Res: %u", 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY) ) 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res == BTM_SUCCESS) 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL) 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_AUTHED; 1559818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, TRUE); 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Report authentication failed event from state BTM_PAIR_STATE_WAIT_AUTH_COMPLETE */ 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (bd_addr, FALSE); 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_PasskeyReqReply 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the passkey for 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_KEY_REQ_EVT 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: res - result of the operation BTM_SUCCESS if success 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr - Address of the peer device 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** passkey - numeric value in the range of 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_MIN_PASSKEY_VAL(0) - BTM_MAX_PASSKEY_VAL(999999(0xF423F)). 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_PasskeyReqReply(tBTM_STATUS res, BD_ADDR bd_addr, UINT32 passkey) 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API ("BTM_PasskeyReqReply: State: %s res:%d", 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) && (res != BTM_SUCCESS) ) 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1600444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 1601444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL) 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE) 16067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SecBondCancel(bd_addr); 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (passkey > BTM_MAX_PASSKEY_VAL) 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = BTM_ILLEGAL_VALUE; 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply (bd_addr); 1629444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } else { 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_reply (bd_addr, passkey); 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SendKeypressNotif 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is used during the passkey entry model 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by a device with KeyboardOnly IO capabilities 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (very likely to be a HID Device). 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is called by a HID Device to inform the remote device when 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a key has been entered or erased. 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** type - notification type 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SendKeypressNotif(BD_ADDR bd_addr, tBTM_SP_KEY_TYPE type) 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This API only make sense between PASSKEY_REQ and SP complete */ 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_KEY_ENTRY) 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_send_keypress_notif (bd_addr, type); 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_IoCapRsp 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called in response to BTM_SP_IO_REQ_EVT 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the event data io_req.oob_data is set to BTM_OOB_UNKNOWN 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the tBTM_SP_CALLBACK implementation, this function is 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** called to provide the actual response 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** io_cap - The IO capability of local device. 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** oob - BTM_OOB_NONE or BTM_OOB_PRESENT. 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** auth_req- MITM protection required or not. 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_IoCapRsp(BD_ADDR bd_addr, tBTM_IO_CAP io_cap, tBTM_OOB_DATA oob, tBTM_AUTH_REQ auth_req) 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16775344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("BTM_IoCapRsp: state: %s oob: %d io_cap: %d", 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), oob, io_cap); 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS) 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (memcmp (btm_cb.pairing_bda, bd_addr, BD_ADDR_LEN) != 0) ) 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (oob < BTM_OOB_UNKNOWN && io_cap < BTM_IO_CAP_MAX) 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = auth_req; 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = io_cap; 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req = (BTM_AUTH_DD_BOND | (auth_req&BTM_AUTH_YN_BIT)); 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (bd_addr, io_cap, oob, auth_req); 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadLocalOobData 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to read the local OOB data from 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** LM 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadLocalOobData(void) 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_SUCCESS; 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_read_local_oob_data() == FALSE) 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_NO_RESOURCES; 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return status; 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_RemoteOobDataReply 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to provide the remote OOB data for 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Simple Pairing in response to BTM_SP_RMT_OOB_EVT 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoteOobDataReply(tBTM_STATUS res, BD_ADDR bd_addr, BT_OCTET16 c, BT_OCTET16 r) 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() - State: %s res: %d", __func__, 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), res); 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If timeout already expired or has been canceled, ignore the reply */ 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (res != BTM_SUCCESS) 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed event */ 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (bd_addr); 1742444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } else { 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_SUCCESS; 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_reply (bd_addr, c, r); 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_BuildOobData 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to build the OOB data payload to 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be sent over OOB (non-Bluetooth) link 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** max_len - p_data size. 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** c - simple pairing Hash C. 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** r - simple pairing Randomizer C. 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** name_len- 0, local device name would not be included. 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the local device name is included for 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** up to this specified length 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Number of bytes in p_data. 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_BuildOobData(UINT8 *p_data, UINT16 max_len, BT_OCTET16 c, 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r, UINT8 name_len) 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 len = 0; 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 name_size; 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE; 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data && max_len >= BTM_OOB_MANDATORY_SIZE) 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mandatory part */ 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 178030e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson BDADDR_TO_STREAM(p, controller_get_interface()->get_address()->address); 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = BTM_OOB_MANDATORY_SIZE; 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now optional part */ 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Hash C */ 1788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 delta = BTM_OOB_HASH_C_SIZE + 2; 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_HASH_C_SIZE + 1; 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_HASH_C_TYPE; 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, c, BTM_OOB_HASH_C_SIZE); 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add Rand R */ 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_RAND_R_SIZE + 2; 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_RAND_R_SIZE + 1; 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_SSP_RAND_R_TYPE; 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM(p, r, BTM_OOB_RAND_R_SIZE); 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add class of device */ 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = BTM_OOB_COD_SIZE + 2; 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_OOB_COD_SIZE + 1; 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTM_EIR_OOB_COD_TYPE; 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEVCLASS_TO_STREAM(p, btm_cb.devcb.dev_class); 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_MAX_LOC_BD_NAME_LEN > 0 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = name_len; 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (name_size > strlen(btm_cb.cfg.bd_name)) 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE; 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name_size = (UINT16)strlen(btm_cb.cfg.bd_name); 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project delta = name_size + 2; 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= delta) 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_size + 1; 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = name_type; 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, btm_cb.cfg.bd_name, name_size); 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len += delta; 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= delta; 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update len */ 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_data; 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, len); 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return len; 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1845899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_BothEndsSupportSecureConnections 1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1847899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if both the local device and the peer device 1848899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** specified by bd_addr support BR/EDR Secure Connections. 1849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1850899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters: bd_addr - address of the peer 1851899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1852899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if BR/EDR Secure Connections are supported by both local 1853899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** and the remote device. 1854899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** else FALSE. 1855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1857899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_BothEndsSupportSecureConnections(BD_ADDR bd_addr) 1858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1859899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return ((controller_get_interface()->supports_secure_connections()) && 1860899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_PeerSupportsSecureConnections(bd_addr))); 1861899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 1862899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1863899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 1864899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1865899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function BTM_PeerSupportsSecureConnections 1866899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1867899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if the peer supports 1868899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** BR/EDR Secure Connections. 1869899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1870899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Parameters: bd_addr - address of the peer 1871899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1872899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if BR/EDR Secure Connections are supported by the peer, 1873899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** else FALSE. 1874899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 1875899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 1876899b77140675a157dba034e98527ab546bc9ac35Mudumba AnanthBOOLEAN BTM_PeerSupportsSecureConnections(BD_ADDR bd_addr) 1877899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 1878899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth tBTM_SEC_DEV_REC *p_dev_rec; 1879899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1880899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec = btm_find_dev(bd_addr)) == NULL) 1881899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 1882899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_WARNING("%s: unknown BDA: %08x%04x", __FUNCTION__, 1883899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (bd_addr[0]<<24) + (bd_addr[1]<<16) + (bd_addr[2]<<8) + bd_addr[3], 1884899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (bd_addr[4]<< 8) + bd_addr[5]); 1885899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return FALSE; 1886899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 1887899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 1888899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (p_dev_rec->remote_supports_secure_connections); 1889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadOobData 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to parse the OOB data payload 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received over OOB (non-Bluetooth) link 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: p_data - the location for OOB data 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** eir_tag - The associated EIR tag to read the data. 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** *p_len(output) - the length of the data with the given tag. 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns the beginning of the data with the given tag. 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** NULL, if the tag is not found. 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * BTM_ReadOobData(UINT8 *p_data, UINT8 eir_tag, UINT8 *p_len) 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_data; 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 max_len; 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 len, type; 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_ret = NULL; 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ret_len = 0; 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data) 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(max_len, p); 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len >= BTM_OOB_MANDATORY_SIZE) 19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_EIR_OOB_BD_ADDR_TYPE == eir_tag) 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; /* the location for bd_addr */ 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = BTM_OOB_BD_ADDR_SIZE; 19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += BD_ADDR_LEN; 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= BTM_OOB_MANDATORY_SIZE; 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* now the optional data in EIR format */ 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (max_len > 0) 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = *p++; /* tag data len + 1 */ 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project type = *p++; 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (eir_tag == type) 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_ret = p; 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ret_len = len - 1; 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the data size of this tag is len + 1 (tag data len + 2) */ 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (max_len > len) 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len -= len; 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len--; 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len--; 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_len = 0; 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_len) 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_len = ret_len; 19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_ret; 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_SetOutService 19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to set the service for 19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** outgoing connections. 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If the profile/application calls BTM_SetSecurityLevel 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before initiating a connection, this function does not 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** need to be called. 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_SetOutService(BD_ADDR bd_addr, UINT8 service_id, UINT32 mx_chan_id) 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (bd_addr); 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->service_id == service_id) 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19895344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_API("BTM_SetOutService p_out_serv id %d, psm 0x%04x, proto_id %d, chan_id %d", 19905738f83aeb59361a0a2eda2460113f6dc919427The 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); 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_out_serv = p_serv_rec; 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************ 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** I N T E R N A L F U N C T I O N S 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/ 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_upgrade_possible 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2006ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function returns TRUE if the existing link key 2007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** can be upgraded or if the link key does not exist. 20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2009ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BOOLEAN 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2012ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_sec_is_upgrade_possible(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtm_check = is_originator ? BTM_SEC_OUT_MITM : BTM_SEC_IN_MITM; 2015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN is_possible = TRUE; 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = FALSE; 20207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if(p_dev_rec->p_cur_service) 20217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() id: %d, link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x, flags: 0x%x", 2023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_dev_rec->p_cur_service->service_id, p_dev_rec->link_key_type, 2024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->rmt_io_caps, mtm_check, p_dev_rec->p_cur_service->security_flags); 20257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 20267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 20277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 2028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() link_key_typet: %d, rmt_io_caps: %d, chk flags: 0x%x", 2029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_dev_rec->link_key_type, p_dev_rec->rmt_io_caps, mtm_check); 20307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Already have a link key to the connected peer. Is the link key secure enough? 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Is a link key upgrade even possible? 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2034899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & mtm_check) /* needs MITM */ 2035899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB) || 2036899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) 2037899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* has unauthenticated 2038899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth link key */ 2039899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && (p_dev_rec->rmt_io_caps < BTM_IO_CAP_MAX) /* a valid peer IO cap */ 2040899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth && (btm_sec_io_map[p_dev_rec->rmt_io_caps][btm_cb.devcb.loc_io_caps])) 2041899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* authenticated 2042899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth link key is possible */ 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* upgrade is possible: check if the application wants the upgrade. 20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If the application is configured to use a global MITM flag, 20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it probably would not want to upgrade the link key based on the security level database */ 2047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_possible = TRUE; 2048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_possible: %d sec_flags: 0x%x", __func__, is_possible, p_dev_rec->sec_flags); 2051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return is_possible; 2052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 2055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_check_upgrade 2057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to check if the existing link key 2059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** needs to be upgraded. 2060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 2062ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 2063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 2064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void btm_sec_check_upgrade(tBTM_SEC_DEV_REC *p_dev_rec, BOOLEAN is_originator) 2065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s()", __func__); 2068ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2069ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Only check if link key already exists */ 2070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 2071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 2072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_sec_is_upgrade_possible (p_dev_rec, is_originator) == TRUE) 2074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 20755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("need upgrade!! sec_flags:0x%x", p_dev_rec->sec_flags); 2076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* upgrade is possible: check if the application wants the upgrade. 2077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * If the application is configured to use a global MITM flag, 2078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * it probably would not want to upgrade the link key based on the security level database */ 2079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SP_UPGRADE evt_data; 2080ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 2081ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.upgrade = TRUE; 2082ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (btm_cb.api.p_sp_callback) 2083ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*btm_cb.api.p_sp_callback) (BTM_SP_UPGRADE_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 2084ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 20855344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("evt_data.upgrade:0x%x", evt_data.upgrade); 2086ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (evt_data.upgrade) 2087ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2088ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if the application confirms the upgrade, set the upgrade bit */ 2089ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2090ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2091ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Clear the link key known to go through authentication/pairing again */ 2092ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED); 2093ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHENTICATED; 20945344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("sec_flags:0x%x", p_dev_rec->sec_flags); 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_l2cap_access_req 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP to grant permission to 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establish L2CAP connection to or from the peer device. 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are complete. MUST NOT BE NULL. 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tBTM_STATUS 21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_OUT_FLAGS (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | BTM_SEC_OUT_AUTHORIZE) 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_SEC_IN_FLAGS (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | BTM_SEC_IN_AUTHORIZE) 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2120899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_OUT_LEVEL4_FLAGS (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT | \ 2121899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_OUT_MITM | BTM_SEC_MODE4_LEVEL4) 2122899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2123899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth#define BTM_SEC_IN_LEVEL4_FLAGS (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT | \ 2124899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_IN_MITM | BTM_SEC_MODE4_LEVEL4) 2125899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_l2cap_access_req (BD_ADDR bd_addr, UINT16 psm, UINT16 handle, 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CONNECTION_TYPE conn_type, 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void *p_ref_data) 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 security_required; 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 old_security_required; 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN old_is_originator; 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc = BTM_SUCCESS; 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN chk_acp_auth_done = FALSE; 21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 21397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE; /* should check PSM range in LE connection oriented L2CAP connection */ 21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (conn_type & CONNECTION_TYPE_ORIG_MASK) 21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() conn_type: 0x%x, 0x%x", __func__, conn_type, p_ref_data); 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_originator:%d, 0x%x", __func__, is_originator, p_ref_data); 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_first_serv (conn_type, psm); 21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_WARNING ("%s() PSM: %d no application registerd", __func__, psm); 21667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2170899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Services level0 by default have no security */ 2171899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_sec_is_serv_level0(psm)) && (!btm_cb.devcb.secure_connections_only)) 21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, BTM_SUCCESS_NO_SECURITY); 21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 2180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->ucd_security_flags, 2182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->ucd_security_flags; 2187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 21945738f83aeb59361a0a2eda2460113f6dc919427The 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))) || 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED))) || 22045738f83aeb59361a0a2eda2460113f6dc919427The 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))) || 22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_FLAGS) && (p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED))) ) 22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2207818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // Check for 16 digits (or MITM) 2208818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2209818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == BTM_SEC_IN_MIN_16_DIGIT_PIN) && 2210818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde btm_dev_16_digit_authenticated(p_dev_rec))) { 2211818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde rc = BTM_SUCCESS; 2212818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2216899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2217899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2218899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2219899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2220899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2221899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 22257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2233899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 2234899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2235899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, 2236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->security_flags; 2241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2242899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2243899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2244899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: security_required 0x%04x, is_originator 0x%02x, psm 0x%04x", 2245899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, security_required, is_originator, psm); 2246899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2247899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((!is_originator) && (security_required & BTM_SEC_MODE4_LEVEL4)) 2248899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2249899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 2250899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor receives L2CAP Channel Connect Request for Secure Connections Only service */ 2251899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 2252899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2253899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d", 2254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "rmt_support_for_sc : %d -> fail pairing", __FUNCTION__, 2255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, 2256899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections); 2257899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2258899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, (void *)p_ref_data, 2259899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2260899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2261899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2262899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto KRZR) which connects to several services at the same time */ 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() - busy - PSM:%d delayed state: %s mode:%d, sm4:0x%x", __func__, 2270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta psm, btm_pair_state_descr(btm_cb.pairing_state), btm_cb.security_mode, p_dev_rec->sm4); 22715344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("security_flags:x%x, sec_flags:x%x", security_required, p_dev_rec->sec_flags); 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_CMD_STARTED; 2273899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2274899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2275899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2276899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2277899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2278899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator) 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 22857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 22867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) || 22877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_FLAGS) && btm_dev_authorized(p_dev_rec) && btm_dev_encrypted(p_dev_rec))) ) 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_SUCCESS; 22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 22957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec)) || 22967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec)) || 22977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 22997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 23007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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)))) 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2302818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // Check for 16 digits (or MITM) 2303818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2304818d0f2afb10c75125b0df9ea2bce6108268a269Casper 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))) { 2305818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde rc = BTM_SUCCESS; 2306818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2310899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2311899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2313899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2315899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (rc == BTM_SUCCESS) 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 23197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, (void *)p_ref_data, BTM_SUCCESS); 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = TRUE; 23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save pointer to service record */ 23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2331899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Modify security_required in btm_sec_l2cap_access_req for Lisbon */ 2332899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2333899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2334899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2336899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2338899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (is_originator) 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT); 23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2343899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else /* acceptor */ 23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4: the acceptor needs to make sure the authentication is already done */ 23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project chk_acp_auth_done = TRUE; 23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4 to SM4 -> always authenticate & encrypt */ 23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project security_required |= (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT); 2349899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2350899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2351899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else if (!(BTM_SM4_KNOWN & p_dev_rec->sm4)) 2352899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2353899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the remote features are not known yet */ 2354899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: (%s) remote features unknown!!sec_flags:0x%02x", __FUNCTION__, 2355899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (is_originator) ? "initiator" : "acceptor", p_dev_rec->sec_flags); 23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2357899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_REQ_PEND; 2358899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_CMD_STARTED); 23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() sm4:0x%x, sec_flags:0x%x, security_required:0x%x chk:%d", __func__, 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4, p_dev_rec->sec_flags, security_required, chk_acp_auth_done); 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_security_required = p_dev_rec->security_required; 23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_is_originator = p_dev_rec->is_originator; 23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = security_required; 23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_CONNLESS_MASK ) 23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = TRUE; 23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_ucd = FALSE; 23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are multiple service records used through the same PSM */ 23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* leave security decision for the multiplexor on the top */ 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_sec_find_next_serv (p_serv_rec)) != NULL) 23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!( conn_type & CONNECTION_TYPE_CONNLESS_MASK ))) /* if not UCD */ 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_find_next_serv (p_serv_rec)) != NULL) 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("no next_serv sm4:0x%x, chk:%d", p_dev_rec->sm4, chk_acp_auth_done); 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!BTM_SEC_IS_SM4(p_dev_rec->sm4)) 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 23905344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: l2cap_access_req PSM:%d postponed for multiplexer", psm); 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pre-Lisbon: restore the old settings */ 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* if the originator is using dynamic PSM in legacy mode, do not start any security process now 2402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth * The layer above L2CAP needs to carry out the security requirement after L2CAP connect 2403899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth * response is received */ 2404899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (is_originator && 2405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2408899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth !BTM_SEC_IS_SM4(p_dev_rec->sm4)) && (psm >= 0x1001)) 24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("dynamic PSM:0x%x in legacy mode - postponed for upper layer", psm); 24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restore the old settings */ 24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = old_security_required; 24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = old_is_originator; 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_SUCCESS); 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (chk_acp_auth_done) 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("(SM4 to SM4) btm_sec_l2cap_access_req rspd. authenticated: x%x, enc: x%x", 24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED), (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED)); 24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SM4, but we do not know for sure which level of security we need. 24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * as long as we have a link key, it's OK */ 24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((0 == (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ||(0 == (p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED))) 24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rc = BTM_DELAY_CHECK; 24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2046 may report HCI_Encryption_Change and L2C Connection Request out of sequence 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project because of data path issues. Delay this disconnect a little bit 24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2435f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton LOG_INFO("%s peer should have initiated security process by now (SM4 to SM4)", __func__); 24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_DELAY_FOR_ENC; 24387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, rc); 24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return BTM_SUCCESS; 24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 2447ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != p_dev_rec->p_cur_service->service_id) 2448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Although authentication and encryption are per connection 2450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** authorization is per access request. For example when serial connection 2451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** is up and authorized and client requests to read file (access to other 2452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ** scn), we need to request user's permission again. 2453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 2454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_AUTHORIZED; 2455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2459899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2460899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2461899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2462899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ 2463899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) 2464899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2465899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2466899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2467899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_AUTHENTICATED); 2469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG ("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); 2470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2472899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* If we already have a link key to the connected peer, is it secure enough? */ 2474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_check_upgrade(p_dev_rec, is_originator); 2475899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() PSM:%d Handle:%d State:%d Flags: 0x%x Required: 0x%x Service ID:%d", 2479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, psm, handle, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 24857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_dev_rec->p_ref_data, (UINT8)rc); 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(rc); 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_mx_access_request 24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by all Multiplexing Protocols during 24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establishing connection to or from peer device to grant 24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** permission to establish application connection. 24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** psm - L2CAP PSM 25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is_originator - TRUE if protocol above L2CAP originates 25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_proto_id - protocol ID of the multiplexer 25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** mx_chan_id - multiplexer channel to reach application 25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_callback - Pointer to callback function called if 25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this function returns PENDING after required 25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedures are completed 25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_ref_data - Pointer to any reference data needed by the 25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the callback function. 25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_CMD_STARTED 25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_mx_access_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator, 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec; 25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS rc; 2521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 security_required; 25227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BOOLEAN transport = FALSE;/* should check PSM range in LE connection oriented L2CAP connection */ 25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2524444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_originator: %d", __func__, is_originator); 25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find or get oldest record */ 25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the service record for the PSM */ 25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_serv_rec = btm_sec_find_mx_serv (is_originator, psm, mx_proto_id, mx_chan_id); 25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no application registered with this PSM do not allow connection */ 25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_serv_rec) 25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 25357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr, transport, p_ref_data, BTM_MODE_UNSUPPORTED); 25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("Security Manager: MX service not found PSM:%d Proto:%d SCN:%d", 25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id); 25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BTM_NO_RESOURCES; 25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2542899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (!btm_sec_is_serv_level0(psm))) 2543899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2544899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = btm_sec_set_serv_level4_flags (p_serv_rec->security_flags, 2545899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth is_originator); 2546899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2548899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2549899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth security_required = p_serv_rec->security_flags; 2550899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2551899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* there are some devices (moto phone) which connects to several services at the same time */ 25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we will process one after another */ 25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->p_callback) || (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) ) 25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2556444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() service PSM:%d Proto:%d SCN:%d delayed state: %s", __func__, 25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project psm, mx_proto_id, mx_chan_id, btm_pair_state_descr(btm_cb.pairing_state)); 25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_CMD_STARTED; 2560899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_UNDEFINED || 2562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_NONE || 2563899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SERVICE || 2564899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_LINK) || 2565899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (BTM_SM4_KNOWN == p_dev_rec->sm4) || (BTM_SEC_IS_SM4(p_dev_rec->sm4) && 2566899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_sec_is_upgrade_possible(p_dev_rec, is_originator) == FALSE))) 2567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* legacy mode - local is legacy or local is lisbon/peer is legacy 2569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * or SM4 with no possibility of link key upgrade */ 2570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_originator) 2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_OUT_FLAGS) == 0) || 25737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == BTM_SEC_OUT_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 25747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_OUT_FLAGS) == (BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = BTM_SUCCESS; 2578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 2581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (((security_required & BTM_SEC_IN_FLAGS) == 0) || 25837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == BTM_SEC_IN_AUTHENTICATE) && btm_dev_authenticated(p_dev_rec))) || 25847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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))) || 25877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((((security_required & BTM_SEC_IN_FLAGS) == (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_IN_ENCRYPT)) && btm_dev_encrypted(p_dev_rec))) 2588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2590818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // Check for 16 digits (or MITM) 2591818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (((security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN) == 0) || 2592818d0f2afb10c75125b0df9ea2bce6108268a269Casper 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))) { 2593818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde rc = BTM_SUCCESS; 2594818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 2595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2597899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((rc == BTM_SUCCESS) && (security_required & BTM_SEC_MODE4_LEVEL4) && 2598899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2599899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2600899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2601899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2602899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2603899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2604899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (rc == BTM_SUCCESS) 2605899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2606899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: allow to bypass, checking authorization", __FUNCTION__); 2607899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the security in BTM_SEC_IN_FLAGS is fullfilled so far, check the requirements in */ 2608899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* btm_sec_execute_procedure */ 2609899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((is_originator && (p_serv_rec->security_flags & BTM_SEC_OUT_AUTHORIZE)) || 2610899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (!is_originator && (p_serv_rec->security_flags & BTM_SEC_IN_AUTHORIZE))) 2611899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2612899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: still need authorization", __FUNCTION__); 2613899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2614899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2615899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2616899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2617899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Check whether there is a pending security procedure, if so we should always queue */ 2618899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* the new security request */ 2619899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->sec_state != BTM_SEC_STATE_IDLE) 2620899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2621899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: There is a pending security procedure", __FUNCTION__); 2622899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth rc = BTM_CMD_STARTED; 2623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 2624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (rc == BTM_CMD_STARTED) 2625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 2626899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: call btm_sec_queue_mx_request", __FUNCTION__); 2627899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_queue_mx_request (bd_addr, psm, is_originator, mx_proto_id, 2628899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth mx_chan_id, p_callback, p_ref_data); 2629899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2630899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else /* rc == BTM_SUCCESS */ 2631899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2632899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* access granted */ 2633899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2634899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2635899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, p_ref_data, (UINT8)rc); 2636899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2637899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2638899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2639899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: return with rc = 0x%02x in delayed state %s", __FUNCTION__, rc, 2640899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_pair_state_descr(btm_cb.pairing_state)); 2641899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return rc; 2642899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2643899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2644899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((!is_originator) && ((security_required & BTM_SEC_MODE4_LEVEL4) || 2645899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (btm_cb.security_mode == BTM_SEC_MODE_SC))) 2646899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2647899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 2648899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor receives service connection establishment Request for */ 2649899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* Secure Connections Only service */ 2650899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 2651899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2652899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service,local_support_for_sc %d,", 2653899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "remote_support_for_sc %d: fail pairing",__FUNCTION__, 2654899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, p_dev_rec->remote_supports_secure_connections); 2655899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2656899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_callback) 2657899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (*p_callback) (bd_addr, transport, (void *)p_ref_data, 2658899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2659899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2660899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_MODE4_LEVEL4_NOT_SUPPORTED); 2661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service = p_serv_rec; 2665899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->security_required = security_required; 26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2667899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SP || 2668899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 2669899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) 26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4(p_dev_rec->sm4)) 26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2673899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 2674899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 2675899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2676899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* BTM_LKEY_TYPE_AUTH_COMB_P_256 is the only acceptable key in this case */ 2677899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) != 0) 2678899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2679899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 |= BTM_SM4_UPGRADE; 2680899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2681899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 2682899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED | 2683899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_AUTHENTICATED); 2684899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: sec_flags:0x%x", __FUNCTION__, p_dev_rec->sec_flags); 2685899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 2686899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 2687899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 2688899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* If we already have a link key, check if that link key is good enough */ 2689899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_sec_check_upgrade(p_dev_rec, is_originator); 2690899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator = is_originator; 26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = p_callback; 26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_ref_data = p_ref_data; 26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Although authentication and encryption are per connection */ 26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization is per access request. For example when serial connection */ 27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is up and authorized and client requests to read file (access to other */ 27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* scn, we need to request user's permission again. */ 27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED); 27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2704444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() proto_id:%d chan_id:%d State:%d Flags:0x%x Required:0x%x Service ID:%d", 2705444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, mx_proto_id, mx_chan_id, p_dev_rec->sec_state, p_dev_rec->sec_flags, 2706444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->security_required, p_dev_rec->p_cur_service->service_id); 27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((rc = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_callback) 27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 27137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (bd_addr,transport, p_ref_data, (UINT8)rc); 27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rc; 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_conn_req 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when the peer device is requesting 27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** connection 27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_conn_req (UINT8 *bda, UINT8 *dc) 27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some device may request a connection before we are done with the HCI_Reset sequence */ 273530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!controller_get_interface()->get_is_ready()) 27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request when device not ready"); 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 /* Security guys wants us not to allow connection from not paired devices */ 27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection is allowed for only paired devices */ 27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.connect_only_paired) 27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec || !(p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)) 27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from non-paired device"); 27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_ALLOW_CONN_IF_NONDISCOVER == FALSE 27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If non-discoverable, only allow known devices to connect */ 27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_inq_vars.discoverable_mode == BTM_NON_DISCOVERABLE) 27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: connect request from not paired device"); 27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(!memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN))) 27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27725344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: reject connect request from bonding device"); 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* incoming connection from bonding device is rejected */ 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_REJECTED_CONNECT; 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_reject_conn (bda, HCI_ERR_HOST_REJECT_DEVICE); 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Host is not interested or approved connection. Save BDA and DC and */ 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pass request to L2CAP */ 27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_bda, bda, BD_ADDR_LEN); 27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.connecting_dc, dc, DEV_CLASS_LEN); 27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (l2c_link_hci_conn_req (bda)) 27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* accept the connection -> allocate a device record */ 27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_CONN_PEND; 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_bond_cancel_complete 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to report bond cancel complete 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event. 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_bond_cancel_complete (void) 28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) || 28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_PAIR_STATE_WAIT_LOCAL_PIN == btm_cb.pairing_state && 2815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_STARTED_DD & btm_cb.pairing_flags) || 2816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME && 2817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_PAIR_FLAGS_WE_CANCEL_DD & btm_cb.pairing_flags)) 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for dedicated bonding in legacy mode, authentication happens at "link level" 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * btm_sec_connected is called with failed status. 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * In theory, the code that handles is_pairing_device/TRUE should clean out security related code. 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * However, this function may clean out the security related flags and btm_sec_connected would not know 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this function also needs to do proper clean up. 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (btm_cb.pairing_bda)) != NULL) 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application that the cancel succeeded */ 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_SUCCESS); 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_create_conn_cancel_complete 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the command complete message 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is received from the HCI for the create connection cancel 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** command. 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_create_conn_cancel_complete (UINT8 *p) 28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (status, p); 28515344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_create_conn_cancel_complete(): in State: %s status:%d", 28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status); 28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the create conn cancel cmd was issued by the bond cancel, 28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the application needs to be notified that bond cancel succeeded 28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (status) 28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_SUCCESS: 28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_CONNECTION_EXISTS: 28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case HCI_ERR_NO_CONNECTION: 28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify application of the error */ 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_bond_cancel_cmpl_callback) 28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_bond_cancel_cmpl_callback(BTM_ERR_PROCESSING); 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_check_pending_reqs 28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called at the end of the security procedure 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to let L2CAP and RFCOMM know to re-submit any pending requests 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_check_pending_reqs (void) 28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_QUEUE_ENTRY *p_e; 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BUFFER_Q bq; 28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* First, resubmit L2CAP requests */ 28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.sec_req_pending) 28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_req_pending = FALSE; 28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (NULL); 28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Now, re-submit anything in the mux queue */ 28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bq = btm_cb.sec_pending_q; 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_init_q (&btm_cb.sec_pending_q); 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_dequeue (&bq)) != NULL) 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check that the ACL is still up before starting security procedures */ 2904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_bda_to_acl(p_e->bd_addr, p_e->transport) != NULL) 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_e->psm != 0) 2907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT("%s PSM:0x%04x Is_Orig:%u mx_proto_id:%u mx_chan_id:%u", 2909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, p_e->psm, p_e->is_orig, 2910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->mx_proto_id, p_e->mx_chan_id); 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_mx_access_request (p_e->bd_addr, p_e->psm, p_e->is_orig, 29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id, p_e->mx_chan_id, 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback, p_e->p_ref_data); 2915444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 2917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SetEncryption(p_e->bd_addr, p_e->transport, p_e->p_callback, 2919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->p_ref_data); 2920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf (p_e); 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_init 29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is on the SEC startup 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_init (UINT8 sec_mode) 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = sec_mode; 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xff, BD_ADDR_LEN); 29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.max_collision_delay = BTM_SEC_MAX_COLLISION_DELAY; 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_device_down 29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called when device is disabled or 29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** turned off 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_device_down (void) 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() State: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state)); 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_reset 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function should be called after device reset 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_dev_reset (void) 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 297130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (controller_get_interface()->supports_simple_pairing()) 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the default IO capabilities */ 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = BTM_LOCAL_IO_CAPS; 29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add mx service to use no security */ 29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSecurityLevel(FALSE, "RFC_MUX", BTM_SEC_SERVICE_RFC_MUX, 29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_NONE, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM, 0); 29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 29805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode = BTM_SEC_MODE_SERVICE; 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29845344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_dev_reset sec mode: %d", btm_cb.security_mode); 29855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_abort_access_req 29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by the L2CAP or RFCOMM to abort 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the pending operation. 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the peer device 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 Projectvoid btm_sec_abort_access_req (BD_ADDR bd_addr) 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_state != BTM_SEC_STATE_AUTHORIZING) 30075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING)) 30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dd_create_conn 30175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to create the ACL connection for 30195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the dedicated boding process 30205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_dd_create_conn (tBTM_SEC_DEV_REC *p_dev_rec) 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 30275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure an L2cap link control block is available */ 30297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_allocate_lcb (p_dev_rec->bd_addr, TRUE, BT_TRANSPORT_BR_EDR)) == NULL) 30305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed allocate LCB [%02x%02x%02x%02x%02x%02x]", 30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up the control block to indicated dedicated bonding */ 30395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 30405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (l2cu_create_conn(p_lcb, BT_TRANSPORT_BR_EDR) == FALSE) 30425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: failed create [%02x%02x%02x%02x%02x%02x]", 30445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb(p_lcb); 30485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 30495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_update_busy_level (BTM_BLI_PAGE_EVT); 30525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Security Manager: btm_sec_dd_create_conn [%02x%02x%02x%02x%02x%02x]", 30545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[0], p_dev_rec->bd_addr[1], p_dev_rec->bd_addr[2], 30555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->bd_addr[3], p_dev_rec->bd_addr[4], p_dev_rec->bd_addr[5]); 30565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_PIN_REQ); 30585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 30605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_name_request_complete 30655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when remote name was obtained from 30675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer device 30685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 30705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 30715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_name_request_complete (UINT8 *p_bd_addr, UINT8 *p_bd_name, UINT8 status) 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project DEV_CLASS dev_class; 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sec_state; 30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete"); 30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_bd_addr == NULL) && !BTM_ACL_IS_CONNECTED(btm_cb.connecting_bda)) 30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || ((p_bd_addr != NULL) && !BTM_ACL_IS_CONNECTED(p_bd_addr))) 30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If remote name request failed, p_bd_addr is null and we need to search */ 30875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* based on state assuming that we are doing 1 at a time */ 30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr) 30895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_bd_addr); 30905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[0]; 30935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 30955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 30975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME)) 30985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_addr = p_dev_rec->bd_addr; 31005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 31015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i == BTM_SEC_MAX_DEVICE_RECORDS) 31055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = NULL; 31065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_bd_name) 31135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bd_name = (UINT8 *)""; 31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31175344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d State:%d p_dev_rec: 0x%08x ", 31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, p_dev_rec->sec_state, p_dev_rec); 31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: rmt_name_complete PairState: %s RemName: %s status: %d", 31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), p_bd_name, 31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status); 31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sec_state = p_dev_rec->sec_state; 31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 31335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)p_dev_rec->sec_bd_name, sizeof (p_dev_rec->sec_bd_name), (char *)p_bd_name, BTM_MAX_REM_BD_NAME_LEN); 31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 31365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("setting BTM_SEC_NAME_KNOWN sec_flags:0x%x", p_dev_rec->sec_flags); 31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if it failed so clients can continue */ 31415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 0; 31425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_GETTING_NAME) 31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 31465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved */ 31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3150831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, p_dev_rec->dev_class, 31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[0] = 0; 31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[1] = 0; 31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dev_class[2] = 0; 31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify all clients waiting for name to be resolved even if not found so clients can continue */ 31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0;i < BTM_SEC_MAX_RMT_NAME_CALLBACKS; i++) 31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3164831423ea1879244e746f39d7696ad4a66681f306Hemant Gupta if (btm_cb.p_rmt_name_callback[i] && p_bd_addr) 31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.p_rmt_name_callback[i])(p_bd_addr, dev_class, (UINT8 *)""); 31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we were delaying asking UI for a PIN because name was not resolved, ask now */ 31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_LOCAL_PIN) && p_bd_addr 31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) ) 31745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31755344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() delayed pin now being requested flags:0x%x, (p_pin_callback=0x%p)", btm_cb.pairing_flags, btm_cb.api.p_pin_callback); 31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) == 0) && 31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0) && 31795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_pin_callback) 31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31815344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() calling pin_callback"); 31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 3183818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (*btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, p_bd_name, 3184818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (p_dev_rec->p_cur_service==NULL) ? FALSE 3185818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the same state again to force the timer to be restarted */ 31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 31905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if we were delaying bonding because name was not resolved */ 31945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btm_cb.pairing_state == BTM_PAIR_STATE_GET_REM_NAME) 31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bd_addr && memcmp (btm_cb.pairing_bda, p_bd_addr, BD_ADDR_LEN) == 0) 31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31985344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_name_request_complete() continue bonding sm4: 0x%04x, status:0x%x", p_dev_rec->sm4, status); 3199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_CANCEL_DD) 3200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3201ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_sec_bond_cancel_complete(); 3202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 3203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 32055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 32107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 32117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_bd_name, status); 32125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if peer is very old legacy devices, HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is not reported */ 32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 32175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* set the KNOWN flag only if BTM_PAIR_FLAGS_REJECTED_CONNECT is not set.*/ 32197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If it is set, there may be a race condition */ 32205344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_rmt_name_request_complete IS_SM4_UNKNOWN Flags:0x%04x", 32217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_cb.pairing_flags); 32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) == 0) 32235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_KNOWN; 32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG("%s, SM4 Value: %x, Legacy:%d,IS SM4:%d, Unknown:%d",__FUNCTION__, 32297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sm4, BTM_SEC_IS_SM4_LEGACY(p_dev_rec->sm4), 32307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_IS_SM4(p_dev_rec->sm4),BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)); 32317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 32325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BT 2.1 or carkit, bring up the connection to force the peer to request PIN. 32335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Else prefetch (btm_sec_check_prefetch_pin will do the prefetching if needed) 32345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 32355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sm4 != BTM_SM4_KNOWN) || !btm_sec_check_prefetch_pin(p_dev_rec)) 32365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection request, we have to wait HCI_Connection_Complete event */ 32385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* before originating */ 32395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT) 32405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32415344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: waiting HCI_Connection_Complete after rejecting connection"); 32425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both we and the peer are 2.1 - continue to create connection */ 32445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 32455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32465344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: failed to start connection"); 32475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 32495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 32515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 32525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 32535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 32585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete: wrong BDA, retry with pairing BDA"); 32605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName (btm_cb.pairing_bda, NULL, BT_TRANSPORT_BR_EDR); 32625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if we were delaying link_key_callback because name was not resolved */ 32675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 32685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If HCI connection complete has not arrived, wait for it */ 32705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE) 32715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 32745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 32755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 32775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 32785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 32795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 32805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 32825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 32835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 32845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 32855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 32905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 32915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 32925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 32935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_rmt_name_request_complete (none/ce)"); 32945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHENTICATE); 32955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer(p_dev_rec->hci_handle); 32965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 32975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 32985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_sec_state != BTM_SEC_STATE_GETTING_NAME) 33005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 33015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If get name failed, notify the waiting layer */ 33035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 33045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 33065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 33075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_REQ_PEND) 33105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33115344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("waiting for remote features!!"); 33125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 33135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Remote Name succeeded, execute the next security procedure, if any */ 33165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 33175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 33195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STARTED) 33205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 33215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 33237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 33245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_rmt_host_support_feat_evt 33295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the 33315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT is received 33325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_rmt_host_support_feat_evt (UINT8 *p) 33375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR bd_addr; /* peer address */ 33405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_FEATURES features; 33415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (bd_addr, p); 33435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bd_addr); 33445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x p[0]: 0x%x", p_dev_rec->sm4, p[0]); 33465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 33485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 33503aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach STREAM_TO_ARRAY(features, p, HCI_FEATURE_BYTES_PER_PAGE); 33515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (HCI_SSP_HOST_SUPPORTED(features)) 33525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 33535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_TRUE; 33545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33555344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_rmt_host_support_feat_evt sm4: 0x%x features[0]: 0x%x", p_dev_rec->sm4, features[0]); 33565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 33575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 33585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 33605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_req 33625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LM request for the IO 33645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capability of the local device and 33655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if the OOB data is present for the device in the event 33665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 33685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 33695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 33705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_req (UINT8 *p) 33715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 33725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_REQ evt_data; 33735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 err_code = 0; 33745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 33755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_orig = TRUE; 33765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 callback_rc = BTM_SUCCESS; 33775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 33795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* setup the default response according to compile options */ 33815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* assume that the local IO capability does not change 33825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * loc_io_caps is initialized with the default value */ 33835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.io_cap = btm_cb.devcb.loc_io_caps; 33845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data = BTM_OOB_NONE; 33855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_AUTH_REQ; 33865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3387899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s", __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state)); 33885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 3390899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3391899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s:Security mode: %d, Num Read Remote Feat pages: %d", __FUNCTION__, 3392899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode, p_dev_rec->num_read_pages); 3393899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3394899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SC) && (p_dev_rec->num_read_pages == 0)) 3395899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3396899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Device security mode is SC only.", 3397899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "To continue need to know remote features.", __FUNCTION__); 3398899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3399899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_features_needed = TRUE; 3400899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return; 3401899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3402899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 34035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_TRUE; 34045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3405899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s Flags: 0x%04x p_cur_service: 0x%08x", 3406899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), 3407899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.pairing_flags, p_dev_rec->p_cur_service); 34085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3409899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->p_cur_service) 34105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3411899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: cur_service psm: 0x%04x, security_flags: 0x%04x", 3412899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, p_dev_rec->p_cur_service->psm, 3413899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->p_cur_service->security_flags); 3414899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3415899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3416899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth switch (btm_cb.pairing_state) 3417899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3418899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* initiator connecting */ 3419899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_IDLE: 3420899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth //TODO: Handle Idle pairing state 3421899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth //security_required = p_dev_rec->security_required; 3422899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3423899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3424899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* received IO capability response already->acceptor */ 3425899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_INCOMING_SSP: 34265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_orig = FALSE; 34275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PEER_STARTED_DD) 3429899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3430899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* acceptor in dedicated bonding */ 34315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 3432899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3433899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3434899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3435899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* initiator, at this point it is expected to be dedicated bonding 3436899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth initiated by local device */ 3437899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth case BTM_PAIR_STATE_WAIT_PIN_REQ: 3438899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!memcmp (evt_data.bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN)) 34395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3440899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = BTM_DEFAULT_DD_AUTH_REQ; 34415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 34435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3444899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth err_code = HCI_ERR_HOST_BUSY_PAIRING; 34455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3446899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 3447899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3448899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* any other state is unexpected */ 3449899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth default: 34505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_HOST_BUSY_PAIRING; 3451899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_ERROR("%s: Unexpected Pairing state received %d", __FUNCTION__, 3452899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.pairing_state); 3453899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth break; 34545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_disabled) 3457899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3458899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* pairing is not allowed */ 3459899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: Pairing is not allowed -> fail pairing.", __FUNCTION__); 34605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3461899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3462899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3463899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3464899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BOOLEAN local_supports_sc = controller_get_interface()->supports_secure_connections(); 3465899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* device in Secure Connections Only mode */ 3466899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (!(local_supports_sc) || !(p_dev_rec->remote_supports_secure_connections)) 3467899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3468899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: SC only service, local_support_for_sc %d,", 3469899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth " remote_support_for_sc 0x%02x -> fail pairing", __FUNCTION__, 3470899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth local_supports_sc, p_dev_rec->remote_supports_secure_connections); 3471899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3472899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth err_code = HCI_ERR_PAIRING_NOT_ALLOWED; 3473899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3474899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 34755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (err_code != 0) 34775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 34795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 34805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectFalse-positive: evt_data.bd_addr is set at the beginning with: STREAM_TO_BDADDR (evt_data.bd_addr, p); 34815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 34825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_neg_reply(evt_data.bd_addr, err_code); 34835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 34845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 34855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.is_orig = is_orig; 34875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 34885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_orig) 34895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 34905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local device initiated the pairing non-bonding -> use p_cur_service */ 34915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) && 34925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service && 34935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->security_flags & BTM_SEC_OUT_AUTHENTICATE)) 34945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3495899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3496899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3497899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* SC only mode device requires MITM protection */ 3498899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = BTM_AUTH_SP_YES; 3499899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3500899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 3501899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3502899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req = (p_dev_rec->p_cur_service->security_flags & 3503899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_SEC_OUT_MITM)? BTM_AUTH_SP_YES : BTM_AUTH_SP_NO; 3504899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 35055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 35095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 35105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 35125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 35145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 35155738f83aeb59361a0a2eda2460113f6dc919427The 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); 35165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 35175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 35185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 35195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); 35215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = BTM_SUCCESS; 35235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) 35245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; 35265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* link key upgrade: always use SPGB_YES - assuming we want to save the link key */ 35285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = BTM_AUTH_SPGB_YES; 35295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btm_cb.api.p_sp_callback) 35315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the callback function implementation may change the IO capability... */ 35335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project callback_rc = (*btm_cb.api.p_sp_callback) (BTM_SP_IO_REQ_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 35345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 35375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((callback_rc == BTM_SUCCESS) || (BTM_OOB_UNKNOWN != evt_data.oob_data)) 35385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 35395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (callback_rc == BTM_SUCCESS) 35405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 35415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD)) 35435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.auth_req = (BTM_AUTH_DD_BOND | (evt_data.auth_req & BTM_AUTH_YN_BIT)); 35455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3547899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (btm_cb.security_mode == BTM_SEC_MODE_SC) 3548899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 3549899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* At this moment we know that both sides are SC capable, device in */ 3550899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* SC only mode requires MITM for any service so let's set MITM bit */ 3551899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.auth_req |= BTM_AUTH_YN_BIT; 3552899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: for device in \"SC only\" mode set auth_req to 0x%02x", 3553899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, evt_data.auth_req); 3554899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 3555899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 3556899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* if the user does not indicate "reply later" by setting the oob_data to unknown */ 3557899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth /* send the response right now. Save the current IO capability in the control block */ 35585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req = evt_data.auth_req; 35595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_io_caps = evt_data.io_cap; 35605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3561899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: State: %s IO_CAP:%d oob_data:%d auth_req:%d", 3562899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__, btm_pair_state_descr(btm_cb.pairing_state), evt_data.io_cap, 3563899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth evt_data.oob_data, evt_data.auth_req); 35645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply(evt_data.bd_addr, evt_data.io_cap, 35665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.oob_data, evt_data.auth_req); 35675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 35695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 35715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_io_capabilities_rsp 35735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when the IO capability of the 35755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** specified device is received 35765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 35785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 35795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 35805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_io_capabilities_rsp (UINT8 *p) 35815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 35825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 35835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_IO_RSP evt_data; 35845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 35865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.io_cap, p); 35875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.oob_data, p); 35885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (evt_data.auth_req, p); 35895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate a new device record or reuse the oldest one */ 35915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (evt_data.bd_addr); 35925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If no security is in progress, this indicates incoming security */ 35945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 35955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 35965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN); 35975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 35985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_INCOMING_SSP); 35995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 36015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 36025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* work around for FW bug */ 36045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_stop_on_ssp(); 36055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 36085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (evt_data.bd_addr); 36095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We must have a device record here. 36115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use the connecting device's CoD for the connection */ 36125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* coverity[uninit_use_in_call] 36135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectEvent uninit_use_in_call: Using uninitialized element of array "evt_data.bd_addr" in call to function "memcmp" 36145738f83aeb59361a0a2eda2460113f6dc919427The 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); 36155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 36165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!memcmp (evt_data.bd_addr, btm_cb.connecting_bda, BD_ADDR_LEN)) 36175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, btm_cb.connecting_dc, DEV_CLASS_LEN); 36185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* peer sets dedicated bonding bit and we did not initiate dedicated bonding */ 36205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_INCOMING_SSP /* peer initiated bonding */ 36215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (evt_data.auth_req & BTM_AUTH_DD_BOND) ) /* and dedicated bonding bit is set */ 36225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PEER_STARTED_DD; 36245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the IO capability in the device record */ 36275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_io_caps = evt_data.io_cap; 36285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rmt_auth_req = evt_data.auth_req; 36295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 36315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_IO_RSP_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 36325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 36335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 36355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_proc_sp_req_evt 36375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 36395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_USER_CONFIRMATION_REQUEST_EVT 36405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_REQUEST_EVT 36415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or HCI_USER_PASSKEY_NOTIFY_EVT 36425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 36445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 36455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 36465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_proc_sp_req_evt (tBTM_SP_EVT event, UINT8 *p) 36475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 36485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status = BTM_ERR_PROCESSING; 36495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_EVT_DATA evt_data; 36505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda = evt_data.cfm_req.bd_addr; 36515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 36525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All events start with bd_addr */ 36545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 36555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_proc_sp_req_evt() BDA: %08x%04x event: 0x%x, State: %s", 36575738f83aeb59361a0a2eda2460113f6dc919427The 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], 36585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event, btm_pair_state_descr(btm_cb.pairing_state)); 36595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( ((p_dev_rec = btm_find_dev (p_bda)) != NULL) 36615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 36625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 36635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 36655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.cfm_req.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 36665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S ((char *)evt_data.cfm_req.bd_name, sizeof(evt_data.cfm_req.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN); 36685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 36705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_CFM_REQ_EVT: 36725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Numeric confirmation. Need user to conf the passkey */ 36735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); 36745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The device record must be allocated in the "IO cap exchange" step */ 36765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.cfm_req.num_val, p); 36775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = TRUE; 36795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process user confirm req in association with the auth_req param */ 36815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_IO) 36825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_dev_rec->rmt_io_caps == BTM_IO_CAP_IO) 36835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.devcb.loc_io_caps == BTM_IO_CAP_IO) 36845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->rmt_auth_req & BTM_AUTH_SP_YES) || (btm_cb.devcb.loc_auth_req & BTM_AUTH_SP_YES)) ) 36855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 36865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Both devices are DisplayYesNo and one or both devices want to authenticate 36875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project -> use authenticated link key */ 36885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works = FALSE; 36895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 36905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 36915344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_proc_sp_req_evt() just_works:%d, io loc:%d, rmt:%d, auth loc:%d, rmt:%d", 36925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.just_works, btm_cb.devcb.loc_io_caps, p_dev_rec->rmt_io_caps, 36935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.devcb.loc_auth_req, p_dev_rec->rmt_auth_req); 36945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_auth_req = btm_cb.devcb.loc_auth_req; 36965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_auth_req = p_dev_rec->rmt_auth_req; 36975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.loc_io_caps = btm_cb.devcb.loc_io_caps; 36985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.cfm_req.rmt_io_caps = p_dev_rec->rmt_io_caps; 36995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 37005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_NOTIF_EVT: 37025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Passkey notification (other side is a keyboard) */ 37035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32 (evt_data.key_notif.passkey, p); 37045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey); 37065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 37085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 37095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 37115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_SP_KEY_REQ_EVT: 37125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* HCI_USER_PASSKEY_REQUEST_EVT */ 37135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_KEY_ENTRY); 37145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 37155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 37195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (*btm_cb.api.p_sp_callback) (event, (tBTM_SP_EVT_DATA *)&evt_data); 37215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_NOT_AUTHORIZED) 37225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 37245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else BTM_NOT_AUTHORIZED means when the app wants to reject the req right now */ 37265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ( (event == BTM_SP_CFM_REQ_EVT) && (evt_data.cfm_req.just_works == TRUE) ) 37285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* automatically reply with just works if no sp_cback */ 37305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_SUCCESS; 37315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTM_SP_CFM_REQ_EVT) 37345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("calling BTM_ConfirmReqReply with status: %d", status); 37365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ConfirmReqReply (status, p_bda); 37375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 37395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTM_SP_KEY_REQ_EVT) 37405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PasskeyReqReply(status, p_bda, 0); 37425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 37455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Something bad. we can only fail this connection */ 37485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 37495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SP_CFM_REQ_EVT == event) 37515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_bda, FALSE); 37535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (BTM_SP_KEY_NOTIF_EVT == event) 37555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do nothing -> it very unlikely to happen. 37575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project This event is most likely to be received by a HID host when it first connects to a HID device. 37585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project Usually the Host initiated the connection in this case. 37595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project On Mobile platforms, if there's a security process happening, 37605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the host probably can not initiate another connection. 37615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTW (PC) is another story. */ 37625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL != (p_dev_rec = btm_find_dev (p_bda)) ) 37635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (p_dev_rec->hci_handle, HCI_ERR_AUTH_FAILURE); 37655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 37685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 37695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_bda); 37715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 37725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 37735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 37745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 37765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_keypress_notif_evt 37785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a key press notification is 37805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** received 37815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 37835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 37845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 37855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_keypress_notif_evt (UINT8 *p) 37865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 37875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_KEYPRESS evt_data; 37885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 37895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* parse & report BTM_SP_KEYPRESS_EVT */ 37915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 37925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 37935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 37945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 37965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.notif_type = *p; 37975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 37985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_KEYPRESS_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 37995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_simple_pair_complete 38055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when simple pairing process is 38075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** complete 38085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_simple_pair_complete (UINT8 *p) 38135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_COMPLT evt_data; 38155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 38165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status; 38175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN disc = FALSE; 38185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = *p++; 38205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (evt_data.bd_addr, p); 38215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (evt_data.bd_addr)) == NULL) 38235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38245344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_simple_pair_complete() with unknown BDA: %08x%04x", 38255738f83aeb59361a0a2eda2460113f6dc919427The 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], 38265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (evt_data.bd_addr[4] << 8) + evt_data.bd_addr[5]); 38275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 38285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38305344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_simple_pair_complete() Pair State: %s Status:%d sec_state: %u", 38315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), status, p_dev_rec->sec_state); 38325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 38345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 38355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 38375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 38385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 38405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_PAIRING_NOT_ALLOWED) 38425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The test spec wants the peer device to get this failure code. */ 38445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_DISCONNECT); 38455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Change the timer to 1 second */ 38475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); 38485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (memcmp (btm_cb.pairing_bda, evt_data.bd_addr, BD_ADDR_LEN) == 0) 38505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop the timer */ 38525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.pairing_tle); 38535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 38555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the initiating side: will receive auth complete event. disconnect ACL at that time */ 38575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 38585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 38615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disc = TRUE; 38625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let the pairing state stay active, p_auth_complete_callback will report the failure */ 38655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 38665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 38675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 38695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_COMPLT_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 38705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (disc) 38725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 38735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed */ 3874db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta /* Avoid sending disconnect on HCI_ERR_PEER_USER */ 3875db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if ((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST)) 3876db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 3877db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 3878db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 38795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 38805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 38815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 38825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 38835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 38845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_rem_oob_req 38865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process/report 38885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** HCI_REMOTE_OOB_DATA_REQUEST_EVT 38895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 38915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 38925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 38935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_rem_oob_req (UINT8 *p) 38945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 38955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_bda; 38965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_RMT_OOB evt_data; 38975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 38985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 c; 38995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 r; 39005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda = evt_data.bd_addr; 39025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_BDADDR (p_bda, p); 39045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39055344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_rem_oob_req() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 39065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 39075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (NULL != (p_dev_rec = btm_find_dev (p_bda))) && 39095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.api.p_sp_callback) 39105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN); 39125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (evt_data.dev_class, p_dev_rec->dev_class, DEV_CLASS_LEN); 39135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BCM_STRNCPY_S((char *)evt_data.bd_name, sizeof(evt_data.bd_name), (char *)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN+1); 3914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt_data.bd_name[BTM_MAX_REM_BD_NAME_LEN] = 0; 39155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); 39175738f83aeb59361a0a2eda2460113f6dc919427The 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) 39185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_RemoteOobDataReply(TRUE, p_bda, c, r); 39205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 39225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* something bad. we can only fail this connection */ 39255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.acl_disc_reason = HCI_ERR_HOST_REJECT_SECURITY; 39265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_bda); 39275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_read_local_oob_complete 39325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when read local oob data is 39345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 39355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_read_local_oob_complete (UINT8 *p) 39405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SP_LOC_OOB evt_data; 39425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = *p++; 39435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_read_local_oob_complete:%d", status); 39455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 39465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_SUCCESS; 39485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.c, p); 39495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_ARRAY16(evt_data.r, p); 39505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt_data.status = BTM_ERR_PROCESSING; 39535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_sp_callback) 39555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_sp_callback) (BTM_SP_LOC_OOB_EVT, (tBTM_SP_EVT_DATA *)&evt_data); 39565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */ 39585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_collision 39625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when authentication or encryption 39645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** needs to be retried at a later time. 39655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 39675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 39685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 39695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_auth_collision (UINT16 handle) 39705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 39715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 39725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.collision_start_time) 3974c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btm_cb.collision_start_time = GKI_get_os_tick_count(); 39755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3976c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati if ((GKI_get_os_tick_count() - btm_cb.collision_start_time) < btm_cb.max_collision_delay) 39775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (handle == BTM_SEC_INVALID_HANDLE) 39795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_AUTHENTICATING)) == NULL) 39815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_find_dev_by_sec_state (BTM_SEC_STATE_ENCRYPTING); 39825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 39845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev_by_handle (handle); 39855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec != NULL) 39875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 39885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_auth_collision: state %d (retrying in a moment...)", p_dev_rec->sec_state); 39895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will restart authentication after timeout */ 39905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state == BTM_SEC_STATE_AUTHENTICATING || p_dev_rec->sec_state == BTM_SEC_STATE_ENCRYPTING) 39915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = 0; 39925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 39935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 39945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = (UINT32) btm_sec_collision_timeout; 39955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, BT_1SEC_TIMEOUT); 39965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 39985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 39995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 40015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 40025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_auth_complete 40035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 40045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when authentication of the connection is 40055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 40065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 40075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 40085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 40095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 40105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_auth_complete (UINT16 handle, UINT8 status) 40115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 40125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_sm4; 40135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 40145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 40155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN are_bonding = FALSE; 40165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 40185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 40205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 40215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d dev->sec_state: %u Bda:%08x, RName:%s", 40235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 40245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status, 40255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state, 40265738f83aeb59361a0a2eda2460113f6dc919427The 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], 40275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 40285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 40305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: auth_complete PairState: %s handle:%u status:%d", 40325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr (btm_cb.pairing_state), 40335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, status); 40345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 40365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 40385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 40395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 40405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 40425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 40455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 40475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if connection was made just to do bonding. If we authenticate 40495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the connection that is up, this is the last event received. 40505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec 40525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 40535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !(btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE)) 40545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 40565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 40585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 40615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* keep the old sm4 flag and clear the retry bit in control block */ 40645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project old_sm4 = p_dev_rec->sm4; 40655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_RETRY; 40665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 40685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 40695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 40705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project are_bonding = TRUE; 40715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4072e11f228d1a18486cd00c36487812a763487a236fSrinu Jella if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 4073e11f228d1a18486cd00c36487812a763487a236fSrinu Jella && (memcmp (p_dev_rec->bd_addr, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) ) 4074e11f228d1a18486cd00c36487812a763487a236fSrinu Jella btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 40755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_AUTHENTICATING) 40775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.api.p_auth_complete_callback && status != HCI_SUCCESS) 40795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (old_state != BTM_PAIR_STATE_IDLE) ) 40805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 40825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 40835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 40845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 40865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 40875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be a race condition, when we are starting authentication and 40895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the peer device is doing encryption. 40905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** If first we receive encryption change up, then initiated authentication 40915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** can not be performed. According to the spec we can not do authentication 40925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** on the encrypted link, so device is correct. 40935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 40945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_COMMAND_DISALLOWED) 40955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->sec_flags & (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED)) == 40965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED))) 40975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 40985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = HCI_SUCCESS; 40995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Currently we do not notify user if it is a keyboard which connects */ 41015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* User probably Disabled the keyboard while it was asleap. Let her try */ 41025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 41035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* report the suthentication status */ 41055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state != BTM_PAIR_STATE_IDLE) 41065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 41075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 41085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 41095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 41125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is a bonding procedure can disconnect the link now */ 41145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (are_bonding) 41155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 41175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 4119db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta { 4120db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta if(((status != HCI_ERR_PEER_USER) && (status != HCI_ERR_CONN_CAUSE_LOCAL_HOST))) 4121db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_PEER_USER, p_dev_rec->hci_handle); 4122db9ad595f2c29df469559d6d49a178e6b75db5d6Hemant Gupta } 41235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("TRYING TO DECIDE IF CAN USE SMP_BR_CHNL"); 4126e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec->new_encryption_key_is_p256 && (btm_sec_use_smp_br_chnl(p_dev_rec)) 4127e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* no LE keys are available, do deriving */ 4128e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || 4129e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* or BR key is higher security than existing LE keys */ 4130e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) && 4131e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) 4132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("link encrypted afer dedic bonding can use SMP_BR_CHNL"); 41345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_is_master(p_dev_rec)) 4136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4137e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // Encryption is required to start SM over BR/EDR 4138e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // indicate that this is encryption after authentication 4139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SetEncryption(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, NULL, NULL); 4140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji l2cu_start_post_bond_timer (p_dev_rec->hci_handle); 4143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4144e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 41455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If authentication failed, notify the waiting layer */ 41495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 41505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((old_sm4 & BTM_SM4_RETRY) == 0) 41525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow retry only once */ 41545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_LMP_ERR_TRANS_COLLISION) 41555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 41575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 41585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Collision retry sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 41595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this retry for missing key is for Lisbon or later only. 41615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Legacy device do not need this. the controller will drive the retry automatically */ 41625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (HCI_ERR_KEY_MISSING == status && BTM_SEC_IS_SM4(p_dev_rec->sm4)) 41635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* not retried yet. set the retry bit */ 41655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 |= BTM_SM4_RETRY; 41665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 41675344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("Retry for missing key sm4:x%x sec_flags:0x%x", p_dev_rec->sm4, p_dev_rec->sec_flags); 41685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* With BRCM controller, we do not need to delete the stored link key in controller. 41705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project If the stack may sit on top of other controller, we may need this 41715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_DeleteStoredLinkKey (bd_addr, NULL); */ 41725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_RETRY) 41755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_execute_procedure (p_dev_rec); 41775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 41825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE) 41845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 41857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 41865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 41885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 41895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 41905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHENTICATED; 41915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4192818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4193818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4194818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4195818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // If we have MITM protection we have a higher level of security than 4196818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde // provided by 16 digits PIN 4197818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4198818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4199818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 42005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Authentication succeeded, execute the next security procedure, if any */ 42015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = btm_sec_execute_procedure (p_dev_rec); 42025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 42045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 42057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 42065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 42075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 42095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_encrypt_change 42115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when encryption of the connection is 42135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** completed by the LM 42145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 42165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 42175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 42185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_encrypt_change (UINT16 handle, UINT8 status, UINT8 encr_enable) 42195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 42205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 4221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 42227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tACL_CONN *p_acl = NULL; 42237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 acl_idx = btm_handle_to_acl_index(handle); 4224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 42255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: encrypt_change status:%d State:%d, encr_enable = %d", 42265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status, (p_dev_rec) ? p_dev_rec->sec_state : 0, encr_enable); 42275344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("before update p_dev_rec->sec_flags=0x%x", (p_dev_rec) ? p_dev_rec->sec_flags : 0 ); 42285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For transaction collision we need to wait and repeat. There is no need */ 42305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for random timeout because only slave should receive the result */ 4231e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if ((status == HCI_ERR_LMP_ERR_TRANS_COLLISION) || 4232e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (status == HCI_ERR_DIFF_TRANSACTION_COLLISION)) 42335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 42345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_auth_collision(handle); 42355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.collision_start_time = 0; 42385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 42405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && encr_enable) 42437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 4244818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->hci_handle == handle) { 42457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED); 4246818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4247818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4248818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4249818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4250818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4251818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 42527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 4253818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde { 42547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_LE_AUTHENTICATED | BTM_SEC_LE_ENCRYPTED); 4255818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 42567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 42575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* It is possible that we decrypted the link to perform role switch */ 42595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mark link not to be encrypted, so that when we execute security next time it will kick in again */ 42605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_SUCCESS) && !encr_enable) 42617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 42627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec->hci_handle == handle) 42637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_ENCRYPTED; 42647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 42657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~BTM_SEC_LE_ENCRYPTED; 42667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 42675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 42685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("after update p_dev_rec->sec_flags=0x%x", p_dev_rec->sec_flags ); 4269ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 42705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 4271e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (acl_idx != MAX_L2CAP_LINKS) 42727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl = &btm_cb.acl_db[acl_idx]; 4273ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 4274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_check_pending_enc_req (p_dev_rec, p_acl->transport, encr_enable); 4275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 42767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_acl && p_acl->transport == BT_TRANSPORT_LE) 42775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4278e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (status == HCI_ERR_KEY_MISSING || status == HCI_ERR_AUTH_FAILURE || 4279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) 4280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4281d2246b6ebdc1db60c2db8dd0e34a3121a71117e9Priti Aghera p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN); 4282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 4283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4284dea4f9b42fd373d8a46565d933ec49a6583a9117Satya Calloji btm_ble_link_encrypted(p_dev_rec->ble.pseudo_addr, encr_enable); 42855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 42865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 42875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4288e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 42895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* BR/EDR connection, update the encryption key size to be 16 as always */ 42905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 16; 4291e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4293e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("in %s new_encr_key_256 is %d", 4294e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, p_dev_rec->new_encryption_key_is_p256); 4295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((status == HCI_SUCCESS) && encr_enable && (p_dev_rec->hci_handle == handle)) 4297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->new_encryption_key_is_p256) 4299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_sec_use_smp_br_chnl(p_dev_rec) && 4301e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_sec_is_master(p_dev_rec) && 4302e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* if LE key is not known, do deriving */ 4303e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags &BTM_SEC_LE_LINK_KEY_KNOWN) || 4304e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* or BR key is higher security than existing LE keys */ 4305e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (!(p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_AUTHED) 4306e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED)))) 4307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* BR/EDR is encrypted with LK that can be used to derive LE LTK */ 4309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->new_encryption_key_is_p256 = FALSE; 4310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4311e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec->no_smp_on_br) 4312e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4313e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("%s NO SM over BR/EDR", __func__); 4314e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4315e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 4316e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4317e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("%s start SM over BR/EDR", __func__); 4318e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_BR_PairWith(p_dev_rec->bd_addr); 4319e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4323e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4324e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // BR/EDR is successfully encrypted. Correct LK type if needed 4325e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun // (BR/EDR LK derived from LE LTK was used for encryption) 4326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((encr_enable == 1) && /* encryption is ON for SSP */ 4327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* LK type is for BR/EDR SC */ 4328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || 4329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) 4332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; 4333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ 4334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; 4335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("updated link key type to %d", p_dev_rec->link_key_type); 4337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_send_link_key_notif(p_dev_rec); 4338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#else 4342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_sec_check_pending_enc_req (p_dev_rec, BT_TRANSPORT_BR_EDR, encr_enable); 4343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif /* BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE */ 43445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this encryption was started by peer do not need to do anything */ 43465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != BTM_SEC_STATE_ENCRYPTING) 43475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_STATE_DELAY_FOR_ENC == p_dev_rec->sec_state) 43495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 43515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 43525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_resubmit_pending_sec_req (p_dev_rec->bd_addr); 43535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 43585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If encryption setup failed, notify the waiting layer */ 43595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 43605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 43625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 43635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 43645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Encryption setup succeeded, execute the next security procedure, if any */ 43665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = (UINT8)btm_sec_execute_procedure (p_dev_rec); 43675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is no next procedure, or procedure failed to start, notify the caller */ 43685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 43697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, status, FALSE); 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_connect_after_reject_timeout 43755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Connection for bonding could not start because of the collision 43775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Initiate outgoing connection 43785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 43805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 43815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 43825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_connect_after_reject_timeout (TIMER_LIST_ENT *p_tle) 43835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 43845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_cb.p_collided_dev_rec; 43855cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 43865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43875344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_connect_after_reject_timeout()"); 43885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = 0; 43895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = 0; 43905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) 43925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 43935344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connect_after_reject_timeout: failed to start connection"); 43945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 43965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.api.p_auth_complete_callback) 43985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 43995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_MEMORY_FULL); 44005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 44025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 44045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 44055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_connected 44065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 44075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 44085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** establsihed 44095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 44105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 44115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 44125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 44135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_connected (UINT8 *bda, UINT16 handle, UINT8 status, UINT8 enc_mode) 44145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 44155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bda); 44165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 res; 44175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_pairing_device = FALSE; 44185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tACL_CONN *p_acl_cb; 44197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT8 bit_shift = 0; 44205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 44225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Commenting out trace due to obf/compilation problems. 44245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 44255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 44265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec) 44275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x RName:%s", 44295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 44305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5], 44315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name); 44325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: btm_sec_connected in state: %s handle:%d status:%d enc_mode:%d bda:%x ", 44365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), handle, status, enc_mode, 44375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bda[2]<<24)+(bda[3]<<16)+(bda[4]<<8)+bda[5]); 44385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 44425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no device record for new connection. Allocate one */ 44445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_SUCCESS) 44455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_sec_alloc_dev (bda); 44475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* can not find the device record and the status is error, 44515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * just ignore it */ 44525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* Update the timestamp for this device */ 44565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 44587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 44597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta bit_shift = (handle == p_dev_rec->ble_hci_handle) ? 8 :0; 44607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 44615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->timestamp = btm_cb.dev_rec_count++; 44625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) 44635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* tell L2CAP it's a bonding connection. */ 44655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 44665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 44675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 44685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming connection failed while pairing, then try to connect and continue */ 44705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Motorola S9 disconnects without asking pin code */ 44715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status != HCI_SUCCESS)&&(btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ)) 44725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: incoming connection failed without asking PIN"); 44745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 44755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 44765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 44775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 44795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 44805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 44815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout; 44825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); 44835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 44877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR); 44885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 44905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 44915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 44925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 44935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 44955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 44965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding(p_dev_rec->bd_addr, TRUE); 44975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 44995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always clear the pending flag */ 45005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= ~BTM_SM4_CONN_PEND; 45015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_INCLUDED == TRUE 45057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->device_type |= BT_DEVICE_TYPE_BREDR; 45067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 45077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 45085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 45095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 45105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 45115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 45145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 45155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, bda, BD_ADDR_LEN) == 0) ) 45165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we rejected incoming connection from bonding device */ 45185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((status == HCI_ERR_HOST_REJECT_DEVICE) 45195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &&(btm_cb.pairing_flags & BTM_PAIR_FLAGS_REJECTED_CONNECT)) 45205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: HCI_Conn_Comp Flags:0x%04x, sm4: 0x%x", 45225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags, p_dev_rec->sm4); 45235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; 45255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) 45265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ 45285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_GET_REM_NAME); 45297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR); 45305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we already have pin code */ 45345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_PIN) 45355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start timer with 0 to initiate connection with new LCB */ 45375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* because L2CAP will delete current LCB with this event */ 45385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.p_collided_dev_rec = p_dev_rec; 45395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = (UINT32) btm_sec_connect_after_reject_timeout; 45405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.sec_collision_tle, BTU_TTYPE_USER_FUNC, 0); 45415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait for incoming connection without resetting pairing state */ 45465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (status == HCI_ERR_CONNECTION_EXISTS) 45475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45485344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("Security Manager: btm_sec_connected: Wait for incoming connection"); 45495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 45505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_pairing_device = TRUE; 45535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 45565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 45575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if connection fails during pin request, notify application */ 45595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != HCI_SUCCESS) 45605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection failed because of during pairing, need to tell user */ 45625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_pairing_device) 45635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED) << bit_shift); 45665344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("security_required:%x ", p_dev_rec->security_required ); 45675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 45695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 45715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 45725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 45745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 45755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 45765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 45787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* 45797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta Do not send authentication failure, if following conditions hold good 45807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1. BTM Sec Pairing state is idle 45817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 2. Link key for the remote device is present. 45827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3. Remote is SSP capable. 45837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta */ 45847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else if ((p_dev_rec->link_key_type <= BTM_LKEY_TYPE_REMOTE_UNIT) && 45857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (((status == HCI_ERR_AUTH_FAILURE) || 45865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_KEY_MISSING) || 45875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_HOST_REJECT_SECURITY) || 45885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_NOT_ALLOWED) || 45895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_UNIT_KEY_USED) || 45905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED) || 45915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (status == HCI_ERR_ENCRY_MODE_NOT_ACCEPTABLE) || 45927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (status == HCI_ERR_REPEATED_ATTEMPTS)))) 45935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 45945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 45957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~ (BTM_SEC_LE_LINK_KEY_KNOWN << bit_shift); 45967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 45977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 45987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#ifdef BRCM_NOT_4_BTE 45997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* If we rejected pairing, pass this special result code */ 46007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.acl_disc_reason == HCI_ERR_HOST_REJECT_SECURITY) 46017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 46027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta status = HCI_ERR_HOST_REJECT_SECURITY; 46037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 46047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 46055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify host that the key is not known any more */ 46075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 46085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 46105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 46115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, status); 46125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == HCI_ERR_CONNECTION_TOUT || status == HCI_ERR_LMP_RESPONSE_TIMEOUT || 46165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status == HCI_ERR_UNSPECIFIED || status == HCI_ERR_PAGE_TIMEOUT) 46177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_DEVICE_TIMEOUT, FALSE); 46185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 46197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, BTM_ERR_PROCESSING, FALSE); 46205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If initiated dedicated bonding, return the link key now, and initiate disconnect */ 46255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If dedicated bonding, and we now have a link key, we are all done */ 46265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( is_pairing_device 46275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) ) 46285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->link_key_not_sent) 46305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = FALSE; 46325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_send_link_key_notif(p_dev_rec); 46335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~BTM_SEC_OUT_AUTHENTICATE; 46365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remember flag before it is initialized */ 46385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 46395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = TRUE; 46405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 46415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = FALSE; 46425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 46445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 46455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 46465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 46475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 46495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( res ) 46515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Let l2cap start bond timer */ 46535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (p_dev_rec->bd_addr, TRUE); 46545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 46575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->hci_handle = handle; 46605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* role may not be correct here, it will be updated by l2cap, but we need to */ 46625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* notify btm_acl that link is up, so starting of rmt name request will not */ 46635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set paging flag up */ 46647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_acl_cb = btm_bda_to_acl(bda, BT_TRANSPORT_BR_EDR); 46655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_acl_cb) 46665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 46675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT event */ 46685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (!defined(BTM_BYPASS_EXTRA_ACL_SETUP) || BTM_BYPASS_EXTRA_ACL_SETUP == FALSE) 46695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For now there are a some devices that do not like sending */ 46705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* commands events and data at the same time. */ 46715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the packet types to the default allowed by the device */ 46725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_set_packet_types (p_acl_cb, btm_cb.btm_acl_pkt_types_supported); 46735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.btm_def_link_policy) 46755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetLinkPolicy (p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy); 46765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 46775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 46787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh 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); 46795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize security flags. We need to do that because some */ 46815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* authorization complete could have come after the connection is dropped */ 46825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* and that would set wrong flag that link has been authorized already */ 46837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~((BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | 46847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTM_SEC_ENCRYPTED | BTM_SEC_ROLE_SWITCHED) << bit_shift); 46855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (enc_mode != HCI_ENCRYPT_MODE_DISABLED) 46877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= ((BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED) << bit_shift); 46885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 46895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode == BTM_SEC_MODE_LINK) 46907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags |= (BTM_SEC_AUTHENTICATED << bit_shift); 46915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4692818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4693818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4694818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4695818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= (BTM_SEC_16_DIGIT_PIN_AUTHED << bit_shift); 4696818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4697818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 46985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_changed = FALSE; 46995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* After connection is established we perform security if we do not know */ 47015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the name, or if we are originator because some procedure can have */ 47025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* been scheduled while connection was down */ 47035344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("is_originator:%d ", p_dev_rec->is_originator); 47045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) || p_dev_rec->is_originator) 47055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((res = btm_sec_execute_procedure (p_dev_rec)) != BTM_CMD_STARTED) 47077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (p_dev_rec, res, FALSE); 47085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 47105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 47115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 47135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnect 47155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to disconnect HCI link 47175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns btm status 47195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 47215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_sec_disconnect (UINT16 handle, UINT8 reason) 47225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 47235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 47245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In some weird race condition we may not have a record */ 47265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 47275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_disconnect (handle, reason); 47295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 47305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 47335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 47345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0) 47355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) ) 47365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are currently doing bonding. Link will be disconnected when done */ 47385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_DISC_WHEN_DONE; 47395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_BUSY); 47405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 47415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return(btm_sec_send_hci_disconnect(p_dev_rec, reason, handle)); 47435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 47445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 47465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_disconnected 47485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is when a connection to the peer device is 47505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** dropped 47515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 47535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 47545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 47555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_disconnected (UINT16 handle, UINT8 reason) 47565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 47575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev_by_handle (handle); 47585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 old_pairing_flags = btm_cb.pairing_flags; 47595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int result = HCI_ERR_AUTH_FAILURE; 4760ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach tBTM_SEC_CALLBACK *p_callback = NULL; 47617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; 47625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If page was delayed for disc complete, can do it now */ 47645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.discing = FALSE; 47655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_acl_resubmit_page(); 47675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev_rec) 47695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 47705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR: BT_TRANSPORT_LE; 47727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 4774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 47755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_DISC_DURING_RS == TRUE 4776f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton LOG_INFO("%s clearing pending flag handle:%d reason:%d", __func__, handle, reason); 47775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->rs_disc_pending = BTM_SEC_RS_NOT_PENDING; /* reset flag */ 47785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 47795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear unused flags */ 47815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 &= BTM_SM4_TRUE; 47825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4783f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton uint8_t *bd_addr = (uint8_t *)p_dev_rec->bd_addr; 4784f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s sec_req:x%x state:%s reason:%d bd_addr:%02x:%02x:%02x:%02x:%02x:%02x" 4785f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton " remote_name:%s", __func__, p_dev_rec->security_required, btm_pair_state_descr(btm_cb.pairing_state), 4786f8027005333c88a2f097cfd70d15c3d54c7764aeChris 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); 47875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4788f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s before update sec_flags=0x%x", __func__, p_dev_rec->sec_flags); 47895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are in the process of bonding we need to tell client that auth failed */ 47915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 47925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0)) 47935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 47955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; 47965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 47975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 47985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If the disconnection reason is REPEATED_ATTEMPTS, 47995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project send this error message to complete callback function 48005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project to display the error message of Repeated attempts. 48015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project All others, send HCI_ERR_AUTH_FAILURE. */ 48025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reason == HCI_ERR_REPEATED_ATTEMPTS) 48035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_REPEATED_ATTEMPTS; 48055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 48075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 48085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = HCI_ERR_HOST_REJECT_SECURITY; 48095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 48115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, result); 48125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 48145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 48165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->enc_key_size = 0; 481724adb37e4106bf8544c7729d34451fdf2777c4dcPriti Aghera btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, p_dev_rec->bd_addr, HCI_SUCCESS); 48185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* see sec_flags processing in btm_acl_removed */ 48197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 48207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (transport == BT_TRANSPORT_LE) 48217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 48227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->ble_hci_handle = BTM_SEC_INVALID_HANDLE; 48237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_flags &= ~(BTM_SEC_LE_AUTHENTICATED|BTM_SEC_LE_ENCRYPTED); 48247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 48257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 48265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 48277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 48287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->hci_handle = BTM_SEC_INVALID_HANDLE; 4829818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags &= ~(BTM_SEC_AUTHORIZED | BTM_SEC_AUTHENTICATED | BTM_SEC_ENCRYPTED 4830818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_ROLE_SWITCHED | BTM_SEC_16_DIGIT_PIN_AUTHED); 48317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 48325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4833444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE && SMP_INCLUDED == TRUE 4834444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) 4835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE) ? 4837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_SEC_STATE_DISCONNECTING : BTM_SEC_STATE_DISCONNECTING_BLE; 4838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 4839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 48417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 48425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required = BTM_SEC_NONE; 4843ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4844ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_callback = p_dev_rec->p_callback; 4845ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4846ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach /* if security is pending, send callback to clean up the security state */ 4847ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach if(p_callback) 4848ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach { 4849ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach p_dev_rec->p_callback = NULL; /* when the peer device time out the authentication before 4850ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach we do, this call back must be reset here */ 48517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (*p_callback) (p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data, BTM_ERR_PROCESSING); 4852ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach } 4853ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach 4854f8027005333c88a2f097cfd70d15c3d54c7764aeChris Manton BTM_TRACE_EVENT("%s after update sec_flags=0x%x", __func__, p_dev_rec->sec_flags); 48555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 48565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 48585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_notification 48605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a new connection link key is 48625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generated 48635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 48655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 48665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 48675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_notification (UINT8 *p_bda, UINT8 *p_link_key, UINT8 key_type) 48685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 48695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 4870444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN we_are_bonding = FALSE; 4871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ltk_derived_lk = FALSE; 48725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() BDA:%04x%08x, TYPE: %d", 48745738f83aeb59361a0a2eda2460113f6dc919427The 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], 48755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key_type); 48765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((key_type >= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_COMBINATION) && 4878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (key_type <= BTM_LTK_DERIVED_LKEY_OFFSET + BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4879444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ltk_derived_lk = TRUE; 4881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key_type -= BTM_LTK_DERIVED_LKEY_OFFSET; 4882444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 48835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection was made to do bonding restore link security if changed */ 48845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 48855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (key_type != BTM_LKEY_TYPE_CHANGED_COMB) 48875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type = key_type; 48885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 48895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_LINK_KEY_KNOWN; 4890818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 4891818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde /* 4892818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * Until this point in time, we do not know if MITM was enabled, hence we 4893818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * add the extended security flag here. 4894818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde */ 4895818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_dev_rec->pin_code_length >= 16 || 4896818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB || 4897818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) { 4898818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags |= BTM_SEC_16_DIGIT_PIN_AUTHED; 4899818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 4900818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 4901ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE) 4902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* BR/EDR connection, update the encryption key size to be 16 as always */ 4903ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->enc_key_size = 16; 4904ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 49055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->link_key, p_link_key, LINK_KEY_LEN); 49065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 49085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (memcmp (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN) == 0) ) 49095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 49115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we_are_bonding = TRUE; 49125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 49135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 49145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* save LTK derived LK no matter what */ 4917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (ltk_derived_lk) 4918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.api.p_link_key_callback) 4920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4921444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() Save LTK derived LK (key_type = %d)", 4922444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, p_dev_rec->link_key_type); 4923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, 4924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->sec_bd_name, 4925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_link_key, p_dev_rec->link_key_type); 4926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4927444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 4929444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) || 4931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) 4932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 4933e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->new_encryption_key_is_p256 = TRUE; 4934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s set new_encr_key_256 to %d", 4935e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun __func__, p_dev_rec->new_encryption_key_is_p256); 4936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 49395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If name is not known at this point delay calling callback until the name is */ 49405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* resolved. Unless it is a HID Device and we really need to send all link keys. */ 49415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 4942e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) != BTM_COD_MAJOR_PERIPHERAL)) 4943e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun && !ltk_derived_lk) 49445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_notification() Delayed BDA: %08x%04x Type:%d", 4946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_bda[0]<<24) + (p_bda[1]<<16) + (p_bda[2]<<8) + p_bda[3], 4947444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_bda[4] << 8) + p_bda[5], key_type); 49485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_not_sent = TRUE; 49505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If it is for bonding nothing else will follow, so we need to start name resolution */ 49525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (we_are_bonding) 49535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(btsnd_hcic_rmt_name_req (p_bda, HCI_PAGE_SCAN_REP_MODE_R1, HCI_MANDATARY_PAGE_SCAN_MODE, 0))) 49555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_rmt_name_failed(); 49565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil 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]) 49595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 49605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If its not us who perform authentication, we should tell stackserver */ 49635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* that some authentication has been completed */ 49645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This is required when different entities receive link notification and auth complete */ 4965e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (!(p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE) 4966e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun /* for derived key, always send authentication callback for BR channel */ 4967e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun || ltk_derived_lk) 49685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 49705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 49715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_SUCCESS); 49725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We will save link key only if the user authorized it - BTE report link key in all cases */ 49755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BRCM_NONE_BTE 49765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_AUTHED) 49775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 49785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 49795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 49805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4981e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (ltk_derived_lk) 4982e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4983e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BTM_TRACE_DEBUG ("btm_sec_link_key_notification() LTK derived LK is saved already" 4984e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun " (key_type = %d)", p_dev_rec->link_key_type); 4985e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 4986e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 4987e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 4988e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*btm_cb.api.p_link_key_callback) (p_bda, p_dev_rec->dev_class, 4989e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_dev_rec->sec_bd_name, 4990e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun p_link_key, p_dev_rec->link_key_type); 4991e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 49925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 49945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 49965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 49975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 49985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 49995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 50015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 50035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 50055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_link_key_request (UINT8 *p_bda) 50065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 50075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_bda); 50085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_link_key_request() BDA: %02x:%02x:%02x:%02x:%02x:%02x", 50105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 50115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5012b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta if( (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_PIN_REQ) && 5013b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (btm_cb.collision_start_time != 0) && 5014b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta (memcmp (btm_cb.p_collided_dev_rec->bd_addr, p_bda, BD_ADDR_LEN) == 0) ) 5015b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta { 5016b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta BTM_TRACE_EVENT ("btm_sec_link_key_request() rejecting link key req " 5017b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta "State: %d START_TIMEOUT : %d", 5018b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btm_cb.pairing_state, btm_cb.collision_start_time); 5019b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta btsnd_hcic_link_key_neg_reply (p_bda); 5020b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta return; 5021b81d729e172638b937ce200a40e7d0e2cecc24b5Hemant Gupta } 50225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 50235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_req_reply (p_bda, p_dev_rec->link_key); 50255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 50265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify L2CAP to increase timeout */ 50295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2c_pin_code_request (p_bda); 50305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The link key is not in the database and it is not known to the manager */ 50325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_link_key_neg_reply (p_bda); 50335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 50345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 50365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pairing_timeout 50385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when host does not provide PIN 50405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** within requested time 50415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 50435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 50445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 50455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_pairing_timeout (TIMER_LIST_ENT *p_tle) 50465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 50475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 50485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 50495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 50505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS == BTM_IO_CAP_NONE) 50515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_NO; 50525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 50535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_AUTH_REQ auth_req = BTM_AUTH_AP_YES; 50545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 50555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 50565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 name[2]; 50575cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 50585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_tle.param = 0; 50605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Coverity: FALSE-POSITIVE error from Coverity tool. Please do NOT remove following comment. */ 50615738f83aeb59361a0a2eda2460113f6dc919427The 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. 50625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*/ 50635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_dev (p_cb->pairing_bda); 50645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pairing_timeout() State: %s Flags: %u", 50665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(p_cb->pairing_state), p_cb->pairing_flags); 50675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->pairing_state) 50695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: 50715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_bond_cancel_complete(); 50725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: 50755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) 50765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_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 /* We need to notify the UI that no longer need the PIN */ 50795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 50805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 50825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 50835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 50845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 50855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 50865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 50875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 50895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 50905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 50915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 50925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 50935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: 50965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_conf_reply (p_cb->pairing_bda, FALSE); 50975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 50985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 50995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) 51015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: 51025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); 51035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ 51045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* !BTM_IO_CAP_NONE */ 51065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_OOB_INCLUDED == TRUE 51085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: 51095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) 51105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project auth_req |= BTM_AUTH_DD_BOND; 51115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_io_cap_req_reply (p_cb->pairing_bda, btm_cb.devcb.loc_io_caps, 51135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_OOB_NONE, auth_req); 51145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: 51185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_rem_oob_neg_reply (p_cb->pairing_bda); 51195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTM_OOB_INCLUDED */ 51225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: 51245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* simple pairing failed. Started a 1-sec timer at simple pairing complete. 51255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * now it's time to tear down the ACL link*/ 51265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 51275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51285344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("btm_sec_pairing_timeout() BTM_PAIR_STATE_WAIT_DISCONNECT unknown BDA: %08x%04x", 51295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->pairing_bda[0]<<24) + (p_cb->pairing_bda[1]<<16) + (p_cb->pairing_bda[2]<<8) + p_cb->pairing_bda[3], 51305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->pairing_bda[4] << 8) + p_cb->pairing_bda[5]); 51315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_send_hci_disconnect (p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle); 51345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: 513805bb84c66dc4813b5da13a7d2db27e80fb613293Srinu Jella case BTM_PAIR_STATE_GET_REM_NAME: 51395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We need to notify the UI that timeout has happened while waiting for authentication*/ 51405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_auth_complete_callback) 51425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec == NULL) 51445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name[0] = 0; 51465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_cb->pairing_bda, 51475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project NULL, 51485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project name, HCI_ERR_CONNECTION_TOUT); 51495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_auth_complete_callback) (p_dev_rec->bd_addr, 51525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 51535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, HCI_ERR_CONNECTION_TOUT); 51545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 51585344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pairing_timeout() not processed state: %s", btm_pair_state_descr(btm_cb.pairing_state)); 51595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); 51605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 51615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 51635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 51655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_pin_code_request 51675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests PIN code 51695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 51715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 51725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 51735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_pin_code_request (UINT8 *p_bda) 51745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 51755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 51765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_CB *p_cb = &btm_cb; 51775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 517857bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#ifdef PORCHE_PAIRING_CONFLICT 517957bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath UINT8 default_pin_code_len = 4; 518057bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath PIN_CODE default_pin_code = {0x30, 0x30, 0x30, 0x30}; 518157bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath#endif 51825344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request() State: %s, BDA:%04x%08x", 51835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state), 51845738f83aeb59361a0a2eda2460113f6dc919427The 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] ); 51855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 51865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) 51875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) == 0) && 51895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (btm_cb.pairing_state == BTM_PAIR_STATE_WAIT_AUTH_COMPLETE) ) 51905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fake this out - porshe carkit issue - */ 51925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project// btm_cb.pairing_state = BTM_PAIR_STATE_IDLE; 51935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(! btm_cb.pin_code_len_saved) 51945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 51955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 51965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 51975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 51985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 51995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); 5201818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde return; 52025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_PIN_REQ) 52055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || memcmp (p_bda, btm_cb.pairing_bda, BD_ADDR_LEN) != 0) 52065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52075344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING ("btm_sec_pin_code_request() rejected - state: %s", 52085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_pair_state_descr(btm_cb.pairing_state)); 52095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 52115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reply pin code again due to counter in_rand when local initiates pairing */ 52125344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request from remote dev. for local initiated pairing"); 52135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(! btm_cb.pin_code_len_saved) 52145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 521557bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 521657bda5037c0798c85388428a6d3a7771e1cc8034Shobek Sam Attupurath btsnd_hcic_pin_code_req_reply (p_bda, default_pin_code_len, default_pin_code); 52175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 52195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 52215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len_saved, p_cb->pin_code); 52225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 52245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 52255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 52265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (p_bda); 52315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* received PIN code request. must be non-sm4 */ 52325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sm4 = BTM_SM4_KNOWN; 52335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pairing_state == BTM_PAIR_STATE_IDLE) 52355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (btm_cb.pairing_bda, p_bda, BD_ADDR_LEN); 52375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = BTM_PAIR_FLAGS_PEER_STARTED_DD; 52395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure we reset the trusted mask to help against attacks */ 52405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_CLR_TRUSTED_DEVICE(p_dev_rec->trusted_mask); 52415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) 52445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52455344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request fixed pin replying"); 52465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 52475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); 52485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 52495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use the connecting device's CoD for the connection */ 52525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (!memcmp (p_bda, p_cb->connecting_bda, BD_ADDR_LEN)) 52535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_cb->connecting_dc[0] || p_cb->connecting_dc[1] || p_cb->connecting_dc[2]) ) 52545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_dev_rec->dev_class, p_cb->connecting_dc, DEV_CLASS_LEN); 52555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We could have started connection after asking user for the PIN code */ 52575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len != 0) 52585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52595344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request bonding sending reply"); 52605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_req_reply (p_bda, btm_cb.pin_code_len, p_cb->pin_code); 52615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef PORCHE_PAIRING_CONFLICT 52635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = btm_cb.pin_code_len; 52645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 52655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark that we forwarded received from the user PIN code */ 52675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 52685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We can change mode back right away, that other connection being established */ 52705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is not forced to be secure - found a FW issue, so we can not do this 52715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); */ 52725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); 52745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If pairing disabled OR (no PIN callback and not bonding) */ 52775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR we could not allocate entry in the database reject pairing request */ 52785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_cb->pairing_disabled 52795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_cb->api.p_pin_callback == NULL) 52805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* OR Microsoft keyboard can for some reason try to establish connection */ 52825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* the only thing we can do here is to shut it up. Normally we will be originator */ 52835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* for keyboard bonding */ 52845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator 52855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK) == BTM_COD_MAJOR_PERIPHERAL) 52865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->dev_class[2] & BTM_COD_MINOR_KEYBOARD)) ) 52875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_WARNING("btm_sec_pin_code_request(): Pairing disabled:%d; PIN callback:%x, Dev Rec:%x!", 52895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->pairing_disabled, p_cb->api.p_pin_callback, p_dev_rec); 52905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_pin_code_neg_reply (p_bda); 52925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 52935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Notify upper layer of PIN request and start expiration timer */ 52945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 52955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 52965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len_saved = 0; 52975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 52985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Pin code request can not come at the same time as connection request */ 52995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_bda, p_bda, BD_ADDR_LEN); 53005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); 53015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the name is known */ 53035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Even if name is not known we might not be able to get one */ 53045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this is the case when we are already getting something from the */ 53055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* device, so HCI level is flow controlled */ 53065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Also cannot send remote name request while paging, i.e. connection is not completed */ 53075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 53085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53095344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for callback"); 53105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 5312818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if (p_cb->api.p_pin_callback) { 5313818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, 5314818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (p_dev_rec->p_cur_service == NULL) ? FALSE 5315818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags 5316818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 5317818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 53185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 53205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_pin_code_request going for remote name"); 53225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* We received PIN code request for the device with unknown name */ 53245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* it is not user friendly just to ask for the PIN without name */ 53255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* try to get name at first */ 53265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_rmt_name_req (p_dev_rec->bd_addr, 53275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_PAGE_SCAN_REP_MODE_R1, 53285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_MANDATARY_PAGE_SCAN_MODE, 0)) 53295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 53305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_NAME_KNOWN; 53315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[0] = 'f'; 53325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name[1] = '0'; 53335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_ERROR ("can not send rmt_name_req?? fake a name and call callback"); 53345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 53365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->api.p_pin_callback) 5337818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (*p_cb->api.p_pin_callback) (p_bda, p_dev_rec->dev_class, 5338818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE 5339818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags 5340818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 53415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 53445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 53465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 53495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_update_clock_offset 53515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to update clock offset 53535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 53555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 53575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_update_clock_offset (UINT16 handle, UINT16 clock_offset) 53585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 53595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 53605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_INQ_INFO *p_inq_info; 53615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev_by_handle (handle)) == NULL) 53635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 53645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 53665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_inq_info = BTM_InqDbRead(p_dev_rec->bd_addr)) == NULL) 53685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 53695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inq_info->results.clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 53715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 53725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************** 53755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** S T A T I C F U N C T I O N S 53765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************/ 53775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 53795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_execute_procedure 53815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start required security 53835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** procedure. There is a case when multiplexing protocol 53845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calls this function on the originating side, connection to 53855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the peer will not be established. This function in this 53865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** case performs only authorization. 53875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BTM_SUCCESS - permission is granted 53895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_CMD_STARTED - in process 53905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** BTM_NO_RESOURCES - permission declined 53915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 53925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 53935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_sec_execute_procedure (tBTM_SEC_DEV_REC *p_dev_rec) 53945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 53955344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("btm_sec_execute_procedure: Required:0x%x Flags:0x%x State:%d", 53965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required, p_dev_rec->sec_flags, p_dev_rec->sec_state); 53975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 53985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is a chance that we are getting name. Wait until done. */ 53995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->sec_state != 0) 54005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If any security is required, get the name first */ 54035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 54045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 54055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54065344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start get name"); 54075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_get_name (p_dev_rec)) 54085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 54105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authenticated and authentication is required */ 54155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authentication and return PENDING to the caller */ 5416818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if ((((!(p_dev_rec->sec_flags & BTM_SEC_AUTHENTICATED)) 54175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHENTICATE)) 5418818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHENTICATE)))) 5419818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde || (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) 5420818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (!p_dev_rec->is_originator 5421818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (p_dev_rec->security_required & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) 54225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 54235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5424818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde /* 5425818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * We rely on BTM_SEC_16_DIGIT_PIN_AUTHED being set if MITM is in use, 5426818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * as 16 DIGIT is only needed if MITM is not used. Unfortunately, the 5427818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * BTM_SEC_AUTHENTICATED is used for both MITM and non-MITM 5428818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * authenticated connections, hence we cannot distinguish here. 5429818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde */ 5430818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 54315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 54325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 54335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 54345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 54355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 54365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54375344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authentication"); 54385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5439818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde /* 5440818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * If we do have a link-key, but we end up here because we need an 5441818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * upgrade, then clear the link-key known and authenticated flag before 5442818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * restarting authentication. 5443818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * WARNING: If the controller has link-key, it is optional and 5444818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * recommended for the controller to send a Link_Key_Request. 5445818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * In case we need an upgrade, the only alternative would be to delete 5446818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * the existing link-key. That could lead to very bad user experience 5447818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * or even IOP issues, if a reconnect causes a new connection that 5448818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde * requires an upgrade. 5449818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde */ 5450818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde if ((p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN) 5451818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (!(p_dev_rec->sec_flags & BTM_SEC_16_DIGIT_PIN_AUTHED) 5452818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde && (!p_dev_rec->is_originator && (p_dev_rec->security_required 5453818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)))) { 5454818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_flags &= ~(BTM_SEC_LINK_KEY_KNOWN | BTM_SEC_LINK_KEY_AUTHED 5455818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde | BTM_SEC_AUTHENTICATED); 5456818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde } 5457818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde 54585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_authentication (p_dev_rec)) 54595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 54615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not encrypted and encryption is required */ 54665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start encryption and return PENDING to the caller */ 54675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_ENCRYPTED) 54685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_ENCRYPT)) 54695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_ENCRYPT))) 54705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->hci_handle != BTM_SEC_INVALID_HANDLE)) 54715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 54735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if incoming UCD packet, discard it */ 54745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( !p_dev_rec->is_originator && (p_dev_rec->is_ucd == TRUE )) 54755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_FAILED_ON_SECURITY); 54765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 54775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54785344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start encryption"); 54795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 54805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_sec_start_encryption (p_dev_rec)) 54815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 54825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_NO_RESOURCES); 54835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 54855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 54865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5487899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((p_dev_rec->security_required & BTM_SEC_MODE4_LEVEL4) && 5488899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 5489899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 5490899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Security Manager: SC only service, but link key type is 0x%02x -", 5491899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth "security failure", __FUNCTION__, p_dev_rec->link_key_type); 5492899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return (BTM_FAILED_ON_SECURITY); 5493899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 5494899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 54955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If connection is not authorized and authorization is required */ 54965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start authorization and return PENDING to the caller */ 54975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!(p_dev_rec->sec_flags & BTM_SEC_AUTHORIZED) 54985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_OUT_AUTHORIZE)) 54995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!p_dev_rec->is_originator && (p_dev_rec->security_required & BTM_SEC_IN_AUTHORIZE)))) 55005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("service id:%d, is trusted:%d", 55025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id, 55035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 55045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id))); 55055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_sec_are_all_trusted(p_dev_rec->trusted_mask) == FALSE) && 55065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_dev_rec->p_cur_service->service_id < BTM_SEC_MAX_SERVICES) && 55075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (BTM_SEC_IS_SERVICE_TRUSTED(p_dev_rec->trusted_mask, 55085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_cur_service->service_id) == FALSE)) 55095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55105344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: Start authorization"); 55115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_sec_start_authorization (p_dev_rec)); 55125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* All required security procedures already established */ 55165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->security_required &= ~(BTM_SEC_OUT_AUTHORIZE | BTM_SEC_IN_AUTHORIZE | 55175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_IN_AUTHENTICATE | 55185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_OUT_ENCRYPT | BTM_SEC_IN_ENCRYPT | 55195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_MASTER | BTM_SEC_ATTEMPT_MASTER | 55205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SEC_FORCE_SLAVE | BTM_SEC_ATTEMPT_SLAVE); 55215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: trusted:0x%04x%04x", p_dev_rec->trusted_mask[1], p_dev_rec->trusted_mask[0]); 55235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_EVENT ("Security Manager: access granted"); 55245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_SUCCESS); 55265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_get_name 55325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start get name procedure 55345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_get_name (tBTM_SEC_DEV_REC *p_dev_rec) 55395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 tempstate = p_dev_rec->sec_state; 55415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_GETTING_NAME; 55435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Device should be connected, no need to provide correct page params */ 55455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* 0 and NULL are as timeout and callback params because they are not used in security get name case */ 55465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btm_initiate_rem_name (p_dev_rec->bd_addr, NULL, BTM_RMT_NAME_SEC, 55475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, NULL)) != BTM_CMD_STARTED) 55485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 55495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = tempstate; 55505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 55515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 55525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 55545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authentication 55595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authentication 55615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_authentication (tBTM_SEC_DEV_REC *p_dev_rec) 55665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_AUTHENTICATING; 55685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btsnd_hcic_auth_request (p_dev_rec->hci_handle)); 55705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_encryption 55755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start encryption 55775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 55815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_start_encryption (tBTM_SEC_DEV_REC *p_dev_rec) 55825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 55835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_set_conn_encrypt (p_dev_rec->hci_handle, TRUE)) 55845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 55855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_ENCRYPTING; 55875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 55885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 55895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 55915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 55925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_start_authorization 55945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start authorization 55965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if started 55985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 55995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_sec_start_authorization (tBTM_SEC_DEV_REC *p_dev_rec) 56015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result; 56035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_service_name = NULL; 56045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 service_id; 56055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_NAME_KNOWN) 56075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_dev_rec->hci_handle == BTM_SEC_INVALID_HANDLE)) 56085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btm_cb.api.p_authorize_callback) 56105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_MODE_UNSUPPORTED); 56115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_cur_service) 56135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_SEC_SERVICE_NAME_LEN > 0 56155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->is_originator) 56165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->orig_service_name; 56175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 56185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name = p_dev_rec->p_cur_service->term_service_name; 56195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 56205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = p_dev_rec->p_cur_service->service_id; 56215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 56235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id = 0; 56245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send authorization request if not already sent during this service connection */ 5626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec->last_author_service_id == BTM_SEC_NO_LAST_SERVICE_ID 5627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || p_dev_rec->last_author_service_id != service_id) 5628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 5629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->sec_state = BTM_SEC_STATE_AUTHORIZING; 5630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta result = (*btm_cb.api.p_authorize_callback) (p_dev_rec->bd_addr, 56315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->dev_class, 56325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, 56335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_service_name, 56345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project service_id, 56355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->is_originator); 5636ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5638ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else /* Already authorized once for this L2CAP bringup */ 5639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 56405344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("btm_sec_start_authorization: (Ignoring extra Authorization prompt for service %d)", service_id); 5641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BTM_SUCCESS); 5642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5643ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 56445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == BTM_SUCCESS) 56455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_flags |= BTM_SEC_AUTHORIZED; 5647ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5648ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Save the currently authorized service in case we are asked again by another multiplexer layer */ 5649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_dev_rec->is_originator) 5650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dev_rec->last_author_service_id = service_id; 5651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 56525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_state = BTM_SEC_STATE_IDLE; 56535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(result); 56555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_start_get_name (p_dev_rec); 56575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(BTM_CMD_STARTED); 56585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_are_all_trusted 56635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called check if all services are trusted 56655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if all are trusted, otherwise FALSE 56675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_are_all_trusted(UINT32 p_mask[]) 56705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5671ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT32 trusted_inx; 56725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (trusted_inx = 0; trusted_inx < BTM_SEC_SERVICE_ARRAY_SIZE; trusted_inx++) 56735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_mask[trusted_inx] != BTM_SEC_TRUST_ALL) 56755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 56765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 56775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 56795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 56805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 56825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_first_serv 56845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the first record in the service database 56865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 56875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 56895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 56905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 56915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_first_serv (CONNECTION_TYPE conn_type, UINT16 psm) 56925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 56935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 56945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 56955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_originator; 56965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (L2CAP_UCD_INCLUDED == TRUE) 56985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( conn_type & CONNECTION_TYPE_ORIG_MASK ) 57005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = TRUE; 57015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 57025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = FALSE; 57035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 57045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_originator = conn_type; 57055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 57065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && btm_cb.p_out_serv && btm_cb.p_out_serv->psm == psm) 57085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the PSM matches p_out_serv, 57105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 57115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 57125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, just find the first record with the specified PSM */ 57155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 57165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_serv_rec->security_flags & BTM_SEC_IN_USE) && (p_serv_rec->psm == psm) ) 57185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 57195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 57215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_next_serv 57275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the next record in the service database 57295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with specified PSM 57305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 57325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_next_serv (tBTM_SEC_SERV_REC *p_cur) 57355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 57375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 57385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 57405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 57425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == p_cur->psm) ) 57435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cur != p_serv_rec) 57455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 57475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 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_find_mx_serv 57575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the service database with specified 57595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** PSM and multiplexor channel information 57605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 57625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 57645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_SEC_SERV_REC *btm_sec_find_mx_serv (UINT8 is_originator, UINT16 psm, 57655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id) 57665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 57675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_out_serv = btm_cb.p_out_serv; 57685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_SERV_REC *p_serv_rec = &btm_cb.sec_serv_rec[0]; 57695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 57705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5771444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s()", __func__); 57725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_originator && p_out_serv && p_out_serv->psm == psm 57735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->mx_proto_id == mx_proto_id 57745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && p_out_serv->orig_mx_chan_id == mx_chan_id) 57755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If this is outgoing connection and the parameters match p_out_serv, 57775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * use it as the current service */ 57785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btm_cb.p_out_serv; 57795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* otherwise, the old way */ 57825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < BTM_SEC_MAX_SERVICE_RECORDS; i++, p_serv_rec++) 57835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_serv_rec->security_flags & BTM_SEC_IN_USE) 57855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->psm == psm) 57865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_serv_rec->mx_proto_id == mx_proto_id) 57875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (( is_originator && (p_serv_rec->orig_mx_chan_id == mx_chan_id)) 57885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (!is_originator && (p_serv_rec->term_mx_chan_id == mx_chan_id)))) 57895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 57905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_serv_rec); 57915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 57935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 57945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 57955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 57975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 57985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 57995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_collision_timeout 58005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Encryption could not start because of the collision 58025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** try to do it again 58035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the TLE struct 58055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_collision_timeout (TIMER_LIST_ENT *p_tle) 58085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58095cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_tle); 58105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s()", __func__); 58125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.sec_collision_tle.param = 0; 58135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_STATUS status = btm_sec_execute_procedure (btm_cb.p_collided_dev_rec); 58155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If result is pending reply from the user or from the device is pending */ 58175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != BTM_CMD_STARTED) 58185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There is no next procedure or start of procedure failed, notify the waiting layer */ 58207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_sec_dev_rec_cback_event (btm_cb.p_collided_dev_rec, status, FALSE); 58215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_link_key_request 58275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when controller requests link key 58295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 58315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_send_link_key_notif (tBTM_SEC_DEV_REC *p_dev_rec) 58345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_link_key_callback) 58365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*btm_cb.api.p_link_key_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 58375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->sec_bd_name, p_dev_rec->link_key, 58385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->link_key_type); 58395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function BTM_ReadTrustedMask 58445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get trusted mask for the peer device 58465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: bd_addr - Address of the device 58485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns NULL, if the device record is not found. 58505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** otherwise, the trusted mask 58515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 * BTM_ReadTrustedMask (BD_ADDR bd_addr) 58545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (bd_addr); 5856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec != NULL) 58575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec->trusted_mask); 5858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return NULL; 58595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_restore_mode 58645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the security mode to previous setting 58665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** if it was changed during bonding. 58675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 58705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_restore_mode(void) 58735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 58745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed) 58755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = FALSE; 5877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s() Auth enable -> %d", __func__, (btm_cb.security_mode == BTM_SEC_MODE_LINK)); 58785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable ((UINT8)(btm_cb.security_mode == BTM_SEC_MODE_LINK)); 58795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_type_changed) 58825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 58835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_type_changed = FALSE; 58845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_pin_type (btm_cb.cfg.pin_type); 58855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 58865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 58875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 58895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 58905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_dev_by_sec_state 58925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Look for the record in the device database for the device 58945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** which is being authenticated or encrypted 58955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Pointer to the record or NULL 58975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 58985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 58995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_SEC_DEV_REC *btm_sec_find_dev_by_sec_state (UINT8 state) 59005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0]; 59025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 59045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec->sec_flags & BTM_SEC_IN_USE) 59065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_dev_rec->sec_state == state)) 59075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(p_dev_rec); 59085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(NULL); 59105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_change_pairing_state 59155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to change pairing state 59175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_sec_change_pairing_state (tBTM_PAIRING_STATE new_state) 59205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PAIRING_STATE old_state = btm_cb.pairing_state; 59225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() Old: %s", __func__, btm_pair_state_descr(btm_cb.pairing_state)); 5924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() New: %s pairing_flags:0x%x", __func__, 5925444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_pair_state_descr(new_state), btm_cb.pairing_flags); 59265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_state = new_state; 59285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_state == BTM_PAIR_STATE_IDLE) 59305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer (&btm_cb.pairing_tle); 59325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags = 0; 59345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pin_code_len = 0; 59355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure the the lcb shows we are not bonding */ 59375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, FALSE); 59385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_restore_mode(); 59405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 59415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_inq_clear_ssp(); 59425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (btm_cb.pairing_bda, 0xFF, BD_ADDR_LEN); 59445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 59465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If transitionng out of idle, mark the lcb as bonding */ 59485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (old_state == BTM_PAIR_STATE_IDLE) 59495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_update_lcb_4_bonding (btm_cb.pairing_bda, TRUE); 59505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_tle.param = (TIMER_PARAM_TYPE)btm_sec_pairing_timeout; 59525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&btm_cb.pairing_tle, BTU_TTYPE_USER_FUNC, BTM_SEC_TIMEOUT_VALUE); 59545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_pair_state_descr 59615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 59635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 59655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_USE_TRACES == TRUE) 59665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic char *btm_pair_state_descr (tBTM_PAIRING_STATE state) 59675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 59685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 59695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 59705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 59715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_IDLE: return("IDLE"); 59725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_GET_REM_NAME: return("GET_REM_NAME"); 59735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_PIN_REQ: return("WAIT_PIN_REQ"); 59745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_PIN: return("WAIT_LOCAL_PIN"); 59755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: return("WAIT_NUM_CONFIRM"); 59765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_KEY_ENTRY: return("KEY_ENTRY"); 59775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: return("WAIT_LOCAL_OOB_RSP"); 59785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS: return("WAIT_LOCAL_IOCAPS"); 59795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_INCOMING_SSP: return("INCOMING_SSP"); 59805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: return("WAIT_AUTH_COMPLETE"); 59815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PAIR_STATE_WAIT_DISCONNECT: return("WAIT_DISCONNECT"); 59825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 59835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return("???"); 59855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 5986104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer sprintf(btm_cb.state_temp_buffer,"%hhu",state); 59875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(btm_cb.state_temp_buffer); 59895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 59905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 59915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 59925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 59945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_dev_rec_cback_event 59965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 59975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function calls the callback function with the given 59985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** result and clear the callback function. 59995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: void 60015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 600332429188798b1f34fcf2cc609fd70ed85f20264bAndre Eisenbachvoid btm_sec_dev_rec_cback_event (tBTM_SEC_DEV_REC *p_dev_rec, UINT8 res, BOOLEAN is_le_transport) 60045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 60055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback = p_dev_rec->p_callback; 60065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->p_callback) 60085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->p_callback = NULL; 6010e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 60111287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE 6012e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (is_le_transport) 6013e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*p_callback) (p_dev_rec->ble.pseudo_addr, BT_TRANSPORT_LE, p_dev_rec->p_ref_data, res); 6014e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 60151287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif 6016e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun (*p_callback) (p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR, p_dev_rec->p_ref_data, res); 60175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 60195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_check_pending_reqs(); 60205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 60235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_queue_mx_request 60255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Return state description for tracing 60275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 60285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 60295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_queue_mx_request (BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_orig, 60305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 mx_proto_id, UINT32 mx_chan_id, 60315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 60325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf (sizeof(tBTM_SEC_QUEUE_ENTRY)); 60345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_e) 60365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->psm = psm; 60385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->is_orig = is_orig; 60395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_callback = p_callback; 60405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->p_ref_data = p_ref_data; 60415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_proto_id = mx_proto_id; 60425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_e->mx_chan_id = mx_chan_id; 6043444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->transport = BT_TRANSPORT_BR_EDR; 60445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy (p_e->bd_addr, bd_addr, BD_ADDR_LEN); 60465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() PSM: 0x%04x Is_Orig: %u mx_proto_id: %u mx_chan_id: %u", 6048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, psm, is_orig, mx_proto_id, mx_chan_id); 60495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enqueue (&btm_cb.sec_pending_q, p_e); 60515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 60535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 60565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 60575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btm_sec_check_prefetch_pin (tBTM_SEC_DEV_REC *p_dev_rec) 60595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 60605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 major = (UINT8)(p_dev_rec->dev_class[1] & BTM_COD_MAJOR_CLASS_MASK); 60615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 minor = (UINT8)(p_dev_rec->dev_class[2] & BTM_COD_MINOR_CLASS_MASK); 60625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN rv = FALSE; 60635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((major == BTM_COD_MAJOR_AUDIO) 60655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((minor == BTM_COD_MINOR_CONFM_HANDSFREE) || (minor == BTM_COD_MINOR_CAR_AUDIO)) ) 60665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_EVENT ("%s() Skipping pre-fetch PIN for carkit COD Major: 0x%02x Minor: 0x%02x", 6068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, major, minor); 60695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.security_mode_changed == FALSE) 60715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.security_mode_changed = TRUE; 60735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef APPL_AUTH_WRITE_EXCEPTION 60745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(APPL_AUTH_WRITE_EXCEPTION)(p_dev_rec->bd_addr)) 60755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 60765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_write_auth_enable (TRUE); 60775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 60805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_change_pairing_state (BTM_PAIR_STATE_WAIT_LOCAL_PIN); 60825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we got a PIN, use that, else try to get one */ 60845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.pin_code_len) 60855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60865738f83aeb59361a0a2eda2460113f6dc919427The 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); 60875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 60885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 60895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 60905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* pin was not supplied - pre-fetch pin code now */ 60915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btm_cb.api.p_pin_callback && ((btm_cb.pairing_flags & BTM_PAIR_FLAGS_PIN_REQD) == 0)) 60925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG("%s() PIN code callback called", __func__); 60947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR) == NULL) 60955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_cb.pairing_flags |= BTM_PAIR_FLAGS_PIN_REQD; 6096818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde (btm_cb.api.p_pin_callback) (p_dev_rec->bd_addr, p_dev_rec->dev_class, 6097818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde p_dev_rec->sec_bd_name, (p_dev_rec->p_cur_service == NULL) ? FALSE 6098818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde : (p_dev_rec->p_cur_service->security_flags 6099818d0f2afb10c75125b0df9ea2bce6108268a269Casper Bonde & BTM_SEC_IN_MIN_16_DIGIT_PIN)); 61005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 61015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 61025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 61035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rv = TRUE; 61045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 61055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 61065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return rv; 61075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 61085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_auth_payload_tout 6112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description Processes the HCI Autheniticated Payload Timeout Event 6114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** indicating that a packet containing a valid MIC on the 6115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** connection handle was not received within the programmed 6116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** timeout value. (Spec Default is 30 secs, but can be 6117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** changed via the BTM_SecSetAuthPayloadTimeout() function. 6118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid btm_sec_auth_payload_tout (UINT8 *p, UINT16 hci_evt_len) 6121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 handle; 6123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16 (handle, p); 6125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji handle = HCID_GET_HANDLE (handle); 6126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Will be exposed to upper layers in the future if/when determined necessary */ 6128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_ERROR ("%s on handle 0x%02x", __func__, handle); 6129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_queue_encrypt_request 6134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description encqueue encryption request when device has active security 6136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** process pending. 6137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_queue_encrypt_request (BD_ADDR bd_addr, tBT_TRANSPORT transport, 6140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_CALLBACK *p_callback, void *p_ref_data) 6141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e; 6143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getbuf(sizeof(tBTM_SEC_QUEUE_ENTRY) + 1); 6144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_e) 6146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->psm = 0; /* if PSM 0, encryption request */ 6148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->p_callback = p_callback; 6149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->p_ref_data = (void *)(p_e + 1); 6150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji *(UINT8 *)p_e->p_ref_data = *(UINT8 *)(p_ref_data); 6151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e->transport = transport; 6152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_e->bd_addr, bd_addr, BD_ADDR_LEN); 6153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji GKI_enqueue(&btm_cb.sec_pending_q, p_e); 6154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 6155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6162899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_set_peer_sec_caps 6163899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6164899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to set sm4 and rmt_sec_caps fields 6165899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** based on the available peer device features. 6166899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6167899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns void 6168899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6169899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6170899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthvoid btm_sec_set_peer_sec_caps(tACL_CONN *p_acl_cb, tBTM_SEC_DEV_REC *p_dev_rec) 6171899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6172899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BD_ADDR rem_bd_addr; 6173899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth UINT8 *p_rem_bd_addr; 6174899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6175899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if ((btm_cb.security_mode == BTM_SEC_MODE_SP || 6176899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SP_DEBUG || 6177899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_cb.security_mode == BTM_SEC_MODE_SC) && 6178899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth HCI_SSP_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])) 6179899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6180899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 = BTM_SM4_TRUE; 6181899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections = 6182899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth (HCI_SC_HOST_SUPPORTED(p_acl_cb->peer_lmp_features[HCI_EXT_FEATURES_PAGE_1])); 6183899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6184899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth else 6185899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6186899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4 = BTM_SM4_KNOWN; 6187899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_supports_secure_connections = FALSE; 6188899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6189899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6190899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_API("%s: sm4: 0x%02x, rmt_support_for_secure_connections %d", __FUNCTION__, 6191899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->sm4, p_dev_rec->remote_supports_secure_connections); 6192899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6193899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6194899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (p_dev_rec->remote_features_needed) 6195899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6196899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_EVENT("%s: Now device in SC Only mode, waiting for peer remote features!", 6197899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth __FUNCTION__); 6198899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_rem_bd_addr = (UINT8*) rem_bd_addr; 6199899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BDADDR_TO_STREAM(p_rem_bd_addr, p_dev_rec->bd_addr); 6200899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_rem_bd_addr = (UINT8*) rem_bd_addr; 6201899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth btm_io_capabilities_req(p_rem_bd_addr); 6202899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth p_dev_rec->remote_features_needed = FALSE; 6203899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6204899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6205899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6206899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6207899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6208444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_clean_pending_req_queue 6209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function cleans up the pending security request when the 6211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** link to the target device dropped. 6212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 6214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_clean_pending_req_queue (BD_ADDR remote_bda, tBT_TRANSPORT transport) 6217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e; 6219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BUFFER_Q *bq = &btm_cb.sec_pending_q; 6220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq); 6222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_e != NULL) 6224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (memcmp(p_e->bd_addr, remote_bda, BD_ADDR_LEN) == 0 6226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji && p_e->transport == transport 6228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*p_e->p_callback) (remote_bda, transport, p_e->p_ref_data, BTM_ERR_PROCESSING); 6232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji GKI_remove_from_queue(bq, (void *)p_e); 6233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e); 6235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6236899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6237899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6238899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6239899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6240899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_is_serv_level0 6241899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6242899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to check if the service corresponding 6243899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** to PSM is security mode 4 level 0 service. 6244899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6245899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns TRUE if the service is security mode 4 level 0 service 6246899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6247899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6248899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic BOOLEAN btm_sec_is_serv_level0(UINT16 psm) 6249899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6250899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth if (psm == BT_PSM_SDP) 6251899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth { 6252899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth BTM_TRACE_DEBUG("%s: PSM: 0x%04x -> mode 4 level 0 service", __FUNCTION__, psm); 6253899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return TRUE; 6254899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth } 6255899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return FALSE; 6256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_check_pending_enc_req 6261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to send pending encryption callback if 6263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** waiting 6264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 6266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void btm_sec_check_pending_enc_req (tBTM_SEC_DEV_REC *p_dev_rec, tBT_TRANSPORT transport, 6269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 encr_enable) 6270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_QUEUE_ENTRY *p_e; 6272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BUFFER_Q *bq = &btm_cb.sec_pending_q; 6273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 res = encr_enable ? BTM_SUCCESS : BTM_ERR_PROCESSING; 6274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *)GKI_getfirst(bq); 6276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji while (p_e != NULL) 6278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (memcmp(p_e->bd_addr, p_dev_rec->bd_addr, BD_ADDR_LEN) == 0 && p_e->psm == 0 6280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji && p_e->transport == transport 6282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 62851287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if BLE_INCLUDED == TRUE 62861287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach UINT8 sec_act = *(UINT8 *)(p_e->p_ref_data); 62871287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#endif 6288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (encr_enable == 0 || transport == BT_TRANSPORT_BR_EDR 6290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE 6291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji || (sec_act == BTM_BLE_SEC_ENCRYPT || sec_act == BTM_BLE_SEC_ENCRYPT_NO_MITM) 6292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji || (sec_act == BTM_BLE_SEC_ENCRYPT_MITM && p_dev_rec->sec_flags 6293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji & BTM_SEC_LE_AUTHENTICATED) 6294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 6295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ) 6296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 6297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (*p_e->p_callback) (p_dev_rec->bd_addr, transport, p_e->p_ref_data, res); 6298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji GKI_remove_from_queue(bq, (void *)p_e); 6299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_e = (tBTM_SEC_QUEUE_ENTRY *) GKI_getnext ((void *)p_e); 6302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 6303899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth} 6304899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6305899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth/******************************************************************************* 6306899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6307899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Function btm_sec_set_serv_level4_flags 6308899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6309899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Description This function is called to set security mode 4 level 4 flags. 6310899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6311899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** Returns service security requirements updated to include secure 6312899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** connections only mode. 6313899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth** 6314899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth*******************************************************************************/ 6315899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananthstatic UINT16 btm_sec_set_serv_level4_flags(UINT16 cur_security, BOOLEAN is_originator) 6316899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth{ 6317899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth UINT16 sec_level4_flags = is_originator ? BTM_SEC_OUT_LEVEL4_FLAGS : BTM_SEC_IN_LEVEL4_FLAGS; 6318899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth 6319899b77140675a157dba034e98527ab546bc9ac35Mudumba Ananth return cur_security | sec_level4_flags; 6320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 63225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 63235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_clear_ble_keys 63255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to clear out the BLE keys. 63275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Typically when devices are removed in BTM_SecDeleteDevice, 63285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or when a new BT Link key is generated. 63295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 63315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 63335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sec_clear_ble_keys (tBTM_SEC_DEV_REC *p_dev_rec) 63345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 63355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() Clearing BLE Keys", __func__); 63375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 6338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->ble.key_type = BTM_LE_KEY_NONE; 63395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset (&p_dev_rec->ble.keys, 0, sizeof(tBTM_SEC_BLE_KEYS)); 6340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (BLE_PRIVACY_SPT == TRUE) 6342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_resolving_list_remove_dev(p_dev_rec); 6343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 63445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 63455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 63465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 63485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_is_a_bonded_dev 63505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Is the specified device is a bonded device 63525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - dev is bonded 63545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 63555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 63565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_sec_is_a_bonded_dev (BD_ADDR bda) 63575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 63585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 63605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_bonded= FALSE; 63615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_dev_rec && 63631287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#if (SMP_INCLUDED == TRUE) 63647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta ((p_dev_rec->ble.key_type && (p_dev_rec->sec_flags & BTM_SEC_LE_LINK_KEY_KNOWN))|| 63651287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach#else 63661287166da9c34f041d54a78800b79cb2738675a9Andre Eisenbach ( 63677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 63687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN))) 63695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 63705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is_bonded = TRUE; 63715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6372444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() is_bonded=%d", __func__, is_bonded); 63735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(is_bonded); 63745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 63755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 63775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function btm_sec_is_le_capable_dev 6379ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6380ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Is the specified device is dual mode or LE only device 6381ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6382ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE - dev is a dual mode 6383ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 6384ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 6385ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN btm_sec_is_le_capable_dev (BD_ADDR bda) 6386ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 6387ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_SEC_DEV_REC *p_dev_rec= btm_find_dev (bda); 6388ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN le_capable = FALSE; 6389ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6390ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED== TRUE) 6391e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_dev_rec && (p_dev_rec->device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE) 6392ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta le_capable = TRUE; 6393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 6394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return le_capable; 6395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 6396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 6397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 6398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 63995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btm_sec_find_bonded_dev 64005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 64015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Find a bonded device starting from the specified index 64025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 64035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE - found a bonded device 64045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 64055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6406e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. ChenBOOLEAN btm_sec_find_bonded_dev (UINT8 start_idx, UINT8 *p_found_idx, tBTM_SEC_DEV_REC **p_rec) 64075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 64085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found= FALSE; 64095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 64105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_INCLUDED== TRUE) 64115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 64125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 64135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (start_idx >= BTM_SEC_MAX_DEVICE_RECORDS) 64145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 64155344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati BTM_TRACE_DEBUG ("LE bonded device not found"); 64165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return found; 64175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 64185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 64195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = &btm_cb.sec_dev_rec[start_idx]; 64205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = start_idx; i < BTM_SEC_MAX_DEVICE_RECORDS; i++, p_dev_rec++) 64215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 64225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_dev_rec->ble.key_type || (p_dev_rec->sec_flags & BTM_SEC_LINK_KEY_KNOWN)) 64235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 64245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_found_idx = i; 6425e68ffb0c2430f02c7e21ebbebdbf76a7e907350eMike J. Chen *p_rec = p_dev_rec; 64265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 64275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 64285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6429444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() found=%d", __func__, found); 64305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 64315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(found); 64325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_use_smp_br_chnl 6437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function checks if SMP BR connection can be used with 6439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the peer. 6440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Is called when authentication for dedicated bonding is 6441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** successfully completed. 6442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE - if SMP BR connection can be used (the link key is 6444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** generated from P-256 and the peer supports Security 6445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Manager over BR). 6446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_use_smp_br_chnl(tBTM_SEC_DEV_REC *p_dev_rec) 6449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT32 ext_feat; 6451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 chnl_mask[L2CAP_FIXED_CHNL_ARRAY_SIZE]; 6452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6453444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BTM_TRACE_DEBUG ("%s() link_key_type = 0x%x", __func__, 6454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_dev_rec->link_key_type); 6455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec->link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256) && 6457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (p_dev_rec->link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256)) 6458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!L2CA_GetPeerFeatures (p_dev_rec->bd_addr, &ext_feat, chnl_mask)) 6461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!(chnl_mask[0] & L2CAP_FIXED_CHNL_SMP_BR_BIT)) 6464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 6465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 6467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 6470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function btm_sec_is_master 6472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function checks if the device is BR/EDR master after 6474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** pairing is completed. 6475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns TRUE - if the device is master. 6477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 6478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 6479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN btm_sec_is_master(tBTM_SEC_DEV_REC *p_dev_rec) 6480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 6481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tACL_CONN *p= btm_bda_to_acl(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR); 6482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return (p && (p->link_role == BTM_ROLE_MASTER)); 6483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 6484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6485